实验表明LSTM的性能比随机森林差……为什么?

时间:2019-02-08 17:00:35

标签: python machine-learning lstm random-forest

LSTM应该是捕获时间序列数据中路径依赖的正确工具。

我决定进行一个简单的实验(模拟),以评估LSTM在多大程度上能够理解路径依赖性。

设置非常简单。我只是模拟了来自4个不同数据生成过程的一堆(N = 100)路径。其中两个过程表示 real 的增加和 real 的减少,而其他两个 fake 趋势最终恢复为零。

下图显示了每个类别的模拟路径:

Simulated paths

将为候选机器学习算法提供路径的前8个值([1,8]中的t),并将对其进行训练以预测后2个步骤中的后续运动。

换句话说:

  • 特征向量为X = (p1, p2, p3, p4, p5, p6, p7, p8)

  • 目标是y = p10 - p8

我将LSTM与具有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。后者似乎无法区分 real fake 趋势。

您是否有任何想法来解释为什么会发生这种情况?

您将如何修改LSTM模型以使其更好地解决此问题?

一些评论:

  • 将数据点除以100以确保梯度不会爆炸
  • 我尝试增加样本量,但没有发现差异
  • 我试图增加训练LSTM的时期数,但是我没有发现任何差异(在一堆时期后损失停滞)
  • 您可以找到我用来运行实验here的代码

更新:

由于SaTa的回复,我更改了模型并获得了更好的结果:

# 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

不过,随机森林模型的效果更好。关键是,RF似乎understand取决于班级条件,较高的p8会预测较低的结果p10-p8,反之亦然,这是由于添加噪声的方式所致。 LSTM似乎无法做到这一点,因此它可以很好地预测类别,但是我们可以在最终散点图中看到类别内向下倾斜的模式。

有什么建议可以改善吗?

1 个答案:

答案 0 :(得分:1)

我不会期望LSTM在与传统方法的所有斗争中都能胜出,但是我确实希望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))

尝试使用上面提供的1万个示例。