使用 RNN (LSTM) 预测时间序列的一个未来值

数据挖掘 时间序列 深度学习 rnn 预言
2021-09-26 04:19:18

我已经阅读了几篇关于 RNN(特别是 LSTM)以及我们如何使用它们进行时间序列预测的论文、文章和博客文章。在我发现的几乎所有示例和代码中,问题都被定义为x根据以前的数据查找时间序列的下一个值。我要解决的问题如下:

  • 假设我们有t一个时间序列的值,它在 time 的值是t+1多少?

因此,使用现有的不同 LSTM 包(deeplearning4j、keras、...),这就是我现在正在做的事情:

  1. 创建一个 LSTM 网络并将其拟合到t样本中。我的网络有一个输入和一个输出。因此,对于输入,我将有以下模式,我称它们为训练数据:

    t_1,t_2

    t_2,t_3

    t_3,t_4

  2. 下一步是使用例如t_4作为输入和期望t_5作为输出然后使用t_5作为输入和期望t_6作为输出等等。

  3. 完成预测后,我会使用它t_5,t_6来更新我的模型。

我的问题:这是正确的做法吗?如果是,那么我不知道它是什么batch_size意思以及它为什么有用。

注意:我想到的另一种选择类似于生成一系列字符的示例,一次一个字符。在这种情况下,batch_size将是一系列数字,我期待下一个具有相同大小的系列,而我正在寻找的一个值将是该系列中的最后一个数字。我不确定上述哪种方法是正确的,并且非常感谢这方面的任何帮助。

谢谢

2个回答
  1. 你这样做的方式很好。时间序列预测的想法基本上是做回​​归。可能你在其他地方看到的向量,它大约是输入的大小,或者基本上它意味着特征向量。现在,假设您有t时间步长并且想要预测时间t+1,使用时间序列分析方法或 RNN 模型(如 LSTM)的最佳方法是在数据上训练您的模型以t达到预测 时间t+1然后t+1将是下一个预测的输入,依此类推。这里有一个很好的例子它基于使用 pybrain 框架的 LSTM。
  2. 关于您的问题batch_size,首先您需要了解批量学习与在线学习之间的区别。批量大小基本上表示您的算法将在梯度下降优化中使用的样本子集,它与您输入数据的方式或您期望输出的方式无关。有关这方面的更多信息,我建议你阅读这篇 kaggle帖子。

我最近在 LSTM 上做了很多阅读和代码编写,所以我会尝试参与并回答这个问题,尽管我还不熟悉 Theano Keras 或 deeplearning4j。从 Internet 上快速搜索看来,batch_size 的含义似乎取决于程序,因此查看在线帮助文​​件可能是个好主意。从我收集到的信息来看,它可以指几个不同的东西:1)在下一次检查输入和/或输出之前输入训练算法进行处理的案例数。2) 在下一次检查输入和/或输出之前,训练算法在最后一组输入上的迭代次数。3) 输入 LSTM 算法的序列大小。

考虑到这一点,鉴于以下链接,几乎可以肯定 Theano 和 deeplearning4j 指的是 #1 和/或 #2。另一方面,我最近遇到过期刊文章,其中批量大小指的是序列大小,因此请注意软件和学术术语之间的潜在不匹配:

☻ CrossValidated 上的这篇文章表明,在 deeplearning4j 和 Keras 中,batch_size 应设置为 1 以进行在线学习。所以换句话说,batch_size 控制下一次输入/输出检查之前的训练周期数。

☻根据这个 Github 页面,在 Keras 中,batch_size 显然设置了在再次检查输入和/或输出之前要执行的训练周期数或要训练的案例数

这个 Github 包似乎也使用不同的变量来表示序列长度。

☻ 从 Tony Kanh 在此 StackOverflow 页面的回答中,在 TensorFlow 中,batch_size 决定了输出向量的大小。这可能与每个训练周期中处理的项目数相同,因为将其乘以 num_steps 和大小(可能是序列大小?)确定输出的维度。

☻ 对于像双向神经网络这样密切相关的神经网络,批量大小显然等同于序列大小,而不是输入训练算法的案例数量。见第 5,Berglund 等人,“作为生成模型的双向递归神经网络”,可在康奈尔大学图书馆网站上获得,无需付费专区

正如我所说,我还没有使用过 Theano 和 deeplearning4j,但我希望至少提供一个起点来找到正确的答案。