Как использовать глубокое обучение с временными рядами

Цель этой статьи - представить читателю класс на 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 ()

Подгонка модели

Прогноз на несколько шагов вперед

Я надеюсь, что читатель сможет использовать код, представленный в этой статье, в своей профессиональной и академической работе.