Как использовать глубокое обучение с временными рядами
Цель этой статьи - представить читателю класс на Python, который имеет очень интуитивно понятный и простой ввод для моделирования и прогнозирования данных временных рядов с использованием глубокого обучения. В идеале читатель должен иметь возможность скопировать код, представленный в этой статье или репозитории GitHub, адаптировать его к своим потребностям (например, добавить больше слоев в модель) и использовать его в своей работе.
Весь код, который используется в этой статье, можно найти здесь:
Https://github.com/Eligijus112/deep-learning-ts
Данные для этой статьи можно найти здесь:
Https://www.kaggle.com/robikscube/hourly-energy-consuming
Для глубокого моделирования используются пакеты TensorFlow и Keras.
Временной ряд - это последовательность точек числовых данных в последовательном порядке. Эти точки часто измеряются через определенные промежутки времени (каждый месяц, каждый день, каждый час и т. Д.). В этой статье используются ежечасные данные, измеряемые с 2004–10–01 по 2018–08–03. Общее количество точек необработанных данных: 121271.
Визуализация временного ряда:
Основная цель алгоритма глубокого обучения для заданного временного ряда - найти функцию f такую, что:
Yₜ = f(Yₜ₋₁, Yₜ₋₂, …, Yₜ₋ₚ)
Другими словами, мы хотим оценить функцию, которая объясняет текущие значения потребления энергии на основе лагов p того же потребления энергии.
В этой статье не объясняется, почему сети глубокого обучения с долговременной краткосрочной памятью (LSTM) хороши для моделирования временных рядов или как они работают. Чтобы найти ресурсы по этому поводу, ознакомьтесь с такими замечательными статьями, как:
Для реализации LSTM (или любого уровня RNN) в Keras см. Официальную документацию:
Во-первых, нам нужно прочитать данные:
Затем нам понадобится функция, которая преобразует временные ряды в матрицы X и Y, чтобы модель глубокого обучения начала обучение. Допустим, мы хотим создать функцию, которая объясняет значения текущего временного ряда с помощью 3 лагов:
Yₜ = f(Yₜ₋₁, Yₜ₋₂, Yₜ₋₃)
И у нас есть такие данные:
ts = [1621.0, 1536.0, 1500.0, 1434.0, 1489.0, 1620.0]
Мы хотим создать две матрицы:
X = [ [1621.0, 1536.0, 1500.0], # First three lags [1536.0, 1500.0, 1434.0], # Second three lags [1500.0, 1434.0, 1489.0], # Third three lags ] Y = [1434.0, 1489.0, 1620.0]
Это наиболее важный трюк при использовании глубокого обучения с временными рядами. Эти матрицы X и Y можно передавать не только в рекуррентную систему нейронной сети (например, LSTM), но и в любой обычный алгоритм глубокого обучения.
Модель глубокого обучения имеет слой LSTM (который также служит входным слоем) и выходной уровень.
Во время моих поисков в Интернете простой в использовании модели глубокого обучения с временными рядами я наткнулся на различные статьи, в которых были выделены несколько частей моделирования, например, как определить модель, как создать матрицу для моделей и т. Д. найдите пакет или класс, который объединил все в одну простую в использовании сущность. Я решил сделать это сам:
Запуск класса:
# Initiating the class deep_learner = DeepModelTS( data = d, Y_var = 'DAYTON_MW', lag = 6, LSTM_layer_depth = 50, epochs = 10, batch_size = 256, train_test_split = 0.15 )
Параметры класса:
данные - данные, используемые для моделирования.
Y_var - имя переменной, которую мы хотим моделировать / прогнозировать.
lag - количество лагов, используемых при моделировании.
LSTM_layer_depth - количество нейронов в слое LSTM.
эпох - количество циклов обучения (от прямого распространения к обратному).
batch_size - размер выборки данных для градиентного спуска, используемой при нахождении параметров моделью глубокого обучения. Все данные делятся на блоки размером batch_size и передаются по сети. Внутренние параметры модели обновляются после каждого движения batch_size данных вперед и назад в модели.
Чтобы узнать больше об эпохах и размерах пакетов, посетите:
train_test_split - доля данных, которая используется для тестирования. 1 - train_test_split используется для обучения модели.
Примерка модели:
# Fitting the model model = deep_learner.LSTModel()
После выполнения вышеуказанной команды вы можете увидеть любимый фанатами тренировочный экран:
Обучение модели с большим количеством лагов (следовательно, с большей X-матрицей) увеличивает время обучения:
deep_learner = DeepModelTS( data = d, Y_var = 'DAYTON_MW', lag = 24, # 24 past hours are used LSTM_layer_depth = 50, epochs = 10, batch_size = 256, train_test_split = 0.15 ) model = deep_learner.LSTModel()
Теперь, когда у нас есть созданная модель, мы можем приступить к прогнозированию. Формула прогнозов для модели, обученной с задержками p:
Yₜ₊₁ = f(Yₜ, Yₜ₋₁, …, Yₜ₋ₚ₊₁)
# Defining the lag that we used for training of the model lag_model = 24 # Getting the last period ts = d['DAYTON_MW'].tail(lag_model).values.tolist() # Creating the X matrix for the model X, _ = deep_learner.create_X_Y(ts, lag=lag_model) # Getting the forecast yhat = model.predict(X)
Если данные были разделены на обучающий и тестовый наборы, тогда метод deep_learner.predict () предсказывает точки, которые находятся в тестовом наборе, чтобы увидеть, как наша модель работает вне выборки.
yhat = deep_learner.predict() # Constructing the forecast dataframe fc = d.tail(len(yhat)).copy() fc.reset_index(inplace=True) fc['forecast'] = yhat # Ploting the forecasts plt.figure(figsize=(12, 8)) for dtype in ['DAYTON_MW', 'forecast']: plt.plot( 'Datetime', dtype, data=fc, label=dtype, alpha=0.8 ) plt.legend() plt.grid() plt.show()
Как видим, прогнозы для 15 процентов данных, которые были скрыты при создании модели, близки к реальным значениям.
Обычно мы хотим прогнозировать заранее, опережая данные последнего исходного временного ряда. Класс DeepModelTS имеет метод pred_n_ahead (n_ahead), который прогнозирует временные шаги n_ahead.
# Creating the model using full data and forecasting n steps aheaddeep_learner = DeepModelTS( data=d, Y_var='DAYTON_MW', lag=48, LSTM_layer_depth=64, epochs=10, train_test_split=0 ) # Fitting the model deep_learner.LSTModel() # Forecasting n steps ahead n_ahead = 168 yhat = deep_learner.predict_n_ahead(n_ahead) yhat = [y[0][0] for y in yhat]
Приведенный выше код прогнозирует количество шагов вперед на одну неделю (168 часов). Сравнивая его с предыдущими 400 часами:
В заключение в этой статье представлен простой пример конвейера при работе с моделированием и прогнозированием данных временных рядов:
Чтение и очистка данных (1 строка за 1 временной шаг)
Выбор количества лагов и глубины модели
Запуск класса DeepModelTS ()
Подгонка модели
Прогноз на несколько шагов вперед
Я надеюсь, что читатель сможет использовать код, представленный в этой статье, в своей профессиональной и академической работе.