Проблемы с формой при прогнозировании с Keras2 тестовых и обучающих данных с моделью LSTM - PullRequest
0 голосов
/ 23 января 2020

Проблема:
Когда я запускаю model.predict() на test_X и train_X, я получаю несоответствие формы, когда пытаюсь научиться прогнозировать 1 шаг в будущее, используя n величин TimeSteps для просмотра назад.

Что я использую:
Windows10, Python3 .8, Keras 2.3.1, внутри conda venv

Я пытался :
Создан обучающий набор под наблюдением из данных Обучения и испытаний с использованием примеров из https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/. Я попробовал много примеров отсюда и MachineLearningMastery и закончил этим последним. https://www.pytorials.com/predict-cryptocurrency-price-using-lstm/. Я думаю, что, возможно, прочитал правильный ответ где-то за последние 2 дня, но теперь так забито информацией, не совсем уверенный, что дальше.

# define model 
model = Sequential() 
model.add(LSTM(50, activation= 'relu' , input_shape=(train_X.shape[1], train_X.shape[2]))) 
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
callback = [EarlyStopping(monitor="loss", min_delta = 0.00001, patience = 20, mode = 'auto', restore_best_weights=True)]

# fit model
history = model.fit(train_X, train_y, epochs=100, validation_data=(test_X, test_y), verbose=1, 
                    batch_size=16, shuffle=False, callbacks=callback)

Графики показывают, что потеря и val_loss сходятся хорошо и ничего необычного.

Вот формы моих данных незадолго до предсказания.

print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)
(25607, 60, 3) (25607,) (6360, 60, 3) (6360,)
# make predictions
trainPredict = model.predict(train_X)
testPredict = model.predict(test_X)
# invert predictions
trainPredict = scaler.inverse_transform(trainPredict)
trainY = scaler.inverse_transform(train_y)
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform(test_y)
# calculate root mean squared error
trainScore = math.sqrt(mean_squared_error(train_y[:,0], trainPredict[:,0]))
print('Train Score: %.2f RMSE' % (trainScore))
testScore = math.sqrt(mean_squared_error(test_y[:,0], testPredict[:,0]))
print('Test Score: %.2f RMSE' % (testScore))

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-128-11d08dc2a08f> in <module>
      3 testPredict = model.predict(test_X)
      4 # invert predictions
----> 5 trainPredict = scaler.inverse_transform(trainPredict)
      6 trainY = scaler.inverse_transform(train_y)
      7 testPredict = scaler.inverse_transform(testPredict)

c:\users\user\miniconda3\lib\site-packages\sklearn\preprocessing\_data.py in inverse_transform(self, X)
    434                         force_all_finite="allow-nan")
    435 
--> 436         X -= self.min_
    437         X /= self.scale_
    438         return X

ValueError: non-broadcastable output operand with shape (25607,1) doesn't match the broadcast shape (25607,4)

PS: откуда взялась четверка, как не одна из моих формы имеют это.

Заранее благодарим за любую помощь или руководство.

РЕДАКТИРОВАТЬ Также попытался изменить предикторы следующим образом, но с той же ошибкой:

trainPredict = scaler.inverse_transform(trainPredict.reshape(-1,1))
trainY = scaler.inverse_transform(train_y)
testPredict = scaler.inverse_transform(testPredict.reshape(-1,1))
testY = scaler.inverse_transform(test_y)
...