Сегодня мы будем использовать очень простую архитектуру глубокого обучения, которая часто дает самые современные результаты. Эта модель имеет всего около 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)

Прогнозы модели на тестовых данных

Мы видим, что модель изучает шаблоны, предсказанные в невидимом тестовом наборе данных. Он очень хорошо отражает сезонность и тенденции.