改进 LSTM 模型对数据集噪声的拟合

问题描述 投票:0回答:3

我是一名数据分析师,试图通过机器学习来提高我的知识。

我已经完成了时间序列数据集的模型,其中每个点相隔 1 天,没有间隙。我尝试的具体模型类型是使用tensorflow的keras的多层自回归双向LSTM,请参阅下面的模型特定代码:

model = keras.Sequential()
model.add(Bidirectional(LSTM(
            units = 128,
            input_shape = (X_train.shape[1], X_train.shape[2]),
            return_sequences=True)))
model.add(Bidirectional(LSTM(
            units = 64,
            input_shape = (X_train.shape[1], X_train.shape[2]),
            return_sequences=True)))
model.add(Bidirectional(LSTM(
            units = 32,
            input_shape = (X_train.shape[1], X_train.shape[2]),
            return_sequences=True)))
model.add(Bidirectional(LSTM(
            units = 16,
            input_shape = (X_train.shape[1], X_train.shape[2]),
            return_sequences=False)))
model.add(keras.layers.Dense(16))
model.add(keras.layers.Dropout(rate = 0.5))
model.add(keras.layers.Dense(1))
model.compile(loss='mean_squared_error', optimizer='Adam')
history = model.fit(
    X_train, y_train,
    epochs = 100,
    batch_size = 128,
    validation_split = 0.2,
    shuffle = False
) 
print(model.summary())

一位高级员工告诉我,对于这个特定的学习任务来说,这可能有点过分了,但我想添加它以实现完全透明。 请参阅下面的摘要:

 Layer (type)                Output Shape              Param #
=================================================================
 bidirectional (Bidirectiona  (None, 50, 256)          133120
 l)

 bidirectional_1 (Bidirectio  (None, 50, 128)          164352
 nal)

 bidirectional_2 (Bidirectio  (None, 50, 64)           41216
 nal)

 bidirectional_3 (Bidirectio  (None, 32)               10368
 nal)

 dense (Dense)               (None, 16)                528

 dropout (Dropout)           (None, 16)                0

 dense_1 (Dense)             (None, 1)                 17

=================================================================
Total params: 349,601
Trainable params: 349,601
Non-trainable params: 0
_________________________________________________________________

模型报告损失值(100 个时期后,使用均方误差):

损失:0.0040 - val_loss:0.0050(过拟合)

使用以下方法导出的 RMSE:

math.sqrt(mean_squared_error(y_train,train_predict))
math.sqrt(mean_squared_error(y_test,test_predict))
以及
sklearn.metrics
以及来自上述包的内置函数
mean_squared_error

训练 RMSE:28.795422522129595

测试均方根误差:34.17014386085355

对于图形表示:

我终于得出了我的问题;我如何更好地拟合我的模型以更接近地表示数据中的噪声,因为我认为这是导致高 RMSE 值的原因。 我研究了注意力机制,希望能够突出显示数据中的特定波峰和波谷,但似乎这些机制最好与面向图像/文本预测的模型一起使用。我可以尝试训练更多的纪元,但模型已经有点过拟合了,所以这会进一步加剧这个特定问题。

我知道这是一个相当开放式的问题,但我已尽力“展示我的工作”,并提前感谢您。

python tensorflow machine-learning keras lstm
3个回答
0
投票

对于这项任务来说,这确实是一个巨大的杀伤力。首先减少 LSTM 层的数量,并在 LSTM 层之间和每个 LSTM 内添加 dropout。


0
投票

您只将该信号作为输入,然后尝试预测它的值?请记住,噪声很可能实际上只是噪声,并且无法仅根据该数据来预测它。

注意力听起来并没有什么帮助,除非你有理由认为回顾其他时间步骤可以帮助你预测现在正在发生的事情。许多系统都具有马尔可夫性质:如果您现在知道状态,那么导致该状态的历史中的任何内容都不重要。

信号具有清晰的周期性,您可以通过包含 sin 和 cos 特征(就像我在此处针对一天中的时间和一年中的时间所做的那样)使模型更容易学习这一点:

https://www.tensorflow.org/tutorials/structed_data/time_series

您也可以尝试其他功能,例如 diff 或 EMA,或其中一些 ARIMA 风格功能。但从根本上来说,如果它是有效的噪声,更好的功能不会有帮助,它们只会帮助你更快地训练到相同的错误水平。


0
投票

感谢分享,你能告诉我这种情况下的序列长度是多少吗?谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.