Прогноз "a" на "b" с использованием Keras LSTM - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь создать модель, которая предсказывает данные "b" из данных "a".
Я обучил модель, но «loss_value» слишком велико и не очень хорошо уменьшается.

Вот пример данных

a = [81,61,192,71,66,433,378,449,484...] 
b = [2140,1782,1458,1228,1100,1015,768,1013,912,...]

И я использовал функцию «create_datasheet» для преобразования данных в значение массива 3D (value_count, time_stamp, factor) и вставьте значения в мою модель

[Пример вывода функции]

x , y = create_datasheet(a,b,2)

#x = [[81,61],[61,192],[192,71]...]
#y = [1458,1228,1100...]

[Вот мой код python]

def create_datasheet(x, y, look_back=1):
    tx, ty = [], []

    for i in range(len(x) - look_back):
        tx.append(x[i:(i+look_back)])
        ty.append(y[i+look_back])
    #end for

    tx = np.array(tx)
    tx = np.reshape(tx, (tx.shape[0], look_back, 1))
    ty = np.array(ty)
    return np.array(tx), np.array(ty)
#end def

#convert data to 3D value(value_count,time_stamp,factors)
x , y = create_datasheet(a,b,5)
train_x = x[:52]
train_y = y[:52]

#Declare My Module
K.clear_session()
model = Sequential()
model.add(LSTM(120,batch_input_shape=(1, 5, 1) ,stateful=True, return_sequences=True))
model.add(Dropout(0.5))
model.add(LSTM(120,batch_input_shape=(1, 5, 1) ,stateful=True))
model.add(Dropout(0.5))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(train_x,train_y,batch_size=1,epochs=1000)

[Запись поезда Керас]

Epoch 35/1000
52/52 [==============================] - 1s 12ms/step - loss: 3675721.6514
Epoch 36/1000
52/52 [==============================] - 1s 13ms/step - loss: 3675705.2692
Epoch 37/1000
52/52 [==============================] - 1s 15ms/step - loss: 3649188.8444
Epoch 38/1000
52/52 [==============================] - 1s 13ms/step - loss: 3653725.1148
Epoch 39/1000
52/52 [==============================] - 1s 13ms/step - loss: 3637119.4032
Epoch 40/1000
52/52 [==============================] - 1s 13ms/step - loss: 3623463.1532
Epoch 41/1000
52/52 [==============================] - 1s 12ms/step - loss: 3595661.7746
Epoch 42/1000
52/52 [==============================] - 1s 13ms/step - loss: 3577834.8954
Epoch 43/1000
52/52 [==============================] - 1s 13ms/step - loss: 3566596.0252
Epoch 44/1000

1 Ответ

0 голосов
/ 31 марта 2020

Вы должны нормализовать данные. Вы можете добиться этого, используя MinMaxScaler от sklearn

from sklearn.preprocessing import MinMaxScaler
import numpy as np

data = np.array([
             #a      b
            [81,  2140],
            [61,  1782],
            [192, 1458],
            [71,  1228],
            [66,  1100],
            [433, 1015],
            [378,  768],
            [449, 1013],
            [484,  912]
])

scaler = MinMaxScaler()
scaler.fit(data)
scaled = scaler.transform(data)
print(scaled)

Выход (norm_a, nor_b):

[[0.04728132 1.        ]
 [0.         0.73906706]
 [0.30969267 0.50291545]
 [0.02364066 0.33527697]
 [0.01182033 0.24198251]
 [0.87943262 0.18002915]
 [0.74940898 0.        ]
 [0.91725768 0.17857143]
 [1.         0.10495627]]
...