Сегодня мы будем использовать очень простую архитектуру глубокого обучения, которая часто дает самые современные результаты. Эта модель имеет всего около 700 параметров и состоит из сверток и слоев LSTM. Я намеренно сделал модель простой, но вы можете создавать аналогичные более крупные архитектуры для своих наборов данных по мере необходимости. Github_Complete_Notebook_To_Play
В этом посте представлен подход глубокого обучения к прогнозированию сложных временных рядов. В прошлом мы рассмотрели классические подходы (Prophet, ARIMA и XGBoost) для прогнозирования временных рядов. В классических подходах пространство гиперпараметров является сложным и требует тщательного проектирования конвейера. Сегодня мы будем использовать очень простую нейронную сеть.
Постановка проблемы
Мы сформулируем задачу прогнозирования как обучение от последовательности к последовательности, используя последовательность прошлых значений для предсказания последовательности будущих значений.
Набор данных:образец набора данных авиапассажиров, в котором записано количество авиапассажиров.
Последовательное обучение
Мы будем использовать значения за последние 12 месяцев, чтобы спрогнозировать значения на следующие 6 месяцев. Преобразования данных могут быть достигнуты, как показано.
import pandas as pd history = 12 #last values used by model future = 6 #predict future values df = pd.read_csv('https://raw.githubusercontent.com/AileenNielsen/TimeSeriesAnalysisWithPython/master/data/AirPassengers.csv') def Tranform_dataset(input_length, output_length, data): df = data.copy() #x columns i = 0 while i < input_length: df[f'x_{i}'] = df['#Passengers'].shift(-i) i = i + 1 #y columns j = 0 while j < output_length: df[f'y_{j}'] = df['#Passengers'].shift(-output_length-j) j = j + 1 #drop last columns which might have NAN df = df.dropna(axis=0) return df full_data = Tranform_dataset(history, future, df) full_data.head(3)
Архитектура нейронной сети
Мы будем использовать простую, но мощную архитектуру, состоящую из одномерных сверток и слоев LSTM. Эта архитектура может автоматически изучать сезонность и тенденцию ряда без тщательной настройки.
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras.layers import LSTM, Conv1D tf.random.set_seed(0) def get_model_cnn_lstm(history, future): model = Sequential() model.add(tf.keras.Input(shape=(X_train.shape[1], X_train.shape[2]))) model.add(tf.keras.layers.Conv1D(filters=6, kernel_size=5, activation='relu')) model.add(LSTM(6, return_sequences=True, activation='relu')) model.add(LSTM(6, return_sequences=False, activation='relu')) model.add(Dense(future)) model.compile(loss='mean_squared_error', optimizer='adam') return model model_cnnlstm = get_model_cnn_lstm(history, future) model_cnnlstm.summary() Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv1d (Conv1D) (None, 8, 6) 36 lstm (LSTM) (None, 8, 6) 312 lstm_1 (LSTM) (None, 6) 312 dense (Dense) (None, 6) 42 ================================================================= Total params: 702 Trainable params: 702 Non-trainable params: 0 _________________________________________________________________
Обучение модели
filepath = 'CNN_LSTM.hdf5' checkpoint_cnn_lstm = tf.keras.callbacks.ModelCheckpoint(filepath=filepath, monitor='val_loss', verbose=0, save_best_only=True, mode='min') callbacks_cnn_lstm = [checkpoint_cnn_lstm] hist_cnn_lstm = model_cnnlstm.fit(X_train, y_train, epochs=2000, batch_size=16, verbose=0, validation_data=(X_test, y_test), shuffle=True, callbacks = callbacks_cnn_lstm)
Прогнозы модели на тестовых данных
Мы видим, что модель изучает шаблоны, предсказанные в невидимом тестовом наборе данных. Он очень хорошо отражает сезонность и тенденции.