Важно отметить, что ваши данные о поездах и тестах обязательно будут находиться в отдельных частях оси X.
Например, предположим, что тренировочный набор состоит из 100 наблюдений и набора тестов. из 15 наблюдений. Набор тестов является последней частью временного ряда, который используется для прогнозирования модели (т. Е. Модель, построенная с использованием обучающего набора).
Рассмотрим пример использования LSTM для прогнозирования колебаний в * 1005. * еженедельные списки отелей .
Прогнозы обучения и проверки генерируются с использованием MinMaxScaler, чтобы позволить нейронной сети правильно интерпретировать данные. Из того, что я вижу, вы не выполнили этот шаг в своем примере. Вы должны сделать это, поскольку ваши результаты, скорее всего, будут ошибочными в противном случае - ваши данные не в общем масштабе, и поэтому модель LSTM не может интерпретировать их должным образом.
# Generate predictions
trainpred = model.predict(X_train)
valpred = model.predict(X_val)
In [30]:
trainpred
Out[30]:
array([[0.32363528],
[0.3715328 ],
[0.46051228],
[0.35137814],
[0.38220662],
[0.41239697],
[0.3573438 ],
[0.43657327],
[0.47494155],
[0.467317 ],
[0.49233937],
[0.49879026],
[0.39996487],
[0.38200712],
[0.3309482 ],
[0.21176702],
[0.22578238],
[0.18523258],
[0.23222469],
[0.26659006],
[0.2368085 ],
[0.22137557],
[0.28356454],
[0.16753006],
[0.16966385],
[0.22060908],
[0.1916717 ],
[0.2181809 ],
[0.21772115],
[0.24777801],
[0.3288507 ],
[0.30944437],
[0.33784014],
[0.37927932],
[0.31557906],
[0.43595707],
[0.3505273 ],
[0.4064384 ],
[0.48314226],
[0.41506904],
[0.48799258],
[0.4533432 ],
[0.45297146],
[0.46697432],
[0.41320056],
[0.45331544],
[0.48461175],
[0.50513804],
[0.50340337],
[0.44235045],
[0.48495632],
[0.32804203],
[0.38383847],
[0.3502031 ],
[0.34179717],
[0.37928385],
[0.3852548 ],
[0.3978842 ],
[0.41324353],
[0.42388642],
[0.43424374],
[0.4359951 ],
[0.49112016],
[0.49098223],
[0.50581044],
[0.5686604 ],
[0.48814237],
[0.5679423 ],
[0.519874 ],
[0.42899352],
[0.4314267 ],
[0.3878218 ],
[0.3585053 ],
[0.31897143]], dtype=float32)
In [31]:
valpred
Out[31]:
array([[0.374565 ],
[0.311441 ],
[0.37602562],
[0.36187553],
[0.35613692],
[0.399751 ],
[0.40736055],
[0.41798282],
[0.36257237],
[0.4636013 ],
[0.47177172],
[0.45880812],
[0.5725181 ],
[0.5696718 ]], dtype=float32)
Прогнозы возвращаются к нормальным значения:
# Convert predictions back to normal values
trainpred = scaler.inverse_transform(trainpred)
Y_train = scaler.inverse_transform([Y_train])
valpred = scaler.inverse_transform(valpred)
Y_val = scaler.inverse_transform([Y_val])
predictions = valpred
Затем составляются прогнозы:
In [34]:
# Train predictions
trainpredPlot = np.empty_like(df)
trainpredPlot[:, :] = np.nan
trainpredPlot[previous:len(trainpred)+previous, :] = trainpred
In [35]:
# Validation predictions
valpredPlot = np.empty_like(df)
valpredPlot[:, :] = np.nan
valpredPlot[len(trainpred)+(previous*2)+1:len(df)-1, :] = valpred
In [36]:
# Plot all predictions
inversetransform, =plt.plot(scaler.inverse_transform(df))
trainpred, =plt.plot(trainpredPlot)
valpred, =plt.plot(valpredPlot)
plt.xlabel('Number of weeks')
plt.ylabel('Cancellations')
plt.title("Predicted vs. Actual Cancellations Per Week")
plt.show()
График теперь отображается следующим образом:
В двух кратких итогах:
Убедитесь, что при построении реальных данных прогнозы обучения и теста не перекрываются. Это ошибочно, так как прогнозы обучения и теста относятся к двум различным наборам прогнозов.
Масштабируйте свои данные перед подачей в LSTM - иначе нейронная сеть не будет знать, как интерпретировать такие данные и любые результаты будут очень поверхностными.