当前位置: 首页 > 知识库问答 >
问题:

Keras LSTM:时间序列多步多特征预测-结果差

崔棋
2023-03-14

我有一个包含一整年数据的时间序列数据集(日期是索引)。数据每15分钟测量一次(全年),结果是每天96个时间步。数据已规范化。这些变量是相关的。除VAR外的所有变量都是天气度量值。

VAR在一天期间和一周期间都是季节性的(因为它在周末看起来有点不同,但每个周末都不一样)。VAR值是固定的。我想预测未来两天(前192步)和未来七天(前672步)的VAR值。

以下是数据集的示例:

DateIdx               VAR       dewpt       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

下面是我准备train_X和train_y的代码:

#X -> is the whole dataframe
#Y -> is a vector of VAR from whole dataframe, already shifted 1 step ahead

#329 * 96 = 31584
train_X = X[:31584]
train_X = train_X.reshape(train_X.shape[0],1,5)
train_Y = Y[:31584]  
train_Y = train_Y.reshape(train_Y.shape[0],1)

为了预测下一个VAR值,我想使用过去的672个时间步骤(整周度量)。为此,我设置了batch_size=672,使“fit”命令如下所示:

history = model.fit(train_X, train_Y, epochs=50, batch_size=672, validathtml" target="_blank">ion_data=(test_X, test_Y), shuffle=False)  

下面是我的网络的体系结构:

model = models.Sequential()
model.add(layers.LSTM(672, input_shape=(None, 672), return_sequences=True))
model.add(layers.Dropout(0.2))
model.add(layers.LSTM(336, return_sequences=True))
model.add(layers.Dropout(0.2))
model.add(layers.LSTM(168, return_sequences=True))
model.add(layers.Dropout(0.2))
model.add(layers.LSTM(84, return_sequences=True))
model.add(layers.Dropout(0.2))
model.add(layers.LSTM(21, return_sequences=False))
model.add(layers.Dense(1))
model.compile(loss='mae', optimizer='adam')
model.summary()

从学习过程中情节

为了预测的目的,我准备了一组数据,其中包含最后672个步骤的所有值和96个没有VAR值--这应该是预测的。我还使用了自回归,因此我在每次预测后更新了VAR,并将其用于下一次预测。

predX数据集(用于预测)如下所示:

print(predX['VAR'][668:677])

DateIdx            VAR
2017-04-23 23:00:00    0.307573
2017-04-23 23:15:00    0.278207
2017-04-23 23:30:00    0.284390
2017-04-23 23:45:00    0.309118
2017-04-24 00:00:00         NaN
2017-04-24 00:15:00         NaN
2017-04-24 00:30:00         NaN
2017-04-24 00:45:00         NaN
2017-04-24 01:00:00         NaN
Name: VAR, dtype: float64

下面是我用来预测接下来96个步骤的代码(自回归):

stepsAhead = 96
historySteps = 672

for i in range(0,stepsAhead):
    j = i + historySteps
    ypred = model.predict(predX.values[i:j].reshape(1,historySteps,5))
    predX['VAR'][j] = ypred

不幸的是,结果很差,与预期相差甚远:

有预测数据的曲线图

结果与前一天合并:

结合前一天的预测数据

除了“我做错了什么”的问题外,我想问几个问题:

共有1个答案

须巴英
2023-03-14

看起来在如何组织数据来训练RNN方面存在混乱。让我们讨论一下这些问题:

  1. 有了二维数据集(total_samples,5)后,您可以使用TimeseriesGenerator创建一个滑动窗口,该窗口将为您生成(batch_size,past_timesteps,5)。在这种情况下,您将使用.fit_generator来训练网络。
  2. 如果你得到同样的结果,50个历元应该没问题。您通常根据网络的性能进行调整。但如果要比较两种不同的网络体系结构,则应将其固定不变。
  3. 架构非常庞大,因为您的目标是一次预测所有672个未来值。您可以设计网络,使其学会一次预测一个测量值。在预测时间,您可以预测一个点,然后再次输入该点以预测下一个点,直到得到672。
  4. 这与答案3相关联,您可以学习一次预测一个,并在训练后将预测链接到n个预测。

单点预测模型可能如下所示:

model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape=(past_timesteps, 5))
model.add(LSTM(64))
model.add(Dense(1))
 类似资料:
  • 我正在阅读Keras中关于使用LSTM进行多元时间序列预测的教程https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/#comment-442845 我已经看完了整个教程,遇到了一个如下的问题- 在本教程中,在步骤“t-1”中,列车和测试拆分有8个功能,即“污染”、“露水”、“温度”、

  • 根据教程,我为我的数据集开发了多元输入多步骤LSTM时间序列预测模型(https://machinelearningmastery.com/how-to-develop-lstm-models-for-multi-step-time-series-forecasting-of-household-power-consumption/). 然而,我有一个非常奇怪的问题,那就是,当我使用较小的样本(5

  • 我当前的Cucumber文件如下所示: 所以现在我想再添加几个场景,可能是在同一个文件中进行API测试。所以我想为此创建一个新特性,而不是使用Feature:Test Online application页面。这样我就不需要为API测试创建单独的特性文件。

  • 我试图使用Keras对多个变量进行同时预测。在这里使用这个例子,我想预测所有特征的值,包括pm 2.5,DEWP,TEMP等,而不仅仅是污染(pm 2.5)。本质上,这是,给定所有变量,建立一个模型来预测所有变量作为时间序列,而不仅仅是预测一个变量。 我使用重塑后的3D数据修改了原始示例代码,但出现了一个错误。代码如下: 输出为: 数据集在这里可用。 我的问题是: Keras LSTM层不是为此设

  • 问题内容: 有没有一种方法可以使用Oracle分析功能为数据集生成时间序列预测?我们如何在SQL / ORACLE中执行外推。 下面是我的需要 我有如下数据集,我想预测/推断明年 问题答案: 您可以使用REGR线性回归函数创建简单的预测。 下面是示例架构。或者,您可以使用此SQLFiddle。 该函数处理数字对,它不理解诸如“收入不能低于0”之类的业务规则。如果您希望将预测限制为始终保持在0或之上

  • 问题内容: 该模块的文档显示了如何将队列传递给以开头的进程。但是,如何与开始的异步工作进程共享队列?我不需要动态加入或其他任何方式,而只是工人(反复)将其结果报告给基地的一种方法。 失败的原因是: 。我理解这意味着什么,并且我理解继承的建议,而不是要求进行酸洗/酸洗(以及所有Windows特殊限制)。但如何 做 我通过队列的方式,作品?我找不到一个示例,并且我尝试了多种失败的替代方法。请帮忙? 问