LSTM应该是捕获时间序列数据中路径依赖的正确工具。
我决定进行一个简单的实验(模拟),以评估LSTM在多大程度上能够理解路径依赖性。
设置非常简单。我只是模拟了来自4个不同数据生成过程的一堆(N = 100)路径。其中两个过程表示 real 的增加和 real 的减少,而其他两个 fake 趋势最终恢复为零。
下图显示了每个类别的模拟路径:
将为候选机器学习算法提供路径的前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);
样本外结果由以下散点图汇总:
如您所见,随机森林模型明显优于LSTM。后者似乎无法区分 real 和 fake 趋势。
一些评论:
由于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'])
不过,随机森林模型的效果更好。关键是,RF似乎understand
取决于班级条件,较高的p8
会预测较低的结果p10-p8
,反之亦然,这是由于添加噪声的方式所致。 LSTM似乎无法做到这一点,因此它可以很好地预测类别,但是我们可以在最终散点图中看到类别内向下倾斜的模式。
有什么建议可以改善吗?
答案 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万个示例。