CNTK - Прогноз временных рядов

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

   var1(t-2)  var2(t-2)  var1(t-1)  var2(t-1)  var2(t)
2        1.5       -0.8        0.9       -0.5     -0.2
3        0.9       -0.5       -0.1       -0.2      0.2
4       -0.1       -0.2       -0.3        0.2      0.4
5       -0.3        0.2       -0.7        0.4      0.6
6       -0.7        0.4        0.2        0.6      0.7
Q1: Я обучил модель LSTM с данными выше. Эта модель хорошо подходит для прогнозирования значения var2 на временном шаге t. Однако, что если я хочу предсказать var2 на этапе t + 1? Я чувствую, что это трудно, потому что модель не может сказать мне значение var1 на шаге t времени. Если я хочу сделать это, как я должен изменитькод построить модель?Q2: Я видел, что этот вопрос задавали много, но я все еще в замешательстве. В моем примере, каким должен быть правильный временной шаг в [выборках, временных шагах, функциях] 1 или 2?Q3: Я только начал изучать LSTM. я прочиталВот что одним из самых больших преимуществ LSTM является то, что он сам изучает временную зависимость / размер скользящего окна, тогда почему мы всегда должны преобразовывать данные временных рядов в формат, подобный таблице выше?

Обновление: результат LSTM (синяя линия - последовательность обучения, оранжевая линия - основная правда, зеленая - прогноз)

 Daniel Möller24 окт. 2017 г., 17:05
Влажность почвы не зависит от осадков ... есть ли у вас полная последовательность значений осадков для ввода?
 Daniel Möller24 окт. 2017 г., 15:03
Являются ли var1 и var2 независимыми друг от друга? Вы хотите предсказать только вар 2? Разве вы не хотите предсказывать вар 1?
 Yongyao Jiang24 окт. 2017 г., 17:12
Да, я знаю, что есть некоторая корреляция, может быть, плохой пример. Просто хотел упростить дело. В моем предыдущем комментарии была опечатка, я хочу только предсказать var2. И да, у меня есть полная последовательность ежемесячных данных здесь:github.com/Yongyao/enso-forcasting/blob/master/preprocessed/...
 Yongyao Jiang24 окт. 2017 г., 16:48
Они независимы. Просто думайте о них как об осадках и влажности почвы. Да, я хочу только предсказать var1.
 Daniel Möller24 окт. 2017 г., 17:26
Но вар 2 зависит от вар 1, верно? (Если это так, вы должны предсказать вар 1).

Ответы на вопрос(2)

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

Обычно предшествующие шаги необходимы:

DetrendDeseasonalizeМасштаб (нормализовать)

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

Также этот пост:CNTK - Прогноз временных рядов

Решение Вопроса
Вопрос 1:

что у вас есть скользящее окно над одной последовательностью, делающее множество меньших последовательностей с 2 ​​шагами.

Для прогнозирования t вы берете первую строку вашей таблицы в качестве вводаДля прогнозирования t + 1 вы берете вторую строку в качестве входных данных.

Если вы не используете таблицу: см. Вопрос 3

Вопрос 2:

Предполагая, что вы используете эту таблицу в качестве входных данных, когда это явно скользящее окно, в котором вводятся два временных шага, вашtimeSteps это 2.

Вы, вероятно, должны работать так, как будтоvar1 а такжеvar2 были функции в той же последовательности:

input_shape = (2,2) - Два временных шага и две функции / переменные.Вопрос 3:

Нам не нужно делать такие таблицы или строить раздвижные окна. Это один из возможных подходов.

Ваша модель действительно способна изучать вещи и определять размер этого окна.

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

Не используя windows:

Если ваши данные содержат 800 шагов, введите все 800 шагов одновременно для тренировки.

Здесь нам нужно разделить две модели: одну для обучения, другую для прогнозирования. На тренировках мы воспользуемся параметромreturn_sequences=True, Это означает, что для каждого шага ввода мы получим шаг вывода.

Для прогнозирования позже нам понадобится только один выход, тогда мы будем использоватьreturn_sequences= False, И в случае, если мы собираемся использовать прогнозируемые результаты в качестве входных данных для следующих шагов, мы будем использоватьstateful=True слой.

Тренировка:

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

Ваши целевые данные (Y) также имеют вид(1, 799, 2), предпринимая те же шаги, сдвинулся с 2 до 800.

Построить модель сreturn_sequences=True, Вы можете использоватьtimeSteps=799, но вы также можете использоватьNone (допускается переменное количество шагов).

model.add(LSTM(units, input_shape=(None,2), return_sequences=True))
model.add(LSTM(2, return_sequences=True)) #it could be a Dense 2 too....
....
model.fit(X, Y, ....)

Предсказание:

Для прогнозирования создайте похожую модель, теперь сreturn_sequences=False.

Скопируйте веса:

newModel.set_weights(model.get_weights())

Вы можете сделать ввод длиной 800, например (shape:(1,800,2)) и предсказать только следующий шаг:

step801 = newModel.predict(X)

Если вы хотите предсказать больше, мы будем использоватьstateful=True слои. Используйте ту же модель снова, теперь сreturn_sequences=False (только в последнем LSTM, остальные сохраняют True) иstateful=True (все они). Изменитьinput_shape поbatch_input_shape=(1,None,2).

#with stateful=True, your model will never think that the sequence ended  
#each new batch will be seen as new steps instead of new sequences
#because of this, we need to call this when we want a sequence starting from zero:
statefulModel.reset_states()

#predicting
X = steps1to800 #input
step801 = statefulModel.predict(X).reshape(1,1,2)
step802 = statefulModel.predict(step801).reshape(1,1,2)
step803 = statefulModel.predict(step802).reshape(1,1,2)
    #the reshape is because return_sequences=True eliminates the step dimension   

На самом деле, вы можете сделать все с однимstateful=True а такжеreturn_sequences=True модель, заботясь о двух вещах:

Когда тренируешься,reset_states() за каждую эпоху. (Поезд с ручной петлей иepochs=1)При прогнозировании из более чем одного шага, сделайте только последний шаг вывода в качестве желаемого результата.
 Yongyao Jiang27 окт. 2017 г., 16:34
Только что попробовал то, что вы предложили, 1) оказывается, что input_shape = (None, 2) не поддерживается в Keras. Некоторые люди говорят, что ввод переменных поддерживается только в TensorFlow. 2) другое дело, что, если я правильно понимаю, stateful = True не влияет на прогноз (каждый новый прогноз не будет рассматриваться как новые шаги), верно?
 Daniel Möller26 окт. 2017 г., 18:59
Да ... если вы используете скользящее окно с двумя такими шагами, ваш LSTM сможет выучить только два шага и больше ничего. --- В последнем предложении да,model.fit(longSequence,longPrediction, epochs=1), но было бы лучше использоватьmodel.train_on_batch(), не забудьте сбросить состояния для каждого цикла.
 Yongyao Jiang26 окт. 2017 г., 19:42
Я только начал использовать LSTM. Если память по-прежнему определяется размером окна, это означает, что у меня не может быть как длинной, так и короткой памяти одновременно, но LSTM коротка для длинной краткосрочной памяти, не так ли странно?
 Daniel Möller26 окт. 2017 г., 19:46
.... чего ждать?? Хахаха .... Мне не нравится шкаф с раздвижными окнами ... Я почти никогда им не пользуюсь. Мне нравятся такие подходы, как Q3. Они действительно используют возможности LSTM.
 Yongyao Jiang26 окт. 2017 г., 18:45
Спасибо! Это очень помогает. (1) Для Q1 и Q2, если я использую скользящее окно и в этом случае input_shape = (2,2), означает ли это, что я говорю LSTM, что шаг t относится только к двум предыдущим шагам - t-1 и t -2, который известен как классический эффект скользящего окна? (2) Если я приму ваше последнее предложение о тренировке с ручным циклом, могу ли я просто вызывать model.fit () повторно?

Ваш ответ на вопрос