Прогнозирование временных рядов с помощью рекуррентных нейронных сетей
Download 0.94 Mb.
|
NПрогнозирование временных рядов с помощью рекуррентных нейронных сетей
- Bu sahifa navigatsiya:
- Интервальное прогнозирование
Выполнение точечного прогноза
Теперь, когда модель обучена, выполним несколько пробных прогнозов. На вход модели подаётся история наблюдений 3-х признаков за последние пять дней, отобранных каждый час (временной интервал = 120). Так как наша цель заключается в прогнозе только температуры, то синим цветом на графике отображены прошлые значения температуры (история). Прогноз выполнен на полдня в будущее (отсюда и разрыв между историей и спрогнозированным значением). for x, y in val_data_single.take(3): plot = show_plot([x[0][:, 1].numpy(), y[0].numpy(), single_step_model.predict(x)[0]], 12, 'Single Step Prediction') plot.show() Интервальное прогнозирование В этом случае на основе некой имеющейся истории модель обучается прогнозированию интервала будущих значений. Таким образом, в отличие модели, прогнозирующей только на одно значение в будущее, данная модель прогнозирует последовательность значений в будущем. Допустим, как и в случае с моделью, выполняющей точечное прогнозирование, для модели, выполняющей интервальное прогнозирование, обучающими данными являются почасовые замеры последних пяти дней (720/6). Однако в данном случае модель необходимо обучить прогнозировать температуру на следующие 12 часов. Поскольку наблюдения регистрируются каждые 10 минут, выход (output) модели должен состоять из 72 прогнозов. Для выполнения этой задачи необходимо подготовить набор данных заново, но с другим целевым интервалом.
Проверим выборку. print ('Single window of past history : {}'.format(x_train_multi[0].shape)) print ('\n Target temperature to predict : {}'.format(y_train_multi[0].shape)) Single window of past history : (120, 3) Target temperature to predict : (72,)
val_data_multi = tf.data.Dataset.from_tensor_slices((x_val_multi, y_val_multi)) val_data_multi = val_data_multi.batch(BATCH_SIZE).repeat() Дополнение: отличие в формировании целевого вектора для «интервальной модели» от «точечной модели» видно на следующем рисунке. Подготовим визуализацию. def multi_step_plot(history, true_future, prediction): plt.figure(figsize=(12, 6)) num_in = create_time_steps(len(history)) num_out = len(true_future) plt.plot(num_in, np.array(history[:, 1]), label='History') plt.plot(np.arange(num_out)/STEP, np.array(true_future), 'bo', label='True Future') if prediction.any(): plt.plot(np.arange(num_out)/STEP, np.array(prediction), 'ro', label='Predicted Future') plt.legend(loc='upper left') plt.show() На этом и последующих аналогичных графиках история и будущие данные ежечасные. for x, y in train_data_multi.take(1): multi_step_plot(x[0], y[0], np.array([0])) Так как эта задача немного сложнее, чем предыдущая, то модель будет состоять из двух слоёв LSTM. Наконец, поскольку выполняется 72 прогноза, выход слой насчитывает 72 нейрона. multi_step_model = tf.keras.models.Sequential() multi_step_model.add(tf.keras.layers.LSTM(32, return_sequences=True, input_shape=x_train_multi.shape[-2:])) multi_step_model.add(tf.keras.layers.LSTM(16, activation='relu')) multi_step_model.add(tf.keras.layers.Dense(72)) multi_step_model.compile(optimizer=tf.keras.optimizers.RMSprop(clipvalue=1.0), loss='mae') Проверим нашу выборку и выведем кривые потерь на этапах обучения и проверки.
(256, 72) multi_step_history = multi_step_model.fit(train_data_multi, epochs=EPOCHS, steps_per_epoch=EVALUATION_INTERVAL, validation_data=val_data_multi, validation_steps=50) Train for 200 steps, validate for 50 steps Epoch 1/10 200/200 [==============================] - 21s 103ms/step - loss: 0.4952 - val_loss: 0.3008 Epoch 2/10 200/200 [==============================] - 18s 89ms/step - loss: 0.3474 - val_loss: 0.2898 Epoch 3/10 200/200 [==============================] - 18s 89ms/step - loss: 0.3325 - val_loss: 0.2541 Epoch 4/10 200/200 [==============================] - 18s 89ms/step - loss: 0.2425 - val_loss: 0.2066 Epoch 5/10 200/200 [==============================] - 18s 89ms/step - loss: 0.1963 - val_loss: 0.1995 Epoch 6/10 200/200 [==============================] - 18s 90ms/step - loss: 0.2056 - val_loss: 0.2119 Epoch 7/10 200/200 [==============================] - 18s 91ms/step - loss: 0.1978 - val_loss: 0.2079 Epoch 8/10 200/200 [==============================] - 18s 89ms/step - loss: 0.1957 - val_loss: 0.2033 Epoch 9/10 200/200 [==============================] - 18s 90ms/step - loss: 0.1977 - val_loss: 0.1860 Epoch 10/10 200/200 [==============================] - 18s 88ms/step - loss: 0.1904 - val_loss: 0.1863 plot_train_history(multi_step_history, 'Multi-Step Training and validation loss') Download 0.94 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling