多变量时间序列 (LSTM) Keras 的多步预测

数据挖掘 机器学习 喀拉斯 时间序列 lstm
2022-02-26 00:43:24

我一直在尝试了解如何使用 Keras 为多元时间序列预测构建 LSTM 模型,但我仍然不确定如何以正确的形状呈现数据。

My Dataset:
•   5 cities.
•   Each with 2 features. Temperature and humidity.
•   Daily records of the last 10 weeks(Monday, Tuesday, …, Sunday)

我想做的事:

鉴于周一一个城市新一周的记录,我想预测该城市剩余 6 天的温度和湿度。即多变量时间序列的多步预测。Output shape(6,2)

我是如何开始的:

对于每个城市,the input shape [(num_samples, num_time_steps, num_features) ] would be (10, 7, 2).

For 10 weeks,我将有五个形状相同的独特样本(5 个城市) (70, 2)因此,如果我将所有垂直堆叠,我将拥有(350, 2)3D shape (50,7,2). 然后创建一个滞后 1 的监督系列,我将拥有一个shape(244, 4)

# Split train/test data. 
train on 7-weeks. So input_shape= 5*(7,7,2) = (35,7,2)
test on 3-weeks. . So input_shape= 5*(3,7,2) = (15,7, 2)

我感到困惑的是:

上述布局似乎无视每个样本的独特性。我看了这个,但仍然对如何将其转换为回归模型感到有些困惑。

我希望网络分别训练每个城市的数据,如这张图片所示 ,我将不胜感激任何建议。谢谢

1个回答

您应该使用 Seq2Seq 模型。在 RNN 系列中,Seq2seq 模型代表了多步预测的最佳选择。另一方面,更经典的 RNN 并不适合预测长序列。

如果需要在 TensorFlow 2.0/Keras 中实现一个 seq2seq 模型,每个模型遵循如下结构:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, RepeatVector, Dense, TimeDistributed
from tensorflow.keras.activations import elu

# these are just made up hyperparameters, change them as you wish
hidden_size = 50


seq2seq = Sequential([

    LSTM(hidden_size, input_shape = (input_sequence_length, no_vars)),

    RepeatVector(prediction_length), 

    LSTM(hidden_size, return_sequences = True), 

    Dense(hidden_size, activation = elu)

    TimeDistributed(Dense(1, activation = elu))

])

然后像往常一样用 seq2seq.compile() 和 seq2seq.fit() 训练它。

如果你想堆叠更多的 LSTM() 层,只需将它们添加到我上面描述的模型中。请记住,LSTM 模型的计算成本很高;如果没有良好的 GPU,即使是这种“基本”模型也可能需要很长时间才能训练。

查看您的图像,我建议的一项修改是使 LSTM 编码器和解码器部分具有相同的大小和深度。

或者,您可以实现更经典的“类似自动编码器”的架构,其中 LSTM() 层用于编码和解码,而 Dense() 层位于中间。然而,seq2seq 模型是目前最强大的。

据我所知,唯一比这更先进的模型是注意力模型。问题是它们是如此先进,以至于 TensorFlow/Keras 没有内置的层,你必须创建自己的自定义层(这很痛苦)。我发现的注意力模型的唯一广泛实现来自这篇博文,但这里的事情会非常非常复杂。我还没有尝试实现一个。