在Python和R语言中使用Auto ARIMA构建高性能时间序列模型

想象一下,你的任务是预测下一部iPhone的价格,并提供了历史数据。这包括季度销售、月度支出,以及苹果资产负债表上的一大堆东西。作为一个数据科学家,你会把这个问题归类为什么?当然是时间序列建模。

从预测产品的销售到估计家庭的用电量,时间序列预测是任何数据科学家都应该知道的核心技能之一,如果不是精通的话。有很多不同的技术可供您使用,在本文中,我们将介绍一种最有效的技术,称为Auto ARIMA。

我们将首先了解ARIMA的概念,这将带领我们进入我们的主要话题——Auto ARIMA。为了巩固我们的概念,我们将拿起一个数据集并在Python和R语言中实现它。


目录

1.什么是时间序列?

2.时间序列预测方法

3.ARIMA概论

4.ARIMA实施步骤

5.为什么我们需要Auto ARIMA?

6.Auto ARIMA实现(空中乘客数据集)

7.Auto ARIMA如何选择参数?

如果您熟悉时间序列及其技术(如移动平均、指数平滑和ARIMA),则可以直接跳到第4节。对于初学者来说,从下面的部分开始,这是对时间序列和各种预测技术的简要介绍。


1.什么是时间序列?

在我们学习处理时间序列数据的技术之前,我们必须首先理解时间序列实际上是什么,以及它与任何其他类型的数据有什么不同。这里是时间序列的形式定义,它是一系列以一致的时间间隔测量的数据点。这仅仅意味着以固定的间隔记录特定的值,该间隔可以是小时、每天、每周、每10天等等。使时间序列不同的是,该系列中的每个数据点都依赖于先前的数据点。让我们通过几个例子来更清楚地理解差异。

例1:

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

免费视频教程:www.mlxs.top

让我们再举一个例子。假设你有一个数据集包含每天的空气中的二氧化碳含量(下面的截图)。你能通过看过去几天的数值来预测第二天的二氧化碳量吗?当然。如果你观察到,数据已经被记录在每天的基础上,也就是说,时间间隔是恒定的(24小时)。

免费视频教程:www.mlxs.top

到现在为止,你一定已经对此有了直觉——第一种情况是简单的回归问题,第二种情况是时间序列问题。虽然这里的时间序列难题也可以用线性回归来解决,但这并不是最好的方法,因为它忽略了值与所有相对过去值的关系。现在让我们来看看用于解决时间序列问题的一些常用技术。


2.时间序列预测方法

有许多方法用于时间序列预测,我们将在这一节中简要地介绍它们。下面提到的所有技术的详细说明和python代码可以在本文中找到:7种时间序列预测技术(使用python代码)

朴素方法:在这种预测技术中,新数据点的值被预测为等于前一个数据点。结果是一条平直的线,因为所有新的值都取前面的值。

免费视频教程:www.mlxs.top

简单平均值:下一个值作为所有先前值的平均值。这里的预测优于“朴素方法”,因为它不会导致一条直线,但在这里,所有过去的值都被考虑在内,这可能并不总是有用的。例如,当被要求预测今天的温度时,你会考虑过去7天的温度,而不是一个月前的温度。

免费视频教程:www.mlxs.top

移动平均值:这是对先前技术的改进。不是取所有先前点的平均值,取先前点的平均值作为预测值。

免费视频教程:www.mlxs.top

加权移动平均:加权移动平均是一个移动平均值,其中过去的n个值被赋予不同的权重。

免费视频教程:www.mlxs.top

简单指数平滑:在这种技术中,与来自远古的观测相比,更大的权重被分配给最近的观测。

免费视频教程:www.mlxs.top

霍尔特的线性趋势模型:该方法考虑了数据集的趋势。从趋势来看,我们指的是级数的递增或递减性质。假设旅馆的预订数量每年都在增加,那么我们可以说预订数量呈现出增加的趋势。该方法的预测功能是水平和趋势的函数。

免费视频教程:www.mlxs.top

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

免费视频教程:www.mlxs.top

ARIMA:ARIMA是一种非常流行的时间序列建模技术。它描述了数据点之间的相关性,并考虑了值的差异。ARIMA的改进是SARIMA(或季节性ARIMA)。我们将在下面的部分更详细地介绍ARIMA。


3.ARIMA概论

在这一节中,我们将对ARIMA做个简短介绍,这将有助于理解Auto ARIMA。本文包括对Arima、参数(p,q,d)、绘图(ACF PACF)和实现的详细说明:时间序列的完整教程。

ARIMA是一种非常流行的时间序列预测的统计方法。ARIMA代表自回归综合移动平均线。ARIMA模型的工作原理如下:

数据序列是固定的,这意味着均值和方差不应该随时间而变化。利用对数变换或差分级数可以使一系列平稳。

作为输入的数据必须是单变量序列,因为ARIMA使用过去的值来预测未来值。

ARIMA有三个组成部分——AR(自回归项)、I(差分项)和MA(移动平均项)。让我们了解这些组件中的每一个——

AR项是指用于预测下一个值的过去值。AR项由ARIMA中的参数“p”定义。使用PACF图确定p′的值。

MA项用于定义用于预测未来值的过去预测误差的数目。ARIMA中的参数“q”表示MA项。ACF图用于识别正确的“q”值。

差分的顺序指定差分运算在序列上执行的次数以使其平稳。类似ADF和KPSS的测试可以用来确定该系列是否是固定的并且有助于识别D值。


4.ARIMA实施步骤

实现ARIMA模型的一般步骤是:

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

预处理:取决于数据集,预处理的步骤将被定义。这将包括创建时间戳、转换日期/时间列的dType、制作系列单变量等。

使系列平稳:为了满足假设,有必要使系列平稳。这将包括检查序列的平稳性和执行所需的变换。

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

创建ACF和PACF图:这是ARIMA实施中最重要的一步。ACF PACF图用于确定我们的ARIMA模型的输入参数。

确定p和q值:从前一步的图中读取p和q的值

拟合ARIMA模型:使用处理后的数据和我们先前步骤计算的参数值,拟合ARIMA模型

预测集上的预测值:预测未来价值

计算RMSE:为了检查模型的性能,使用验证集上的预测和实际值检查RMSE值


5.为什么我们需要Auto ARIMA?

虽然ARIMA是预测时间序列数据的一个非常强大的模型,但是数据准备和参数调整过程最终非常耗时。在实现ARIMA之前,您需要使序列平稳,并使用上面讨论的图确定p和q的值。Auto ARIMA使这个任务对我们来说非常简单,因为它消除了我们在上一节中看到的步骤3到6。下面是实现Auto ARIMA所需遵循的步骤:

加载数据:这一步将是相同的。将数据加载到笔记本中

预处理数据:输入应该是单变量的,因此放弃其他列。

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

验证集上的预测值:对验证集进行预测

计算RMSE:使用实际值的预测值检查模型的性能

我们完全绕过P和Q特征的选择,如您所见。多么令人宽慰啊!在下一节中,我们将使用玩具数据集实现AutoARIMA。


6.在Python和R语言中的实现

我们将使用国际航空旅客数据集。这个数据集包含每月的乘客总数(数以千计)。它有两列——月和乘客数。您可以从这个链接下载数据集。

#load the data

data = pd.read_csv('international-airline-passengers.csv')

#divide into train and validation set

train = data[:int(0.7*(len(data)))]

valid = data[int(0.7*(len(data))):]

#preprocessing (since arima takes univariate series as input)

train.drop('Month',axis=1,inplace=True)

valid.drop('Month',axis=1,inplace=True)

#plotting the data

train['International airline passengers'].plot()

valid['International airline passengers'].plot()

免费视频教程:www.mlxs.top

#building the model

from pyramid.arima import auto_arima

model = auto_arima(train, trace=True, error_action='ignore', suppress_warnings=True)

model.fit(train)

forecast = model.predict(n_periods=len(valid))

forecast = pd.DataFrame(forecast,index = valid.index,columns=['Prediction'])

#plot the predictions for validation set

plt.plot(train, label='Train')

plt.plot(valid, label='Valid')

plt.plot(forecast, label='Prediction')

plt.show()

免费视频教程:www.mlxs.top

#calculate rmsefrommathimportsqrtfromsklearn.metricsimportmean_squared_errorrms = sqrt(mean_squared_error(valid,forecast))print(rms)

output -

76.51355764316357

以下是相同问题的R语言代码:

#loading packageslibrary(forecast)library(Metrics)#reading datadata = read.csv("international-airline-passengers.csv")#splitting data into train and valid setstrain = data[1:100,]valid = data[101:nrow(data),]#removing"Month"columntrain$Month = NULL#training modelmodel = auto.arima(train)#model summarysummary(model)#forecastingforecast = predict(model,44)#evaluationrmse(valid$International.airline.passengers, forecast$pred)


7.Auto ARIMA如何选择最佳参数

在上面的代码中,我们仅仅使用.fit()命令来拟合模型,而不必选择p、q、d的组合。但是模型如何确定这些参数的最佳组合呢?Auto ARIMA考虑生成的AIC和BIC值(如代码所示),以确定参数的最佳组合。AIC(AKaiKe信息准则)和BIC(贝叶斯信息准则)值是比较模型的估计量。这些值越低,模型越好。

看看这些链接,如果你感兴趣的数学背后的AICBIC


8.小结与延伸阅读

我发现Auto ARIMA是执行时间序列预测的最简单的技术。知道一条捷径是好的,但是熟悉它背后的数学也是很重要的。在本文中,我浏览了ARIMA如何工作的细节,但是请确保您浏览了本文中提供的链接。为了便于参考,以下是链接:

Python中时间序列预测初学者的综合指南

R语言中时间序列的完整教程

时间序列预测的7种技术(用Python码)

我建议在这里实践我们在这个实践问题上学到的东西:时间序列实践问题。你也可以把我们的培训课程创建在同一个实践问题上,时间序列预测,为你提供一个开头。免费视频教程:www.mlxs.top

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349