使用循环神经网络的时间序列预测指南(包含用LSTMs预测未来的货币汇率)

Statsbot团队发表过一篇关于使用时间序列分析来进行异常检测的文章。文章地址:https://blog.statsbot.co/time-series-anomaly-detection-algorithms-1cef5519aef2
我们想用一个长短期记忆网络模型(LSTMs)来讨论时间序列预测。这篇文章将告诉你如何利用时间序列分析来预测未来的货币汇率,并利用时间序列来进行机器学习。

序列问题

让我们从讨论序列问题开始。涉及序列的最简单的机器学习问题是一个“一对一”问题。

一对一

在这种情况下,我们对模型有一个张量或数据输入,模型用给定的输入生成一个预测。线性回归、分类,甚至是卷积网络的图像分类都属于这一类。我们可以扩展这个构想,使模型能够使用输入和输出的过去值。

它被认为是“一对多”问题。“一对多”问题是从“一对一”问题开始的。 “一对一”问题比如,我们把数据输入到模型,然后模型生成一个输出。但是,模型的输出现在反馈给模型作为一个新的输入。这个模型现在可以生成一个新的输出,我们可以无限地继续下去。现在你就可以知道为什么这些被称为递归神经网络(RNNs)。

一对多

一个递归的神经网络能够处理序列问题,因为它们的连接形成了一个有向的循环(directed cycle)。换句话说,它们可以通过使用自己的输出作为下一个步骤的输入来保持状态从一个迭代到下一个迭代。在编程术语中,这就像运行一个带有特定输入和内部变量的固定程序。如果我们将时间轴展开(unroll),那么最简单的递归神经网络可以被看作是一个完全连接的神经网络。

RNN展开时间

在这个单变量的例子中,只有两个权重。权重乘以当前的输入xt,即u,并且权重和之前的输出yt-1相乘,也就是w。这个公式就像指数加权移动平均值(EWMA),通过它的输出过去值来做输入的当前值。

我们可以简单地通过把单元堆叠在一起来建立一个深层的神经网络。一个简单的递归神经网络只适用于短期记忆。我们会发现,如果我们有更长的时间依赖,它就会从根本问题受到困扰。

时间序列预测

我对一个递归神经网络的优势印象深刻,并决定用它们来预测美元和印度卢比之间的汇率。这个项目使用的数据集是基于1980年1月2日到2017年8月10日之间的汇率数据。稍后,我将给你一个下载这个数据集的链接并进行实验。
表格1.数据集的例子
数据集显示在卢比中1美元的值。自1980年1月2日到2017年8月10日以来,我们总共有13730份记录。
USD vs INR
在此期间,用卢比买1美元卢比的价格一直在上涨。可以看到,在2007-2008年期间,美国经济出现了巨大的下滑,这在当时的大衰退中是巨大的。在2000年代末和2010年初,全球市场普遍出现了普遍的经济衰退。

Train-Test Split

现在,为了训练机器,我们需要将数据集划分为测试和训练集。当你进行时间序列的分离(split)训练和测试的时候,这是非常重要的。因此,你一定不希望你的测试数据出现在训练数据之前。在我们的实验中,我们将定义一个日期,比如2010年1月1日,作为我们的分离日期。
训练数据是基于1980年1月2日到2009年12月31日之间的数据,大约有11000个训练数据点。测试数据集是在2010年1月1日到2017年8月10日之间,大约有2700个点。
Train-Test Split
接下来要做的事情是将数据集标准化。你只需要匹配和转换你的训练数据,并转换你的测试数据。这么做的原因是你不想假定你知道你的测试数据的规模。标准化或转换数据意味着新的规模变量(scale variable)将在0到1的范围之间。

神经网络模型

一个完全连接的模型是一个简单的神经网络模型,它被构建为一个简单的回归模型。

作为一个损失函数,我们使用平均平方误差和随机梯度下降作为优化器,在具备充足的时间之后,我们将尝试寻找一个好的局部优化。下面是完整连接层的总结。

完整连接层的总结
在对200个epoch或early_callbacks进行了训练之后,模型都尝试了解数据的模式和行为。由于我们将数据分成训练和测试集,我们现在可以预测测试数据的值,并将它们与实际情况进行比较。
正如你所看到的,下面这个模型并不好。它本质上是在重复之前的值并且有一个微小的变化。完全连接的模型不能从单一的前一个值来预测未来。现在让我们尝试使用一个递归的神经网络,看看它的效果如何。

地面实况(蓝色)和预测(橙色)

长短期记忆网络

我们所使用的递归模型是一个层连续的模型。我们在层中使用了6个LSTM节点,我们给它输入形态设置为(1,1)。
 LSTM模型的总结
最后一层是一个密集层,其中的损失是平均平方误差和随机梯度下降作为优化器。我们对这个模型进行了200个epochs的训练,并进行了early_stopping回调。这个模型的总结显示在上面。
这个模型已经学会了重现数据的全年的形态,并且没有它过去使用一个简单的前馈神经网络的延迟。它仍然低估了某些观测值,而且在这个模型中肯定还有改进的空间。
LSTM预测

模型的变化

在这个模型中可能会有很多变化使它变得更好。你可以始终尝试通过更改优化器来更改配置。我看到的另一个重要变化是通过使用滑动时间窗口方法,该方法来自于流数据管理系统。这种方法来自于一个观点,即只有最近的数据才是重要的。
一个人可以从一年的时间里展示模型数据,并试着对下一年的第一天做出预测。滑动时间窗口方法在获取数据集的重要模式方面非常有用,这些模式高度依赖于过去的大量观察。试着对这个模型做一些修改,看看模型对这些变化的反应。

数据集

发表评论