LSTM с входом фактического временного шага

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

Я работаю над реализацией нейронной сети LSTM для прогнозирования потребления энергии. У меня есть набор данных с нагрузкой, рядами погодных параметров и индикатором выходного дня или нет.

Сначала я создал сеть с входом в 24 лага (используя функцию из этого учебника).
У меня есть набор данных, похожий на этот, но с 18 переменными и из ($t_{-24}$)

   var1(t-1)  var2(t-1)  var1(t)  var2(t)
1        0.0       50.0        1       51
2        1.0       51.0        2       52
3        2.0       52.0        3       53
4        3.0       53.0        4       54
5        4.0       54.0        5       55
6        5.0       55.0        6       56
7        6.0       56.0        7       57
8        7.0       57.0        8       58
9        8.0       58.0        9       59

И у меня есть моя сеть LSTM:

model = Sequential()
model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(loss="mae", optimizer="Adam")

В настоящее время я использую var1(t-1) и var2(t-1) для прогнозирования значения var2(t).
Но var2 коррелирует со значением var1. У меня есть значение var1(t), и я хочу использовать его для прогнозирования var2(t), но я не знаю, как это сделать.

Я пытался адаптировать мою нейронную сеть с var1(t-1), var2(t-1) и var1(t), но это не соответствует входной матрице, которая имеет размер (значение, запаздывающие часы, количество переменных)

Я не уверен, понимаю ли я вопрос, но если вы хотите включить var1(t) вместе с другими запаздывающими характеристиками var1(t-1), var2(t-2) и т.д., вы можете просто добавить var1(t) как дополнительную характеристику.
Это означает, что ваша матрица с предыдущей формой

(количество образцов, количество временных шагов, старое количество характеристик)

теперь становится

(количество образцов, количество временных шагов, новое количество характеристик = старое количество характеристик + 1)

Судя по вашему коду, это можно легко сделать, добавив var1(t) в виде нового столбца в вашу матрицу train_X, как в первых трех столбцах вашего первого фрагмента кода.

Однако я не уверен, почему вы хотите это сделать. Прогнозирование в момент времени t обычно предполагает, что, как только ваша модель готова работать с реальными данными, у вас не будет никаких данных в t, только из прошлого. Если вы строите свою модель на основе данных в момент времени t, не имея возможности извлечь эту информацию, когда она будет в производстве, то у вас будет проблема! Кроме того, вы пишете, что var1 и var2 коррелируют, и, следовательно, LSTM уже улавливает эту корреляцию, так как вы передаете прошлые значения этих переменных вместе.

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

Вопрос: Использование LSTM с фактическим значением в момент времени

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

Понимание проблемы

Вы уже имеете набор данных с 24 предыдущими значениями (лагами) для переменных var1 и var2. Ваша цель — использовать текущее значение var1(t) для улучшения предсказания var2(t). Для этого необходимо скорректировать матрицу входных данных, чтобы она включала это новое значение, не нарушая структуру входов для LSTM.

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

Для того чтобы добавить var1(t) в вашу входную матрицу, следуйте следующим шагам:

  1. Создание новой матрицы входных данных:
    Вы должны изменить форму входного массива train_X, добавив еще одну характеристику. Это можно сделать следующим образом:

    import numpy as np
    
    # Предположим, у вас уже есть массив train_X, который имеет размер (число выборок, число временных шагов, число характеристик)
    
    # Создаем новый массив с добавленной переменной
    new_feature = np.asarray(var1_t)  # Предполагается, что вас уже есть массив var1(t) с текущими значениями
    new_feature = new_feature.reshape(-1, 1)  # Преобразуем массив в нужный формат для concatenation
    
    # Объединяем новый массив с существующим
    train_X = np.concatenate((train_X, new_feature), axis=2)  # Объединяем по оси, представляющей различные признаки
  2. Формат входных данных:
    После добавления текущего значения var1(t) ваша матрица входных данных будет иметь следующий вид:

    (число_samples, число_timesteps, число_features + 1)

Обсуждение применения

Обратите внимание, что использование var1(t) в процессе обучения может привести к проблемам на этапе предсказания. Модель, основанная на предыдущих значениях, не должна включать текущие значения, так как они будут недоступны в реальном времени. Это потенциально ухудшит обобщающую способность вашей модели.

Альтернативные подходы

  1. Использование увлечения зависимостей:
    Если ваши переменные сильно коррелируют, LSTM уже может извлечь необходимую информацию, используя только предыдущие значения var1 и var2. Подумайте над тем, чтобы оставить модель без var1(t) и сосредоточиться на улучшении качества прогнозирования, используя другие временные шаги.

  2. Тестирование и кросс-валидация:
    Постарайтесь оценить производительность модели с и без var1(t) с помощью кросс-валидации. Это поможет вам определить, действительно ли добавление этого значения улучшает обобщение модели или нет.

Заключение

Использование фактического значения вар1(t) вместе с лагами может быть применимо, но стоит проявить осторожность. Вам следует учитывать контексты применения модели, ее подготовку и интерпретацию. Важно избегать «утечек» информации, которые могут исказить результаты предсказания на реальных данных. Проведите дополнительные эксперименты и внимательно анализируйте результаты, чтобы принимать обоснованные решения.

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

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