RNN / LSTM сеть для прогнозирования многомерных временных рядов

Вопрос или проблема

У меня есть данные по дневным временным рядам продуктов, потребляемым в отеле. У меня есть 30 временных рядов потребления продуктов (целевая переменная) и множество объясняющих переменных для каждого продукта, связанных с отелем (заполненность номеров, демография клиентов…) и данные о погоде. Временной диапазон составляет около 2 лет. Датасет выглядит следующим образом:

                    Продукт                         Отель                        Погода              Цель
            ------------------- ----------------------------------------     --------------     ---------- 
            product_id cat_prod rooms_filled_ratio  guest_age_gap_ratio1 ... Дождь min_temp ... Потребление
2025-01-01      001         A       0.25                    0.9                0     20             10
2025-01-02      001         A       0.33                    0.8                25    16             26
2025-01-02      002         B       0.33                    0.8                25    16             56
2025-01-03      001         A       0.72                    0.71               3     18             20
2025-01-03      002         B       0.72                    0.71               3     18             19
2025-01-03      003         A       0.72                    0.71               3     18             18

Я исследовал данные и сделал некоторые выводы:

  • Поля ПОГОДА и ОТЕЛЬ влияют на целевую переменную
  • Каждый временной ряд продуктов имеет определенный авторегрессионный характер (до 2 лагов)
  • Потребление некоторых продуктов коррелировано по одной и той же дате (т.е. каждый временной ряд влияет друг на друга)

Мне нужно предсказать потребление(t + 1) для каждого из продуктов.

Я видел некоторые подходы архитектур RNN для прогнозирования временных рядов (этот), в этом случае используя только временные ряды, без объясняющих данных. Я знаю, что это тривиально расширить этот подход, добавив объясняющие переменные так же, как при использовании нескольких временных шагов.

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

Есть идеи?

Ответ или решение

Конечно, задачу предсказания многомерных временных рядов с использованием RNN (рекуррентных нейронных сетей) или LSTM (долговременной кратковременной памяти) можно решать с учетом предоставленных данных и особенностей. Рассмотрим решение этой задачи по методике TEA (Theory, Example, Application), где мы начнем с теоретического обоснования, приведем примеры и завершим практическим применением предложенной методологии.

Теория

Рекуррентные нейронные сети и LSTM

Рекуррентные нейронные сети (RNN) и их эффективные модификации, такие как Long Short-Term Memory (LSTM) и Gated Recurrent Units (GRU), обычно применяются для обработки данных, которые имеют временную динамику. Эти модели специально разработаны для работы с последовательностями, где важен сохранение информации о предыдущих состояниях.

LSTM особенно интересны, когда имеются длинные зависимости в данных, то есть когда необходимо учитывать информацию, приходящую из предыдущих временных шагов для предсказания нынешнего состояния. В случае многомерных временных рядов, таких как ваши данные с гостиничным потреблением, LSTM может быть адаптирован для анализа временных зависимостей как внутри отдельных стационарных рядов (авторегрессия), так и между разными продуктами на одном шаге времени.

Предусмотрение зависимостей между разными временными рядами

Ваша задача требует учета зависимости, не только временных взаимосвязей в пределах одного ряда, но и взаимосвязей между рядами. Это можно эффективно сделать, если использовать многомерную архитектуру сети. В этом подходе входные данные представляются как матрица, где одна ость соответствует времени, а другая измеряет различные мульти-дименсиональные атрибуты, такие как характеристики гостиницы, погода и различие продуктов.

Пример

В качестве размышления стоит обратить внимание на подход, использующий сети типа "многие ко многим" (Many-To-Many). В этих сетях каждый элемент времени одной последовательности соотносится с несколькими объектами (в данном случае, различными продуктами).

Пример архитектуры

  1. Входной слой (Input Layer): Данные поступают в виде временных секвенций с несколькими признаками, включая идентификатор продукта, погодные данные, данные гостиницы и фактическое потребление из предыдущих дней.
  2. Скрытые слои (Hidden Layers): Многослойная LSTM сеть может быть использована для анализа данных. Первый скрытый слой может извлекать внутренние временные паттерны одного ряда, а последующие могут обучаться соотношениям между изделиями.
  3. Выходной слой (Output Layer): Выходной слой формирует сигналы о будущем потреблении каждого продукта по аналогии с входными временными рядами.

Применение

Подготовка данных

Начните с предобработки данных. Необходимо нормализовать или стандартизировать их, чтобы избежать избыточного веса конкретной переменной в модели. Кодирование категориальных признаков, таких как идентификатор продукта и категории, также повысит эффективность модели.

Создание и обучение модели

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

from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout, BatchNormalization
from keras.optimizers import Adam

input_shape = (timesteps, num_features)

model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape=input_shape))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(LSTM(64, return_sequences=True))
model.add(Dropout(0.1))
model.add(BatchNormalization())

model.add(LSTM(32, return_sequences=False))
model.add(Dropout(0.1))

model.add(Dense(30, activation='linear')) # количество продуктов

model.compile(optimizer=Adam(), loss='mean_squared_error')

# обучение модели
model.fit(X_train, y_train, epochs=50, validation_split=0.2)

Проверка и тестирование модели

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

Множественный доступ ко временным и продуктовым изменениям

Один из способов эффективно интегрировать временные ряды различных продуктов заключается в создании перекрестных сетей для изучения межпродуктовых взаимосвязей. Применяя подобные модели, вы можете учитывать не только временную динамику, но и когерентность потребления продуктов.

Описанная стратегия позволит вам не только учесть временные изменения одного продукта, но и взаимосвязи между разными продуктами и дополнительными признаками. Это высветит скрытые факторы, влияющие на тенденции потребления, и позволит более точно предсказывать будущие значкения.

Оцените материал
Добавить комментарий

Капча загружается...