开发者社区> 技术小能手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

独家 | 利用Auto ARIMA构建高性能时间序列模型(附Python和R代码)

简介:
+关注继续查看

简介

想象你现在有一个任务:根据已有的历史数据,预测下一代iPhone的价格,可使用的特征包括季度销售、月度支出以及苹果资产负债表上的一系列内容。作为一名数据科学家,你会把这个问题归类为哪一类问题?当然是时间序列建模。

从预测产品销售到估算家庭用电量,时间序列预测是任何数据科学家都应该知道——哪怕不是熟练掌握——的核心技能之一。你可以使用多种不同的方法进行时间序列预测,我们将在本文中讨论Auto ARIMA,它是最为有效的方法之一。

ede899959d3dbcdcbf93121c51595fe37509524b

首先,我们来了解一下ARIMA的概念,然后再进入正题——Auto ARIMA。为了巩固概念,我们将使用一个数据集,并用Python和R实现它。

目录

一、什么是时间序列?

二、时间序列预测的方法

三、ARIMA简介

四、ARIMA实现步骤

五、为什么需要Auto ARIMA?

六、用Auto ARIMA实现案例(航空乘客数据集)

七、Auto ARIMA如何选择参数?

如果你熟悉时间序列及其常用方法(如移动平均、指数平滑和ARIMA),则可以直接跳到第4节。对于初学者,请从下面这一节开始,内容包括对时间序列和各种预测方法的简要介绍。

一、什么是时间序列?

在我们学习如何处理时间序列数据之前,首先应理解什么是时间序列,以及它与其他类型的数据的区别。时间序列的正式定义如下:它是一系列在相同时间间隔内测量到的数据点

简言之,时间序列是指以固定的时间间隔记录下的特定的值,时间间隔可以是小时、每天、每周、每10天等等。时间序列的特殊性是:该序列中的每个数据点都与先前的数据点相关。我们通过下面几个例子来更清楚地理解这一点。

例1:

假设你从某公司获得了一个贷款人员的数据集(如下表所示)。你认为每一行都与前面的行相关吗?当然不是!一个人的贷款金额取决于他的经济状况和需要(可能还有其他因素,如家庭规模等,但为了简单起见,我们只考虑收入和贷款类型)。此外,这些数据不是在特定时间间隔内收集的,它仅与公司何时收到贷款申请相关。

9efc6845877612527dc1852c945b4aa119e03d0d

例2:

再举一个例子。假设你有一个数据集,其中包含每天空气中的二氧化碳水平(下面是截图)。那么可以通过过去几天的数值来预测第二天的二氧化碳水平吗?当然可以。如果你观察到的数据是每天记录下来的,那么,时间间隔便是恒定的(24小时)。

7f4e7d7411ce435759b55ab6e420795ccfe7be2c

现在你已经有了直觉,第一个例子是简单的回归问题,而第二个例子是时间序列问题。虽然这里的时间序列问题也可以用线性回归来解决,但这并不是最好的方法,因为它忽略了这些值与所有相对过去值之间的关系。下面,我们来了解一下解决时间序列问题的一些常用方法。

二、时间序列预测的方法

有许多种方法可以进行时间序列预测,我们将在这一节中对它们做简要地介绍。下面提到的所有方法的详细说明和Python代码可以在下文中找到:

七种时间序列预测方法(附Python代码):

https://www.analyticsvidhya.com/blog/2018/02/time-series-forecasting-methods/

1. 朴素预测法:在这种预测方法中,新数据点预测值等于前一个数据点的值。结果将会是一条平行线,因为所有预测的新值采用的都是先前的值。

3b1c16aab1cb877b375ecf4ff51c4f6f28645a3d

2. 简单平均值法:视下一个值为所有先前值的平均数。这一预测法要优于“朴素预测法”,因为它的结果不会是一条平行线。但是在简单平均值法中,过去的所有值都被考虑进去了,而这些值可能并不都是有用的。例如,当要求预测今天的温度时,你仅需要考虑前七天的温度,而不是一个月前的温度。

ba3f7b078bb11ab14afef63469eb61e9f9d28077

3. 移动平均法:这是对前两个方法的改进。不取前面所有点的平均值,而是将n个先前的点的平均值作为预测值。

f6c261cebf89b1143b353ba2bf2dfc46e677c002

4. 加权移动平均法:加权移动平均是带权重的移动平均,先前的n个值被赋予不同的权重。

d5d28e0fbc189bada537ec4319411fcf926ff7a8

5. 简单指数平滑法:在这种方法中,更大的权重被分配给更近期的观测结果,来自遥远过去的观测值则被赋予较小的权重。

960cd9c602f44af6f4173cf3de173107536cc328

6. 霍尔特(Holt)线性趋势模型:该方法考虑了数据集的趋势。所谓趋势,指的是数据的递增或递减的性质。假设旅馆的预订数量每年都在增加,那么我们可以说预订数量呈现出增加的趋势。该方法的预测函数是值和趋势的函数。

46ef451c0b35c2ad4e7386e7b7410222f6416ef2

7. 霍尔特-温特斯(Holt Winters)方法:该算法同时考虑了数据的趋势和季节性。例如,一家酒店的预订数量在周末很高,而在工作日则很低,并且每年都在增加;因此存在每周的季节性和增长的趋势。

0442abb7ed49259c0947e18180672b0373b7448c

8. ARIMA:ARIMA是一种非常流行的时间序列建模方法。它描述了数据点之间的相关性,并考虑了数值之间的差异。ARIMA的改进版是SARIMA (或季节性ARIMA)。我们将在下一节中更详细地讨论ARIMA。

三、ARIMA简介

在本节中,我们将简要介绍ARIMA,这将有助于理解Auto Arima。“时间序列完整教程”一文中对ARIMA, (p,q,d) 参数,ACF、 PACF图和具体实现有详细的解释。

ARIMA是一种非常流行的时间序列预测方法,它是自回归综合移动平均(Auto-Regressive Integrated Moving Averages)的首字母缩写。ARIMA模型建立在以下假设的基础上:

 ●  数据序列是平稳的,这意味着均值和方差不应随时间而变化。通过对数变换或差分可以使序列平稳。
 ●  输入的数据必须是单变量序列,因为ARIMA利用过去的数值预测未来的数值。

ARIMA有三个分量:AR(自回归项)、I(差分项)和MA(移动平均项)。让我们对每个分量做一下解释:

 ●  AR项是指用于预测下一个值的过去值。AR项由ARIMA中的参数‘p’定义。“p”的值是由PACF图确定的。
 ●  MA项定义了预测未来值时过去预测误差的数目。ARIMA中的参数‘q’代表MA项。ACF图用于识别正确的‘q’值,
 ●  差分顺序规定了对序列执行差分操作的次数,对数据进行差分操作的目的是使之保持平稳。像ADF和KPSS这样的测试可以用来确定序列是否是平稳的,并有助于识别d值。

四、ARIMA实现步骤

实现ARIMA模型的通用步骤如下:

1. 加载数据:构建模型的第一步当然是加载数据集。

2. 预处理:根据数据集定义预处理步骤。包括创建时间戳、日期/时间列转换为d类型、序列单变量化等。

3. 序列平稳化:为了满足假设,应确保序列平稳。这包括检查序列的平稳性和执行所需的转换。

4. 确定d值:为了使序列平稳,执行差分操作的次数将确定为d值。

5. 创建ACF和PACF图:这是ARIMA实现中最重要的一步。用ACF PACF图来确定ARIMA模型的输入参数。

6. 确定p值和q值:从上一步的ACF和PACF图中读取p和q的值。

7. 拟合ARIMA模型:利用我们从前面步骤中计算出来的数据和参数值,拟合ARIMA模型。

8. 在验证集上进行预测:预测未来的值。

9. 计算RMSE:通过检查RMSE值来检查模型的性能,用验证集上的预测值和实际值检查RMSE值。

五、为什么我们需要Auto ARIMA?

虽然ARIMA是一个非常强大的预测时间序列数据的模型,但是数据准备和参数调整过程是非常耗时的。在实现ARIMA之前,需要使数据保持平稳,并使用前面讨论的ACF和PACF图确定p和q的值。Auto ARIMA让整个任务实现起来非常简单,因为它去除了我们在上一节中提到的步骤3至6。下面是实现AUTO ARIMA应该遵循的步骤:

1. 加载数据:此步骤与ARIMA实现步骤1相同。将数据加载到笔记本中。

2. 预处理数据:输入应该是单变量,因此删除其他列。

3. 拟合Auto ARIMA:在单变量序列上拟合模型。

4. 在验证集上进行预测:对验证集进行预测。

5. 计算RMSE:用验证集上的预测值和实际值检查RMSE值。

正如你所看到的,我们完全绕过了选择p和q的步骤。啊!可以松口气了!在下一节中,我们将使用一个假想数据集实现Auto ARIMA。

六、Python和R的实现

我们将使用国际航空旅客数据集,此数据集包含每月乘客总数(以千为单位),它有两栏-月份和乘客数。你可以从以下链接获取数据集:

https://datamarket.com/data/set/22u3/international-airline-passengers-monthly-totals-in-thousands-jan-49-dec-60#!ds=22u3&display=line

6248f17932edc6030afa3b503c1e1e0940e883ce

以下是同一问题的R代码:

0b7bc6c9b9d6eca07ec96298ef7610953a9b2962

七、Auto ARIMA如何选择最佳参数

在上述代码中,我们仅需用.efit()命令来拟合模型,而不必选择p、q、d的组合,但是模型是如何确定这些参数的最佳组合的呢?Auto ARIMA生成AIC和BIC值(正如你在代码中看到的那样),以确定参数的最佳组合。AIC(赤池信息准则)和BIC(贝叶斯信息准则)值是用于比较模型的评估器。这些值越低,模型就越好。

如果你对AIC和BIC背后的数学感兴趣,请访问以下链接:

 ●  AIC:

http://www.statisticshowto.com/akaikes-information-criterion/

 ●  BIC:

http://www.statisticshowto.com/bayesian-information-criterion/

八、尾注和进一步阅读

我发现Auto ARIMA是进行时间序列预测的最简单的方法。知道一条捷径是件好事,但熟悉它背后的数学也同样重要的。在这篇文章中,我略过了ARIMA如何工作的细节,但请务必阅读本文中提供的链接的文章。为了方便你参考,这里再次提供一遍链接:

 ●  时间序列预测初学者综合指南(Python)

https://www.analyticsvidhya.com/blog/2016/02/time-series-forecasting-codes-python/

 ●  时间序列完整教程(R)

https://www.analyticsvidhya.com/blog/2015/12/complete-tutorial-time-series-modeling/

 ●  时间序列预测的七种方法 (附python代码)

https://www.analyticsvidhya.com/blog/2018/02/time-series-forecasting-methods/

建议大家做一下这个课程中的练习题:“时间序列实战”。你也可以参加我们的培训课程,参与到实战中来,“时间序列预测”课程为你提供一个领先的开端。


原文发布时间为:2018-11-13

本文作者:AISHWARYA SINGH

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
实例探究Python以并发方式编写高性能端口扫描器的方法
来源:http://www.jb51.net/article/86615.htm 关于端口扫描器端口扫描工具(Port Scanner)指用于探测服务器或主机开放端口情况的工具。常被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务。 端口扫描定义是客户端向一定范围的服务器端口发送对应请求,以此确认可使用的端口。虽然其本身并不是恶意的网络活动
1394 0
【编程自学】我写了4个 “原创” 文档,从Excel到mysql再到Python,让你进阶数据科学家!
【编程自学】我写了4个 “原创” 文档,从Excel到mysql再到Python,让你进阶数据科学家!
30 0
双非本硕“统计学”连读,带你讲述一下我的 “Python编程学习” 之路!
双非本硕“统计学”连读,带你讲述一下我的 “Python编程学习” 之路!
79 0
Python编程 深入浅出递归
递归(Recursion)是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。
67 0
Python编程 封装函数 根据输入参数计算结果返回
define function,calculate the input parameters and return the result.
42 0
Python编程 模拟SQL语句 实现对员工信息的增删改查
使用python实现员工系统并且具有员工信息增删改查等基础功能
28 0
Python编程 高阶函数使用技巧
在坚持的初期,坚持本身比坚持的事情更重要。 也许,生活的意义并不在于实现了怎样伟大的梦想,而是在于自己全身心地投入,让每一天都成为梦想的一部分。 只要是能确定带给自己价值感的事情,去做就好。 时间在流逝,每一天,都值得认真对待。
43 0
Python编程 基础练习(四)
很认同的一句话:在能力范围之内,给自己最好的生活
137 0
Python编程 基础练习(一)
经典的题目分析和代码实现
91 0
Python编程 基础练习(三)
经典题目解析以及代码实现
98 0
+关注
技术小能手
云栖运营小编~
文章
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
Python第五讲——关于爬虫如何做js逆向的思路
立即下载
Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战第二讲
立即下载
Python第四讲——使用IPython/Jupyter Notebook与日志服务玩转超大规模数据分析与可视化
立即下载