Предполагается, что LSTM является подходящим инструментом для захвата зависимости пути в данных временных рядов.
Я решил провести простой эксперимент (моделирование), чтобы оценить степень, в которой LSTM лучше способен понимаю путь-зависимость.
Настройка очень проста.Я просто симулирую группу (N = 100) путей, идущих от 4 разных процессов генерации данных.Два из этих процессов представляют реальное увеличение и реальное уменьшение, в то время как другие два поддельные тренды, которые в конечном итоге возвращаются к нулю.
На следующем графике показаны смоделированные пути для каждой категории:
![Simulated paths](https://i.stack.imgur.com/cqa2v.png)
Кандидату-алгоритму машинного обучения будут заданы первые 8 значений пути (t в [1,8]) и будут обучены прогнозировать последующее движение за последние 2 шага.
Другими словами:
вектор признаков X = (p1, p2, p3, p4, p5, p6, p7, p8)
цель - y = p10 - p8
Я сравнил LSTM с простой моделью Random Forest с 20 оценками.Вот определения и обучение двух моделей с использованием Keras и scikit-learn:
# LSTM
model = Sequential()
model.add(LSTM((1), batch_input_shape=(None, H, 1), return_sequences=True))
model.add(LSTM((1), return_sequences=False))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
history = model.fit(train_X_LS, train_y_LS, epochs=100, validation_data=(vali_X_LS, vali_y_LS), verbose=0)
# Random Forest
RF = RandomForestRegressor(random_state=0, n_estimators=20)
RF.fit(train_X_RF, train_y_RF);
Результаты вне выборки суммированы по следующим точечным диаграммам:
![enter image description here](https://i.stack.imgur.com/81fRi.png)
Как видите, модель случайного леса явно превосходит LSTM.Последний, похоже, не способен различить реальные и фальшивые тренды.
Есть ли у вас какие-либо идеи, чтобы объяснить, почему это происходит?
Как бы вы изменили модель LSTM, чтобы она была лучше в этой проблеме?
Некоторые замечания:
- Точки данных разделены на 100, чтобы градиенты не взрывались
- Я пытался увеличить размер выборки, но я не заметил различий
- Я пытался увеличить количество эпох, в течение которых обучается LSTM, но я не заметил различий (потеря становится застойнойпосле нескольких эпох)
- Вы можете найти код, который я использовал для запуска эксперимента здесь
Обновление:
Благодаря *В ответ 1075 * я изменил модель и получил гораздо лучшие результаты:
# Updated LSTM Model
model = Sequential()
model.add(LSTM((8), batch_input_shape=(None, H, 1), return_sequences=False))
model.add(Dense(4))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
![Better Results](https://i.stack.imgur.com/wOxg0.png)
Тем не менее, модель Random Forest работает лучше.Дело в том, что RF кажется understand
, что, в зависимости от класса, более высокое p8
предсказывает более низкий результат p10-p8
и наоборот из-за способа добавления шума.LSTM, похоже, потерпел неудачу в этом, поэтому он довольно хорошо предсказывает класс, но мы видим, что внутри-классовая наклонная фигура на финальном графике рассеяния.
Есть какие-нибудь предложения по улучшению этого?