Эксперимент показывает, что LSTM работает хуже, чем Random Forest ... Почему? - PullRequest
0 голосов
/ 08 февраля 2019

Предполагается, что LSTM является подходящим инструментом для захвата зависимости пути в данных временных рядов.

Я решил провести простой эксперимент (моделирование), чтобы оценить степень, в которой LSTM лучше способен понимаю путь-зависимость.

Настройка очень проста.Я просто симулирую группу (N = 100) путей, идущих от 4 разных процессов генерации данных.Два из этих процессов представляют реальное увеличение и реальное уменьшение, в то время как другие два поддельные тренды, которые в конечном итоге возвращаются к нулю.

На следующем графике показаны смоделированные пути для каждой категории:

Simulated paths

Кандидату-алгоритму машинного обучения будут заданы первые 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

Как видите, модель случайного леса явно превосходит 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

Тем не менее, модель Random Forest работает лучше.Дело в том, что RF кажется understand, что, в зависимости от класса, более высокое p8 предсказывает более низкий результат p10-p8 и наоборот из-за способа добавления шума.LSTM, похоже, потерпел неудачу в этом, поэтому он довольно хорошо предсказывает класс, но мы видим, что внутри-классовая наклонная фигура на финальном графике рассеяния.

Есть какие-нибудь предложения по улучшению этого?

1 Ответ

0 голосов
/ 09 февраля 2019

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

1) Увеличить количество скрытых юнитов в первом слое.

model.add(LSTM((32), batch_input_shape=(None, H, 1), return_sequences=True))

2) По умолчанию слой LSTM имеет tanh, который ограничиваетвывод на (-1, 1), как вы можете видеть на правом графике.Я рекомендую либо добавить плотный слой, либо использовать LSTM с линейной активацией на выходе.Вот так:

model.add(LSTM((1), return_sequences=False, activation='linear'))

Или

model.add(LSTM((16), return_sequences=False))
model.add(Dense(1))

Попробуйте сделать это с 10K сэмплами, которые у вас есть.

...