Keras timeseriesgenerator:如何一步预测多个数据点?
Keras timeseriesgenerator: how to predict multiple data points in one step?
我有这样的气象数据:
DateIdx winddir windspeed hum press temp
2017-04-17 00:00:00 0.369397 0.155039 0.386792 0.196721 0.238889
2017-04-17 00:15:00 0.363214 0.147287 0.429245 0.196721 0.233333
2017-04-17 00:30:00 0.357032 0.139535 0.471698 0.196721 0.227778
2017-04-17 00:45:00 0.323029 0.127907 0.429245 0.204918 0.219444
2017-04-17 01:00:00 0.347759 0.116279 0.386792 0.213115 0.211111
2017-04-17 01:15:00 0.346213 0.127907 0.476415 0.204918 0.169444
2017-04-17 01:30:00 0.259660 0.139535 0.566038 0.196721 0.127778
2017-04-17 01:45:00 0.205564 0.073643 0.523585 0.172131 0.091667
2017-04-17 02:00:00 0.157650 0.007752 0.481132 0.147541 0.055556
2017-04-17 02:15:00 0.122101 0.003876 0.476415 0.122951 0.091667
我的目标:使用 keras timeseriesgenerator (from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator
) 一次训练和预测多个数据点(多行),例如不做
[input X] | [targets y]
[dp1, dp2, dp3, dp4, dp5] | [dp6]
[dp2, dp3, dp4, dp5, dp6] | [dp7]
[dp3, dp4, dp5, dp6, dp7] | [dp8]
...
但要做
[input X] | [targets y]
[dp1, dp2, dp3, dp4, dp5] | [dp6, dp7, dp8]
[dp2, dp3, dp4, dp5, dp6] | [dp7, dp8, dp9]
[dp3, dp4, dp5, dp6, dp7] | [dp8, dp9, dp10]
...
我可以用
实现顶级预测
generator = TimeseriesGenerator(
X,
X,
length=5,
sampling_rate=1,
stride=1,
start_index=0,
end_index=None,
shuffle=False,
reverse=False,
batch_size=1,
)
,但我还没有想出如何为第二种预测调整生成器选项。
是否有一种简单的方法可以使用时间序列生成器实现对 3 个数据点的预期预测 window?如果没有,你能建议我一些代码来装箱我的预测 y
来完成任务吗?发送
您可以使用 TimeSeries 生成器来更改目标条目。具体来说,由于您想预测下一个时间步长,因此您的目标应该是某种形式
target=np.concatenate((np.roll(X, -1, axis=0),
np.roll(X, -2, axis=0),
np.roll(X, -3, axis=0)
),axis=1)
滚动会使你的行向下移动,你可能应该扔掉目标的最后两行。
因此,当您定义生成器时,您现在可以使用 target
对象作为参数:
generator = TimeseriesGenerator(
X,
target,
length=5,
sampling_rate=1,
stride=1,
start_index=0,
end_index=None,
shuffle=False,
reverse=False,
batch_size=1,
)
请注意,现在,当您调用 model.fit
时,它期望输出形状像 3dim_colX,因此您的模型架构 and/or损失函数需要考虑到这一点,因此您应该直接更改最后一层的输出暗淡,或者使用 layer.concatenate([model_timeplus1,model_timeplus2,model_timeplus3], axis=-1)
组合 3 个模型
如果选择共享权重模型(单个nn生成的三个预测值model_timeplus1
):
layer.concatenate([model_timeplus1,model_timeplus1,model_timeplus3], axis=-1)
相当于一个展开的recursive neural network.
我有这样的气象数据:
DateIdx winddir windspeed hum press temp
2017-04-17 00:00:00 0.369397 0.155039 0.386792 0.196721 0.238889
2017-04-17 00:15:00 0.363214 0.147287 0.429245 0.196721 0.233333
2017-04-17 00:30:00 0.357032 0.139535 0.471698 0.196721 0.227778
2017-04-17 00:45:00 0.323029 0.127907 0.429245 0.204918 0.219444
2017-04-17 01:00:00 0.347759 0.116279 0.386792 0.213115 0.211111
2017-04-17 01:15:00 0.346213 0.127907 0.476415 0.204918 0.169444
2017-04-17 01:30:00 0.259660 0.139535 0.566038 0.196721 0.127778
2017-04-17 01:45:00 0.205564 0.073643 0.523585 0.172131 0.091667
2017-04-17 02:00:00 0.157650 0.007752 0.481132 0.147541 0.055556
2017-04-17 02:15:00 0.122101 0.003876 0.476415 0.122951 0.091667
我的目标:使用 keras timeseriesgenerator (from tensorflow.keras.preprocessing.sequence import TimeseriesGenerator
) 一次训练和预测多个数据点(多行),例如不做
[input X] | [targets y]
[dp1, dp2, dp3, dp4, dp5] | [dp6]
[dp2, dp3, dp4, dp5, dp6] | [dp7]
[dp3, dp4, dp5, dp6, dp7] | [dp8]
...
但要做
[input X] | [targets y]
[dp1, dp2, dp3, dp4, dp5] | [dp6, dp7, dp8]
[dp2, dp3, dp4, dp5, dp6] | [dp7, dp8, dp9]
[dp3, dp4, dp5, dp6, dp7] | [dp8, dp9, dp10]
...
我可以用
实现顶级预测generator = TimeseriesGenerator(
X,
X,
length=5,
sampling_rate=1,
stride=1,
start_index=0,
end_index=None,
shuffle=False,
reverse=False,
batch_size=1,
)
,但我还没有想出如何为第二种预测调整生成器选项。
是否有一种简单的方法可以使用时间序列生成器实现对 3 个数据点的预期预测 window?如果没有,你能建议我一些代码来装箱我的预测 y
来完成任务吗?发送
您可以使用 TimeSeries 生成器来更改目标条目。具体来说,由于您想预测下一个时间步长,因此您的目标应该是某种形式
target=np.concatenate((np.roll(X, -1, axis=0),
np.roll(X, -2, axis=0),
np.roll(X, -3, axis=0)
),axis=1)
滚动会使你的行向下移动,你可能应该扔掉目标的最后两行。
因此,当您定义生成器时,您现在可以使用 target
对象作为参数:
generator = TimeseriesGenerator(
X,
target,
length=5,
sampling_rate=1,
stride=1,
start_index=0,
end_index=None,
shuffle=False,
reverse=False,
batch_size=1,
)
请注意,现在,当您调用 model.fit
时,它期望输出形状像 3dim_colX,因此您的模型架构 and/or损失函数需要考虑到这一点,因此您应该直接更改最后一层的输出暗淡,或者使用 layer.concatenate([model_timeplus1,model_timeplus2,model_timeplus3], axis=-1)
组合 3 个模型
如果选择共享权重模型(单个nn生成的三个预测值model_timeplus1
):
layer.concatenate([model_timeplus1,model_timeplus1,model_timeplus3], axis=-1)
相当于一个展开的recursive neural network.