改进 LSTM 模型以适应数据集噪声
Improving an LSTM models fit to a datasets noise
我是一名数据分析师,试图通过机器学习提高我的知识。
我已经完成了时间序列数据集的模型,其中每个点相隔 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 个时期后,使用均方误差):
loss: 0.0040 - val_loss: 0.0050 (Overfit)
RMSE 派生自:math.sqrt(mean_squared_error(y_train,train_predict))
和 math.sqrt(mean_squared_error(y_test,test_predict))
以及 sklearn.metrics
和来自上述包的内置函数 mean_squared_error
。
Train RMSE: 28.795422522129595
Test RMSE: 34.17014386085355
图形表示:
我终于提出了我的问题;我如何更好地拟合我的模型以更接近地表示数据中的噪声,因为我认为这是导致高 RMSE 值的原因。
我研究了注意力机制,希望能够突出显示数据中的特定波峰和波谷,但似乎这些最适合与 image/text 面向预测的模型一起使用。我可以尝试训练更多的时期,但模型已经有点过拟合,所以这会进一步加剧这个特定问题。
我知道这是一个相当开放的问题,但我已尽力“展示我的工作”,在此先感谢您。
对于这项任务来说,这看起来确实有点矫枉过正。首先减少 LSTM 层的数量,并在 LSTM 层之间和每个 LSTM 内添加 dropout。
你只有那个信号作为输入,你正试图预测它的值?请记住,噪音很可能实际上只是噪音,无法仅根据该数据进行预测。
注意力听起来好像没什么用,除非你有理由认为回顾其他时间步可以帮助你预测正在发生的事情现在。许多系统都具有马尔可夫 属性:如果您了解现在的状态,那么引导该状态的历史并不重要。
信号具有明显的周期性,您可以通过包含 sin 和 cos 特征来使模型更容易学习这一点,就像我在此处针对一天中的时间和一年中的时间所做的那样:
https://www.tensorflow.org/tutorials/structured_data/time_series
您也可以尝试其他功能,例如 diff 或 EMA,或一些 ARIMA 风格的功能。但从根本上说,如果它有效噪声更好的功能将无济于事,它们只会帮助您更快地训练到相同的错误级别。
我是一名数据分析师,试图通过机器学习提高我的知识。
我已经完成了时间序列数据集的模型,其中每个点相隔 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 个时期后,使用均方误差):
loss: 0.0040 - val_loss: 0.0050 (Overfit)
RMSE 派生自:math.sqrt(mean_squared_error(y_train,train_predict))
和 math.sqrt(mean_squared_error(y_test,test_predict))
以及 sklearn.metrics
和来自上述包的内置函数 mean_squared_error
。
Train RMSE: 28.795422522129595
Test RMSE: 34.17014386085355
图形表示:
我终于提出了我的问题;我如何更好地拟合我的模型以更接近地表示数据中的噪声,因为我认为这是导致高 RMSE 值的原因。 我研究了注意力机制,希望能够突出显示数据中的特定波峰和波谷,但似乎这些最适合与 image/text 面向预测的模型一起使用。我可以尝试训练更多的时期,但模型已经有点过拟合,所以这会进一步加剧这个特定问题。
我知道这是一个相当开放的问题,但我已尽力“展示我的工作”,在此先感谢您。
对于这项任务来说,这看起来确实有点矫枉过正。首先减少 LSTM 层的数量,并在 LSTM 层之间和每个 LSTM 内添加 dropout。
你只有那个信号作为输入,你正试图预测它的值?请记住,噪音很可能实际上只是噪音,无法仅根据该数据进行预测。
注意力听起来好像没什么用,除非你有理由认为回顾其他时间步可以帮助你预测正在发生的事情现在。许多系统都具有马尔可夫 属性:如果您了解现在的状态,那么引导该状态的历史并不重要。
信号具有明显的周期性,您可以通过包含 sin 和 cos 特征来使模型更容易学习这一点,就像我在此处针对一天中的时间和一年中的时间所做的那样:
https://www.tensorflow.org/tutorials/structured_data/time_series
您也可以尝试其他功能,例如 diff 或 EMA,或一些 ARIMA 风格的功能。但从根本上说,如果它有效噪声更好的功能将无济于事,它们只会帮助您更快地训练到相同的错误级别。