Многовариантный входной одномерный многоступенчатый прогноз временных рядов с использованием LSTM в KERAS - Какой подход? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытался прогнозировать временные ряды продаж продукта / $, используя несколько функций, используя модель LSTM в Керасе.Я все еще новичок в моделировании LSTM - возможно, я что-то не так делаю.

У меня есть почасовые данные за полтора года, что дает 11904 временных шага.Функции состоят из нескольких числовых данных о погоде и нескольких функций с горячим кодированием, таких как день недели, час дня.В конце я хочу спрогнозировать следующие n часов продаж продукта, используя последние m часов каждой функции (включая продажи).Я приведу небольшой пример, как я подготовил данные.Мой временной ряд структурирован следующим образом: «T» представляет интересующее меня значение, а «a» - временной ряд объекта.У меня сейчас 41 функция.

dataset=array
 ([['T0', 'a0'],
   ['T1', 'a1'],
   ['T2', 'a2'],
   ['T3', 'a3'],
   ['T4', 'a4'],
   ['T5', 'a5'],
   ['T6', 'a6'],
   ['T7', 'a7'],
   ['T8', 'a8'],
   ['T9', 'a9']], dtype='<U2')

Я использую скользящее окно, так как у меня есть только один временной ряд.

В примере я использую 5 предыдущих временных шагов, чтобы предсказать 3 впереди.Мой X выглядит так:

X=array
 ([[['T0', 'a0'],
    ['T1', 'a1'],
    ['T2', 'a2'],
    ['T3', 'a3'],
    ['T4', 'a4']],

   [['T1', 'a1'],
    ['T2', 'a2'],
    ['T3', 'a3'],
    ['T4', 'a4'],
    ['T5', 'a5']],

   [['T2', 'a2'],
    ['T3', 'a3'],
    ['T4', 'a4'],
    ['T5', 'a5'],
    ['T6', 'a6']]], dtype='<U2')

, а моя цель выглядит так:

y=array
 ([['T5', 'T6', 'T7'],
   ['T6', 'T7', 'T8'],
   ['T7', 'T8', 'T9']], dtype='<U2')

Q1 : Это жизнеспособный подход?Я прочитал, что для LSTM необязательно подготавливать такие данные, поскольку он способен формировать сами окна.

Сейчас я хочу прогнозировать следующие 24 часа, используя последние 72 часа.Для моей сети форма X и y выглядит следующим образом:

trainX.shape=(11699, 72, 41) ##### my test was very small
trainY.shape=(11699, 24)

И сама модель LSTM:

n_features=41
neurons=50
look_ahead=24
model = Sequential()
model.add(LSTM(input_dim=n_features, output_dim=neurons))
model.add(Dropout(.2))
model.add(Dense(look_ahead))
model.compile(loss='mse', optimizer='rmsprop')
hist=model.fit(trainX, trainY, epochs=20,shuffle=False)

Я думаю, что я получаю разумные результаты (провал между 0 и0600, максимум в 1800-2000 и т. Д.), Но у меня есть некоторые проблемы с пониманием, действительно ли модель делает то, что я пытаюсь сделать.

Q2 Насколько я понимаю, я кормлю в последний раз72 временных шага для 41 функции, и это дает один временной шаг с 24 функциями - так как мои тренировочные данные структурированы следующим образом.Который я тогда интерпретирую как 24 временных шага.Изучает ли модель последовательный аспект?

Q3 Путем деления моих тренировочных данных на 72-часовые порции я теряю каждую симуляцию / схему, превышающую 72 часа?

Q4 Строго говоря, я вообще ставлю равные выборки?У 72 часов в июле совершенно другие погодные явления, чем, скажем, в декабре.

Q5 Пока я только нормализую / масштабирую (MinMaxScaler) мои данные.Если некоторые данные о погоде или мои продажи не являются постоянными, нужно ли мне делать это заранее?

Q6 Что мне нужно изменить, чтобы заставить его изучать более длинные паттерны?Я читал, что слишком много временных шагов тоже не годятся.Я нашел кое-что о сохранении состояния LSTM, но еще не понял их - это еще один жизнеспособный подход?Могу ли я изменить ввод на (1,11699,41) там?

Спасибо всем, кто может пролить свет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...