使用 LSTM 进行多变量时间序列预测

数据挖掘 时间序列 lstm
2022-02-15 01:34:54

我有以下问题:

()= 在时间 t 观察的实值随机向量,一世()R(0,1)

X()= 在时间 t 观察的实值随机向量,X一世()R

我要预测(+1), 给定X(+1)历史。

总而言之,我想根据其历史预测一个观察向量,并将另一个观察向量预测为相同的时间戳。

更清楚地说:假设我想预测伦敦和都柏林的每日气温,知道曼彻斯特和利物浦以及伦敦和都柏林(以及曼彻斯特和利物浦)历史数据的同一天气温。这有点像卡尔曼滤波器,您想在给定一些输出的情况下估计状态变量。

你将如何在 LSTM 中设置这个问题?

1个回答

1)首先也是最重要的,不要将 Yi(t) 历史作为特征。您将只是以复制先前输入以最小化错误的模型结束,即作弊模型。有关更多详细信息,您可以查看我对两个不同问题的解释:

https://stackoverflow.com/questions/52778922/stock-prediction-gru-model-predicting-same-given-values-instead-of-future-stoc/52786399?noredirect=1#comment93125020_52786399

https://stackoverflow.com/questions/52252442/how-to-handle-shift-in-forecasted-value/53141558#53141558

2)通过将 Y(t) 向前滑动一步来创建标签,以便每个样本都有一个 Y(t+1) 的标签。这意味着您将因此删除样本 #1。

3)为您的特征使用每个样本的时间窗口。不要只为标签 y(t+1) 提供您的特征作为 x(t)。例如,窗口大小 w = 10,提供 x(t-9),x(t-8),.....,x(t-1),x(t+1) 作为单个样本标签 y(t+1)。然后你将提升 LSTM 的顺序性,可能会获得更好的性能。

4)您可以将 Keras 用于您的 LSTM 回归任务,看看我旧作品中的简单代码片段,我为您的任务修改了它:

nn = Sequential()
nn.add(LSTM(80, batch_input_shape=(64,11,20), return_sequences=True, recurrent_dropout = 0.1))
nn.add(LSTM(60, recurrent_dropout = 0.2))
nn.add(Dropout(0.2))
nn.add(Dense(40, activation='relu'))
nn.add(Dropout(0.2))
nn.add(Dense(10, activation='relu'))
nn.add(Dense(1))
nn.compile(loss= 'mse, optimizer= 'adam')
nn.fit(x_train, y_train, epochs=15, batch_size=64, shuffle=True, validation_data=(x_dev, y_dev))
y_pred = nn.predict(x_dev, batch_size=64)

其中batch_input_shape=(64,10,25)说明您的批量大小为 64(每次梯度下降训练 64 个样本),窗口大小为 10,并且您有 25 个不同的特征。如果您感到困惑,您可以删除代码中有关 dropout 的任何内容;它们只是为了防止过度拟合。

注意:不要忘记在开始时标准化您的数字输入数据!

希望我能帮上忙。祝你好运!