【问题标题】:Keras timeseriesgenerator: how to predict multiple data points in one step?Keras timeseriesgenerator:如何一步预测多个数据点?
【发布时间】:2020-10-27 20:21:21
【问题描述】:

我的气象数据如下所示:

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 个数据点的预测窗口?如果没有,您能否建议我一些代码来合并我的预测y 以完成任务?天呐

【问题讨论】:

  • 这里有点不清楚你想要什么。您的模型是否需要 y 个目标和三个条目进行训练,或者您的模型是否已经训练并且您只想在三个不同的窗口上调用 predict?如果是第一个,则需要更改生成器的目标输入以适应模型的输出形状。您能否在问题中包含这些详细信息?
  • @JuanCarlosRamirez 我确认我想要你提到的第一个案例 - 在这两个案例中训练并随后预测目标 [dp_N, dp_N+1, dp_N+2] 在一个步骤中。我知道我可以在没有TimeseriesGenerator 的情况下实现这一点,如果我使用附加代码创建自己一个合适的目标数组y。但是我想知道我是否可以使用TimeseriesGenerator 来完成该任务,因为它非常方便!你有什么建议或者简单的预处理代码来创建数组y

标签: python tensorflow keras time-series recurrent-neural-network


【解决方案1】:

您可以使用 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,因此您的模型架构和/或损失函数需要考虑这一点,因此您应该更改直接输出最后一层的暗淡,或使用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

【讨论】:

  • 谢谢,我会尽快(周日或周一)尝试一下,如果成功的话,我会接受它作为答案!
  • 谢谢,当我用作标签y = np.stack((np.roll(X, 0, axis=0), np.roll(X, -1, axis=0), np.roll(X, -2, axis=0)),axis=1) 时,您的建议似乎奏效了。但我现在坚持你所说的 - Xy 有不同的形状((5264, 12)和(5264,3,12))并且模型抛出错误。您能否详细说明layer.concatenate 的使用或提供我一个最小的工作模型架构?
  • 它们将具有不同的形状,因为来自预测的元素的维度是输入的 3 倍。如果您希望目标具有形状 (5264, 3*12),您可以使用 np.concatenate(np.roll(X, -1, axis=0), np.roll(X, -2, axis=0), np.roll(X, -3, axis=0), axis=1) 而不是堆栈。您的模型训练现在需要您的模型输出层具有形状 (3*12,) 而不是 (12,) 这就是我建议 layer.concatenate 的原因(我将编辑答案以显示示例)
  • 对于未来的读者:在最大池和RepeatVector 的帮助下也可以创建一个可以使用这种输入输出形状的架构,请参见此处:stackoverflow.com/a/62917566/5838180
猜你喜欢
  • 2020-08-21
  • 2020-07-24
  • 2020-09-28
  • 2018-03-09
  • 1970-01-01
  • 2018-01-12
  • 2017-07-13
  • 2018-02-16
  • 2018-10-23
相关资源
最近更新 更多