Временная серия Keras LSTM

У меня проблема, и в этот момент я полностью потерял, как ее решить. Я использую Keras со слоем LSTM для создания временного ряда. Я пытаюсь использовать предыдущие 10 точек данных, чтобы предсказать 11-й.

Здесь код:

from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM

def _load_data(data):
"""
data should be pd.DataFrame()
"""
n_prev = 10
docX, docY = [], []
for i in range(len(data)-n_prev):
    docX.append(data.iloc[i:i+n_prev].as_matrix())
    docY.append(data.iloc[i+n_prev].as_matrix())
if not docX:
    pass
else:
    alsX = np.array(docX)
    alsY = np.array(docY)
    return alsX, alsY

X, y = _load_data(df_test)

X_train = X[:25]
X_test = X[25:]

y_train = y[:25]
y_test = y[25:]

in_out_neurons = 2
hidden_neurons = 300
model = Sequential()
model.add(LSTM(in_out_neurons, hidden_neurons, return_sequences=False))
model.add(Dense(hidden_neurons, in_out_neurons))
model.add(Activation("linear"))
model.compile(loss="mean_squared_error", optimizer="rmsprop")
model.fit(X_train, y_train, nb_epoch=10, validation_split=0.05)

predicted = model.predict(X_test)

Итак, я беру входные данные (двухкадровый dataframe), создавая X, который представляет собой массив n на 10 по 2, и y, который представляет собой массив n на 2, который на один шаг впереди последней строки в каждом массив X (маркировка данных с помощью точки непосредственно перед ней.

Ожидается

[[ 7.56940445,  5.61719704],
[ 7.57328357,  5.62709032],
[ 7.56728049,  5.61216415],
[ 7.55060187,  5.60573629],
[ 7.56717342,  5.61548522],
[ 7.55866942,  5.59696181],
[ 7.57325984,  5.63150951]]

но я должен получать

[[ 73,  48],
[ 74,  42],
[ 91,  51],
[102,  64],
[109,  63],
[ 93,  65],
[ 92,  58]]

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

Заранее благодарим за помощь!

Ответ 1

Эй, Райан!

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

Сначала, Stackoverflow может быть не лучшим местом для такого рода вопросов. Первая причина - у вас есть концептуальный вопрос, который не является целью этого сайта. Кроме того, ваш код работает, и это даже не вопрос общего программирования. Посмотрите stats.

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

  • lstm с размерами пробки
  • return_sequences=false непосредственно перед слоем Dense
  • линейная активация для вашего выхода
  • mse функция затрат/потерь/целевых функций

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

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

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

Последнее, но НЕ наименее Я предлагаю вам изучить этот учебник по Github, особенно повторяющийся учебник для временных рядов с keras.

PS: Даниэль Хник обновил свой post;)