预测具有多个特征的并行时间序列

数据挖掘 喀拉斯 时间序列 lstm
2022-02-11 01:33:47

我正在尝试预测 2 家具有相似人口统计特征的百货商店的销售额。我的目标是制作一个单一的 LSTM 模型来预测这些具有多个特征的并行时间序列的销售额。

我的训练输入特征是

+----------+-------+--------------+-------+
|   Date   | Store | DayOfTheWeek | Sales |
+----------+-------+--------------+-------+
| 1/1/2019 | A     |            2 |   100 |
| 1/2/2019 | A     |            3 |   200 |
| 1/3/2019 | A     |            4 |   150 |
| 1/1/2019 | B     |            2 |   300 |
| 1/2/2019 | B     |            3 |   550 |
| 1/3/2019 | B     |            4 |  1000 |
+----------+-------+--------------+-------+

我的培训输出将是

+----------+-------+--------------+-------+
|   Date   | Store | DayOfTheWeek | Sales |
+----------+-------+--------------+-------+
| 1/4/2019 | A     |            5 |   220 |
| 1/4/2019 | B     |            5 |   700 |
+----------+-------+--------------+-------+

问题是 LSTM 将输入作为 3D 即(n_sample, n_timesteps, n_features)我可以为特定商店传递单个时间序列(e.g. A)

如果我有一个单变量多时间序列,我可以如下重塑我的输入数据并将其传递给 LSTM。

+----------+---------+---------+
|   Date   | A_Sales | B_Sales |
+----------+---------+---------+
| 1/1/2019 |     100 |     300 |
| 1/2/2019 |     200 |     550 |
| 1/3/2019 |     150 |    1000 |
+----------+---------+---------+ 

但我需要确定如何预测并行多元时间序列?有没有其他方法可以在输入 LSTM 层中定义有 2 个时间序列,每个序列有 2 个特征,即 (2*2)。

1个回答

这里有两种建模问题的方法。第一个更简单,第二个更复杂,但更接近您对问题的原始陈述。

存储为输入特征

您可以将商店视为传递给 LSTM 的功能。例如,对于两个不同的存储,只需添加一个二进制输入特征“存储”,其中存储 A 为 0,存储 B 为 1。

然后,您可以通过这种方式实现它。

from keras.models import Sequential
from keras.layers import LSTM, Dense

timesteps = 20
n_features = 5
model = Sequential()
# add +1 to n_features for the store identifier
model.add(LSTM(32, input_shape=(timesteps,n_features + 1), return_sequences=True))
model.add(LSTM(32))
model.add(Dense(1,activation="relu"))
model.compile(optimizer="rmsprop", loss="mse")

在给定时间步长的一个数据样本将是一个形式为 (feature_1, feature_2, ..., feature_n, store) 的向量。

多元时间序列预测

在这里,我们输入两个时间序列,旨在预测两个商店的下一个值。所以你有一个单独的共享 LSTM 处理存储,然后连接两个生成的嵌入,并计算预测值。

from keras.models import Model
from keras.layers import LSTM, Dense, Concatenate, Input

timesteps = 20
n_features = 5

# Store A and B time-series inputs
a_inputs = Input(shape=(timesteps, n_features))
b_inputs = Input(shape=(timesteps, n_features))

# Stacked LSTM
lstm_1 = LSTM(32, return_sequences=True)
lstm_2 = LSTM(32)
# Stacked LSTM on Store A 
a_embedding = lstm_1(a_inputs)
a_embedding = lstm_2(a_embedding)
# Stacked LSTM on Store B
b_embedding = lstm_1(b_inputs)
b_embedding = lstm_2(b_embedding)

# Concatenate embeddings and define model
outputs = Concatenate()([a_embedding, b_embedding])
outputs = Dense(64)(outputs)
outputs = Dense(2, activation="relu")(outputs)
model = Model([a_inputs, b_inputs], outputs)
model.compile(optimizer="rmsprop", loss="mse")

第 7.1.5 节共享权重共享的启发,在 F. Chollet 的 Python 深度学习中