由于我大部分时间都花在 Kaggle 上,所以我没有太多机会专注于时间序列预测,但我决定研究它,因为它与 Tensorflow 相关。Tensorflow 由 Google 开发,是创建神经网络的 Python 库。除了对表格数据、图像、自然语言甚至声音进行预测之外,Tensorflow 还可以对时间序列数据进行预测。
我发现了一篇我想完整阅读的研究论文,但在互联网上公开的只有摘要和参考文献。该研究论文的标题是“A Comparison between ARIMA, LSTM and GRU for Time Series Forecasting”,并在 2019 年第二届算法、计算和人工智能国际会议上发表。论文摘要可以在这里找到:
https://dl.acm.org/doi/abs/10.1145/3377713.3377722
这篇文章的摘要指出作者比较了三种不同的模型,以对比特币价格数据集进行时间序列预测。比特币数据集可以从 Yahoo! 下载,可以在这里找到:
https://finance.yahoo.com/quote/BTC-USD/history/
论文作者在他们进行的研究中使用的三个模型是 ARIMA、LSTM 和 GRU。这些人进行的研究结果是 ARIMA 具有较低的均方根误差 (RMSE),这意味着它优于 LSTM 和 GRU。
时间序列预测完全在我的能力范围内,所以我决定尝试复制他们的工作,这是我无法在互联网上免费获得的。在我进行研究之后,我发现我取得的结果是不同的,GRU 优于 LSTM 和 ARIMA。
ARIMA
Statsmodels 的 ARIMA(自回归求和移动平均模型)是一种流行的时间序列建模技术,在 statsmodels 库中实现,该库是一个用于统计建模和分析的 Python 包。ARIMA 模型广泛用于预测和分析时间序列数据。
ARIMA 模型结合了三个组成部分:自回归 (AR)、差分 (I) 和移动平均 (MA)。
1. 自回归 (AR):该组件对观测值与一定数量的滞后观测值(过去值)之间的关系进行建模。它假设时间序列的当前值与其先前值线性相关。
2. 差分 (I):该组件通过差分时间序列来处理非平稳数据。它从当前观察中减去先前的观察,这有助于消除数据中的趋势或季节性。
3. 移动平均 (MA):该组件对观测值与滞后观测值的移动平均值的残差之间的依赖性进行建模。它假设时间序列的当前值与其过去误差的加权平均值相关。
ARIMA 模型使用的符号为 ARIMA(p, d, q),其中:
1. p 表示自回归分量的阶数,指示要考虑的滞后观测值的数量。
2. d 表示差分程度,表示数据需要差分的次数才能达到平稳性。
3. q 表示移动平均分量的阶数,表示要考虑的滞后残差的数量。
总体而言,statsmodels 中的 ARIMA 模型是时间序列分析和预测的强大工具,为建模和预测各种类型的时间相关数据提供了灵活的框架。
GRU
TensorFlow 的门控循环单元 (GRU) 是一种循环神经网络 (RNN) 架构,旨在捕获顺序数据中的依赖性和模式。它是传统 RNN 的变体,改进了梯度消失问题和捕获长期依赖性的困难。
GRU 由对输入序列进行操作的循环单元组成。GRU 内的每个循环单元都有一个控制信息流的门控机制。GRU 的主要组件如下:
1. 更新门(Update Gate):更新门控制应保留多少先前的隐藏状态并与当前输入相结合。它决定了过去要忘记或记住的信息量。
2. 重置门(Reset Gate):重置门帮助 GRU 决定应忽略多少先前的隐藏状态。它允许网络根据当前输入有选择地重置或更新部分隐藏状态。
3. 候选激活(Candidate Activation):候选激活根据当前输入和先前的隐藏状态计算新的候选隐藏状态。它结合来自输入和重置门的信息来确定潜在的新状态。
4. 隐藏状态(Hidden State):隐藏状态代表GRU的内存。它存储从先前输入中学习到的信息,并根据输入、重置门和更新门进行更新。
GRU 架构可以有效地捕获短期依赖关系,其门控机制使模型能够控制信息流并适应数据内的不同时间尺度。它已广泛应用于各种基于序列的任务,包括自然语言处理、语音识别和时间序列分析。
LSTM
TensorFlow 的长短期记忆 (LSTM) 是一种循环神经网络 (RNN) 架构,旨在解决传统 RNN 的局限性,例如梯度消失问题以及捕获顺序数据中的长期依赖性的困难。
LSTM 网络由记忆单元组成,这些记忆单元允许信息在长序列上持续存在,从而使它们能够捕获和记住长期依赖性。LSTM 单元的主要组成部分如下:
1. Cell State (c):单元状态充当 LSTM 的记忆。它在整个序列中线性运行,并且可以保留或忘记信息。单元状态可以被认为是一条穿过 LSTM 的传送带,允许信息在被门修改的同时流动。
2. Input Gate (i):输入门决定单元状态中应存储多少新信息。它根据当前输入和之前的隐藏状态来控制单元状态的更新。
3. Forget Gate(f):遗忘门决定应该从单元状态中丢弃哪些信息。它调节从先前的细胞状态到当前的细胞状态的信息流。它用于忘记先前时间步骤中的不相关信息。
4. Output Gate (o):输出门决定当前单元状态的多少应作为输出公开。它控制发送到下一个隐藏状态并最终发送到 LSTM 输出的信息量。
5. Hidden State (h):隐藏状态是 LSTM 在特定时间步的输出。它携带有选择性地传播到后续时间步骤的信息。
LSTM 的架构和门控机制使其能够捕获并保留长序列中的信息,这使其对于涉及长期依赖关系建模的任务(例如自然语言处理、语音识别和时间序列分析)特别有效。
编码
我使用 Google Colab 准备了计算机程序,这是一个由 Google 托管的免费在线 Jupyter Notebook。Google Colab 是一个很好用的平台,唯一的例外是它没有足够的撤销功能,因此需要小心,不要意外覆盖或删除有价值的代码。
对于程序,我导入了执行程序所需的所有标准库,例如 pandas、numpy、sklearn、statsmodels、scipy、sklearn、tensorflow、matplotlib 和 seaborn。
使用 Statsmodels 的 ARIMA 代码
导入我需要的标准库后,我使用 pandas 读取 csv 文件,将日期列作为索引,并解析日期。我仅使用数据帧的第四列作为单变量时间序列数据:
我使用 matplotlib 来可视化时间序列:
我将数据帧分为训练集和测试集:
我使用 sklearn 的 MinMaxScaler 将数据从 0 缩放到 1:
我使用 statsmodels 的 ARIMA 模型来训练数据:
我对测试集进行了预测,将其绘制在图表上,并获得了均方根误差 (RMSE):
ARIMA:
Mean Absolute Error: 4137.746710432508
Root Mean Square Error: 5018.369921709136
Tensorflow 中的 GRU 和 LSTM 代码
我读取了数据集,将其转换为数据帧,并以与之前使用 statsmodels 的 ARIMA 模型进行预测时相同的方式将其可视化。
因为 GRU 和 LSTM 模型是神经网络,所以我必须创建一个输入数据集,如下所示:
然后我创建了 GRU 和 LSTM 模型并编译它们:
我训练了模型:
然后我对模型进行了预测:
我计算了两个模型的均方根误差(RMSE):
GRU 的 RMSE 为 755,比 LSTM 和 ARIMA 表现更好。
然后我使用 matplotlib 可视化 GRU 和 LSTM 模型:
结论
由于该研究论文的内容并未在互联网上免费提供,因此我根据 Yahoo! financial page 的比特币数据集进行了自己的研究。我采用了论文作者使用的三个模型,即 ARIMA、GRU 和 LSTM。然而,我的发现有所不同,因为 GRU 的表现优于 ARIMA 和 LSTM。
领取专属 10元无门槛券
私享最新 技术干货