Keras timeseriesgenerator:如何一步预测多个数据点?

2024-05-19 08:37:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下气象数据:

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,
)

,但我还没有想出如何调整第二类预测的生成器选项

使用timeseriesgenerator是否有一种简单的方法来实现3个数据点的预期预测窗口?如果没有,你能给我推荐一些代码来实现这个任务吗?Tnx


Tags: 数据inputkerastargetsdp1dp2timeseriesgeneratordp4
1条回答
网友
1楼 · 发布于 2024-05-19 08:37:53

使用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\u colX,因此您的模型架构和/或损失函数需要考虑这一点,因此您应该直接更改最后一层的输出dim,或者使用layer.concatenate([model_timeplus1,model_timeplus2,model_timeplus3], axis=-1)组合3个模型 如果您选择共享权重模型(由单个nnmodel_timeplus1生成的三个预测值):

layer.concatenate([model_timeplus1,model_timeplus1,model_timeplus3], axis=-1)

它相当于展开的recursive neural network

相关问题 更多 >

    热门问题