(Python)时序预测的七种方法

简介: 大多数人都听说过关于Cryptocurrency,许多人也许会投资他们的加密货币。但是,投资这种不稳定的货币安全吗?怎样才能确保现投资这些硬币未来一定能带来稳定的收益呢?我们不能确定,但肯定能根据以前的价格产生一个近似值。时序模型是预测的一种方法。

介绍

大多数人都听说过关于Cryptocurrency,许多人也许会投资他们的加密货币。但是,投资这种不稳定的货币安全吗?怎样才能确保现投资这些硬币未来一定能带来稳定的收益呢?我们不能确定,但肯定能根据以前的价格产生一个近似值。时序模型是预测的一种方法。

c172116114cbe09df1d88d0a13f4836152cf7a80

除了加密货币,还有许多重要的应用时序预测的领域,例如:销售预测,呼叫中心的通话量,太阳的活动,海潮,股市行为等等。

目录

  • 理解问题描述和数据集
  • 安装库
  • 方法 1 –以简单的方式开始
  • 方法2 – 简单平均数
  • 方法3 – 移动平均数
  • 方法 4 –指数平滑法
  • 方法5 – Holt线性趋势法
  • 方法6 – Holt冬季季节法
  • 方法7 –综合自回归移动平均法(ARIMA

理解问题描述和数据集

提供了涉及预测JetRail通勤人数的时序问题,一个新的高速铁路服务。我们提供了2年的数据,并利用这些数据预测未来7个月的通勤人数。

在本文中,只使用训练数据集。

d1b0b1f301e37af91d4f7fc48344bc40b6676350

从以上的报表上看到,我们有2年的按小时计的通勤数据(2012-2014),需要预估未来的通勤数量。

在本文中,我构造子集和汇总数据集以便讲解不同的方法。

  • 构造数据集的子集 (2012/08 – 2013/12)
  • 为建模构造训练和测试文件。前14个月的数据被用作训练数据(2012/08 - 2013/10),后两个月的被用作测试数据(2013/11 - 2013/12)。
  • 每天汇总数据集。

502129a7bc70253ef7f2402ab02aac8c8c9d1c9e

把数据(用于训练的和测试的)可视化,以了解在一段时间内是如何变化的。

8123d8776fc5e5f3ab200e37c62e215d480cd914

40518e84f12b411a3c21b6ae46003b76acaf4f02

安装库(statsmodels

用来进行时序预测的库是statsmodels。在应用很少的给定方法之前,需要安装一下。statsmodels可能已经安装在你的Python开发环境了,但它不支持的预测方法。我们将从存储库克隆一下并进行源码安装。按照如下步骤 :

1.使用PIP冻结检查statsmodels是否已经安装在你的环境中;

2.如果已经存在,使用“conda remove statsmodels” 删除;

3. “git clone git://github.com/statsmodels/statsmodels.git”克隆statsmodels的存储库,在克隆前用“git init”初始化Git

4.“cd statsmodels”进入到statsmodels目录;

5.“python setup.py build”建安装文件;

6.“python setup.py install”进行安装;

7.退出bash/terminal

8.重启bash/terminal,打开python并执行“from statsmodels.tsa.api import ExponentialSmoothing”进行验证;

方法1: Naive方法开始

考虑下面的曲线图:

abd7ecdeffc9b5d2434dc7c64920f66d3d6cf488

从图中我们可以看出,从一开始,硬币的价格是稳定的。大多时候我们都有一个在整个时间段都比较稳定的数据集。如果想预测第二天的价格,可以简单地用前一天的价格数据,估计第二天的价格。这种假定下一个期望点等于最后一个观测点的预测技术称为 Naive方法。

1ff23773dd2af07e1c6fb0c90808dd98b1cb6939

现在我们采用Naive 方法来预测测试数据的价格。

13626351bdb638021d9453a59f9cab749157fce5

8091571d5a153d49ba0ad6b33863e4a6c0b6f03f

现在我们将计算均方根误差(RMSE)以检查测试数据集上模型的精度。

95ef7a4b91ce4230de2c1afda8642c118f242743

可以从RMSE值和上面的图推断,Naive方法不适合变化频繁的数据集,它最适合稳定的数据集。

方法2 简单均值法

考虑下面的图。

fcc3789607767ba4cc49f72fa36b758f1d9b053e

可以从图中推断,硬币的价格是以微小的幅度随机上升和下降的,平均值不变。很多时候,我们得到了一个数据集,虽然它在整个时间段内有一个较小的变化,但是每个时间段的平均值保持不变。在这种情况下,我们可以预测第二天的价格与之前每天的平均值相近。

这种预测期望值等于所有观测点平均值的预测技术称为简单均值法。

4eb8a4d282fb2015a28152ced9914e5851a8925e

我们取前面已知的所有值,计算平均值,并将其作为下一个值。当然,它并不精确,而是稍微接近。作为一种预测方法,实际情况是这个技术最有效。

09fc51dd2978d48e912ed4d8b3b04fb56dd4163c

572d7416d16022643fc0526e029248119b1c7521

现在将计算均方根误差检查模型的准确性

7539f35c9b217eccd7e390918db63415c2061b0c

可以看出这种模式没有提高我们的分数。因此,我们能从得分推断,这种方法在每个时间段的平均值保持不变的时候效果最好。虽然Naive法的得分优于均值法,但这并不意味着Naive法在所有数据集上都优于均值法。

方法3 移动均值法

考虑下面曲线图,

3ae8902850a0e17cad5cd8f72a420726af826acf

从图中可以推断,硬币的价格在一段时间以前大幅度地提高了,但现在是稳定的。很多时候,我们得到了一个数据集,其中一段时间以前对象的价格/销售量急剧增加/急剧下降。使用初期的价格会对下一个时间段的预测产生很大影响。所以相对于简单均值法的改进,只计算最后几个时间段的平均价格。显然,只有最近的值才是重要的。这种利用时间窗计算平均值的预测技术称为移动均值法。

利用一个简单的移动均值模型,根据一个不变的有限数p的平均值来预测时间序列中的下一个或多个值。因此,对所有的 i > p

e1efd573f2e28631d9b26cfedf59ba152fb045e8

移动均值法实际上是非常有效的,尤其是当你给序列选择正确的p值时。

b7dd2975d1128536fdedb3ca801efbde76812bf5

e483886482f71f6d1152b07e14df909f55d0bd95

我们只选择了过去2个月的数据。现在将计算均方根误差来检查模型的准确性。

81eed28afb9b8aaae8779a0129ab0a2fa79db342

可以看到,Naive方法对于数据集要优于均值法和移动均值法。现在来看一下简单指数平滑法,看看它是如何执行的。

移动均值法的改进方法——加权移动均值法。在上述移动均值法中,我们同样权衡过去的N个观测值。但我们可能遇到的情况是,过去的每一次观察都以不同的方式影响预测。这种以不同的方式权衡过去观测值的技术称为加权移动均值技术。

加权移动均值是一个移动平均值,在滑动窗口的值中赋予不同的权重。

b26448ea894d553efc7bc47c7b85f68368e6dee3

选择窗口的大小,需要一个权重列表。例如,如果选择[ 0.400.250.200.15 ]作为权重,将分别给出40%25%20%15%

方法4 简单指数平滑法

在理解了上述方法之后,可以注意到,简单均值法和加权移动均值法是完全相反的。我们需要在这两个方法之间采取某种方法,这两个方法在用不同的方式权衡数据点的同时要考虑所有数据。这种技术称为简单指数平滑法。预测是用加权平均来计算的,之前观测值的权重是指数递减的,最小的权重与最早的观测值相关:

43973025f5a03a04bba5b3615043060995f5195e

 0≤ α ≤1是参数。

先一步预测时间T + 1是一个序列中的所有观测值的加权平均值Y1YT。权重下降的速率由参数α决定。

如果观察足够长的时间,你会看到,期望xαYT和(1−αŶT-1的和。

也可以写成 :

24f7584c1f62f577cd1c71db56da305692e0f2d5

所以基本上我们已经有了一个1−αα的加权移动平均值:。

可以看到,1−α乘以之前预期的表达递归的值x−1。这就是为什么这种方法被称为Exponential。在时间t + 1的预测等于最近观察值yt 和最近预测值 ŷ t|t−1之间的加权平均值。

19bb0dacfffe575cae24b771dbc76f9c39b1356f

dd66fd020eeff87d0827ff153cdc2a234113b372

现在将计算均方根误差检查模型的准确性。

f1677dc650e80781789735501fdffe002e3a3427

可以看到,用alpha值为0.6的简单指数模型形成一个更好的模型,到现在为止,生成一个更好的模型。

方法 5 霍尔特线性趋势法

我们现在已经学会了几种预测方法,但可以看到,这些模型在变化较大数据上不是太好。

f5737e49f0d5b82f53ee6f683a1172f5da97841e

趋势是在一段时间内观察到的价格的一般模式。如Naive方法会假定最后两点之间的趋势将保持不变,或者可以在所有点之间的平均斜率得到一个平均趋势,使用移动趋势均值或指数平滑法。

但我们需要一种方法,能准确无误地绘制趋势图。考虑数据集趋势的这种方法称为霍尔特线性趋势法。每个时间序列的数据集可以被分解为不同趋势的组成部分,季节性和剩余。任何跟随趋势的数据集都可以使用Holt线性趋势法进行预测。

32d9a46e5e3e4e5c7228441e197eb25284915a91

从图表可以看出,该数据集呈增长趋势。因此,可以用Holt的线性趋势来预测未来的价格。

霍尔特扩展简单指数平滑方法,允许有趋势的数据预测。它只适用于两个等级(多个序列的平均值)和趋势的指数平滑方法。用数学符号表示,现在需要三个等式:一个用于等级,一个用于趋势,一个结合等级与得到预测值的趋势

3b72350185a9c3f49f7f26b067783da702dc1492

我们在上述算法中预测的值称为等级。在上面的三个等式中,可以注意到我们增加了等级和趋势来生成预测等式。

作为简单指数平滑法,这里的等级等式表明它是一个观察数的加权平均值和样本内前步预测。趋势等式表明,这是一个基于ℓ(t)−ℓ(t−1)和和bt1)的时间t的预测趋势的加权平均值。

我们将添加这些等式来生成预测等式。也可以通过乘以趋势和等级而不是增加,来生成乘法预测等式。当趋势呈线性上升或下降时,则采用加法等式,而当趋势呈指数下降时,则采用乘法等式。实践表明乘法是一种更稳定的预测,但加性方法更容易理解。

90a50d86d21d1319f2e0feb01b9f6fadc843ee2e

600560b118c93945789c26f26f583f39af79da36

05a549fe9cf72499f30558050d4fe8522d15bcc7

现在将计算均方根误差检查模型的准确性

1c30cbad7613fd8b9ca614c95f56d1b8605783ff

方法6 Holt-Winters方法

考虑一个位于山上的旅馆。在夏季期间有很高的访问量,而今年余下时间的游客相对较少。因此,业主的利润在夏季比其他季节都要好得多。而且每年都一样,是季节性的。数据集在一段固定的时间间隔内显示出相似性。

0792f438126e70c9d55f510eaedd25eecb52f97f

源码

由于季节性因素,使用霍尔特冬季方法将是其它模型中最好的选择。霍尔特-温特斯季节性方法包括预测等式和三个平滑等式-一个似乎等级t,一个是趋势bt,一个是季节组成部分 st,平滑参数αβγ

08420edbbc071a4eab5a927464f983091e771d73

源码

其中S是季节性周期的长度,0≤α≤1, 0≤β≤10≤γ≤1

fef1c974bb6882a524b868866e6497672f9bd3ae

9aa7481713c026c4f876d88622074190eb2f2a53

现在将计算均方根误差检查模型的准确性

12f1d0b6bfe79c114a85fe9c5231098d64234e6c

从图中可以看出,正确的趋势和季节性的映射提供了一个更好的解决方案。

方法7 ARIMA

另一个在数据科学家中非常流行的时间序列模型是ARIMA。它代表自回归积分移动平均(Autoregressive Integrated Moving average)。指数平滑模型是基于对趋势和季节性数据的描述,ARIMA模型的目的是描述数据之间的相关性。ARIMA的改进考虑到数据集的季节性,就像Holt-Winters方法一样。

7b59ec9902acad616aa6c68005889e8458e6f6c6

898a3c499b8954e000485336bb31fc392bbfdf8d

现在将计算均方根误差检查模型的准确性。

4c2edaf8b32118bd514a6dc9fd58b7f1de351bd1

可以看到,使用季节性ARIMA生成一个类似Holt’s Winter的解决方案。我们选择的参数为ACFPACF图。

可以在RMSE分数的基础上比较这些模型。

9e8531a01080d9388831792ff7c310144dc881f2

 以上为译文。

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《7 methods to perform Time Series forecasting (with Python codes),译者:Mags,审校:袁虎。

文章为简译,更为详细的内容,请查看原文 

相关文章
|
1天前
|
机器学习/深度学习 数据可视化 前端开发
【Python机器学习专栏】机器学习模型评估的实用方法
【4月更文挑战第30天】本文介绍了机器学习模型评估的关键方法,包括评估指标(如准确率、精确率、召回率、F1分数、MSE、RMSE、MAE及ROC曲线)和交叉验证技术(如K折交叉验证、留一交叉验证、自助法)。混淆矩阵提供了一种可视化分类模型性能的方式,而Python的scikit-learn库则方便实现这些评估。选择适合的指标和验证方法能有效优化模型性能。
|
1天前
|
机器学习/深度学习 算法 Python
【Python机器学习专栏】Python中的特征选择方法
【4月更文挑战第30天】本文介绍了机器学习中特征选择的重要性,包括提高模型性能、减少计算成本和增强可解释性。特征选择方法主要包括过滤法(如相关系数、卡方检验和互信息)、包装法(如递归特征消除和顺序特征选择)和嵌入法(如L1正则化和决策树)。在Python中,可利用`sklearn`库的`feature_selection`模块实现这些方法。通过有效的特征选择,能构建更优的模型并深入理解数据。
|
1天前
|
机器学习/深度学习 数据采集 数据可视化
【Python 机器学习专栏】数据缺失值处理与插补方法
【4月更文挑战第30天】本文探讨了Python中处理数据缺失值的方法。缺失值影响数据分析和模型训练,可能导致模型偏差、准确性降低和干扰分析。检测缺失值可使用Pandas的`isnull()`和`notnull()`,或通过可视化。处理方法包括删除含缺失值的行/列及填充:固定值、均值/中位数、众数或最近邻。Scikit-learn提供了SimpleImputer和IterativeImputer类进行插补。选择方法要考虑数据特点、缺失值比例和模型需求。注意过度插补和验证评估。处理缺失值是提升数据质量和模型准确性关键步骤。
|
2天前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
|
3天前
|
机器学习/深度学习 数据可视化 数据挖掘
实用技巧:提高 Python 编程效率的五个方法
本文介绍了五个提高 Python 编程效率的实用技巧,包括使用虚拟环境管理依赖、掌握列表推导式、使用生成器提升性能、利用装饰器简化代码结构以及使用 Jupyter Notebook 进行交互式开发。通过掌握这些技巧,可以让你的 Python 编程更加高效。
|
3天前
|
数据可视化 数据处理 Python
Python有很多创建图表的常用方法
Python的图表创建工具有多种,如基础的Matplotlib用于绘制各类图表,包括线图和柱状图等;Seaborn是Matplotlib的扩展,擅长复杂可视化如热力图和回归图;Plotly和Bokeh提供交互式图表,适合高维数据展示,支持散点图、线图等;Pandas虽主要是数据处理库,但也具备基本绘图功能;Pygal专注于生成可缩放矢量图,如线图和饼图,支持SVG输出;而Altair基于Vega,适用于交互式和高维数据的可视化。选择哪种库取决于具体需求和图表类型。
12 2
|
8天前
|
运维 Shell Python
第九章 Python自定义模块及导入方法
第九章 Python自定义模块及导入方法
|
8天前
|
数据可视化 算法 数据挖掘
Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化
Python用KShape对时间序列进行聚类和肘方法确定最优聚类数k可视化
69 8
|
8天前
|
人工智能 Python
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
29 0
|
9天前
|
数据安全/隐私保护 Python
Python 中删除文件夹下文件的方法详解
本文探讨了Python删除文件夹中特定文件的三种方法。使用os模块简单直接,适合基础操作,但不支持递归删除;shutil库能递归删除整个文件夹,需谨慎使用;glob模块则按文件名模式匹配并删除,灵活性高但范围受限。根据需求和安全性考虑选择合适的方法。
3 0