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

Introduction

想象一下 - 您的任务是预测下一代iPhone的价格并提供历史数据。 这包括季度销售,月度支出以及Apple资产负债表附带的大量内容等功能。 作为一名数据科学家,您将哪种问题归类为? 当然是时间序列建模。

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


我们将首先了解ARIMA的概念,它将引导我们进入我们的主题 - 自动ARIMA。 为了巩固我们的概念,我们将采用一个数据集并在Python和R中实现它。

Table of content

  • 1什么是时间序列?
  • 2时间序列预测方法
  • 3 ARIMA简介
  • ARIMA实施的4个步骤
  • 5为什么我们需要AutoARIMA?
  • 6自动ARIMA实施(乘坐航空旅客数据集)
  • 7自动ARIMA如何选择参数?

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

1. What is a time series ?

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

例1:

假设您有一个从特定公司获得贷款的人员数据集(如下表所示)。您认为每一行都与前一行有关吗?当然不是!一个人的贷款将基于他的财务状况和需求(可能还有其他因素,如家庭规模等,但为简单起见,我们只考虑收入和贷款类型)。此外,未在任何特定时间间隔收集数据。这取决于公司何时收到贷款申请。
在这里插入图片描述

例2:

让我们再看一个例子。 假设您有一个数据集,其中包含每天空气中的二氧化碳水平(下面的屏幕截图)。 通过查看过去几天的数值,您能够预测第二天的大致二氧化碳量吗? 嗯,当然。 如果您观察到,数据已经每天记录,也就是说,时间间隔是恒定的(24小时)。
在这里插入图片描述

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

2. Methods for time series forecasting

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

扫描二维码关注公众号,回复: 6010003 查看本文章
  • 1朴素方法:在此预测技术中,预测新数据点的值等于先前的数据点。 结果将是一条平线,因为所有新值都采用先前的值。

在这里插入图片描述

  • 2简单平均值:将下一个值作为所有先前值的平均值。 这里的预测比“天真的方法”更好,因为它不会产生扁平线,但在这里,所有过去的值都被考虑在内并不总是有用。 例如,当被要求预测今天的温度时,你会考虑过去7天的温度,而不是一个月前的温度。

在这里插入图片描述

  • 3移动平均线:这是对先前技术的改进。 不是取所有先前点的平均值,而是将’n’个先前点的平均值作为预测值。
    在这里插入图片描述

  • 4加权移动平均线:加权移动平均线是移动平均线,其中过去的’n’值被赋予不同的权重。
    在这里插入图片描述

  • 5简单指数平滑:在这种技术中,较大的权重被分配给最近的观察,而不是来自遥远的过去的观察。在这里插入图片描述

  • 6 Holt的线性趋势模型:此方法考虑了数据集的趋势。 根据趋势,我们指的是该系列的增加或减少的性质。 假设酒店的预订数量每年都在增加,那么我们可以说预订的数量呈增长趋势。 该方法中的预测函数是水平和趋势的函数。
    在这里插入图片描述

  • 7 Holt Winters方法:该算法考虑了系列的趋势和季节性。 例如,酒店的预订数量在周末较高而在工作日较低,并且每年都会增加; 存在每周季节性和增长趋势。

在这里插入图片描述

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

3. Introduction to ARIMA

在本节中,我们将快速介绍ARIMA,这将有助于理解Auto Arima。本文包含有关Arima,参数(p,q,d),图(ACF PACF)和实现的详细说明:完整的时间序列教程

ARIMA是一种非常流行的时间序列预测统计方法。 ARIMA代表自动回归综合移动平均线。 ARIMA模型基于以下假设 -

  • 数据系列是固定的,这意味着均值和方差不应随时间变化。通过使用对数变换或差分系列,可以使系列静止。
  • 作为输入提供的数据必须是单变量序列,因为arima使用过去的值来预测未来值。

ARIMA有三个组成部分 - AR(自回归项),I(差分项)和MA(移动平均项)。让我们了解这些组成部分 -

  • AR术语是指用于预测下一个值的过去值。 AR项由arima中的参数“p”定义。 'p’的值使用PACF图确定。
  • MA术语用于定义用于预测未来值的过去预测误差的数量。 arima中的参数’q’代表MA术语。 ACF图用于识别正确的’q’值。
  • 差分顺序指定对系列执行差分运算以使其静止的次数。像ADF和KPSS这样的测试可用于确定系列是否静止并有助于识别d值。

4. Steps for ARIMA implementation

实施ARIMA模型的一般步骤是 -

  • 加载数据:模型构建的第一步当然是加载数据集
  • 预处理:根据数据集,将定义预处理的步骤。这将包括创建时间戳,转换日期/时间列的dtype,使系列单变量等。
  • 使系列静止:为了满足假设,必须使系列静止。这将包括检查系列的平稳性并执行所需的变换
  • 确定d值:为了使系列静止,将执行差值操作的次数作为d值
  • 创建ACF和PACF图:这是ARIMA实施中最重要的一步。 ACF PACF图用于确定ARIMA模型的输入参数
  • 确定p和q值:从上一步中的图中读取p和q的值
  • 拟合ARIMA模型:使用我们根据前面步骤计算的处理数据和参数值,拟合ARIMA模型
  • 预测验证集上的值:预测未来值
  • 计算RMSE:要检查模型的性能,请使用验证集上的预测值和实际值检查RMSE值

5. Why do we need Auto ARIMA?

尽管ARIMA是用于预测时间序列数据的非常强大的模型,但数据准备和参数调整过程最终非常耗时。在实施ARIMA之前,您需要使系列静止,并使用上面讨论的图确定p和q的值。 Auto ARIMA使我们的任务变得非常简单,因为它消除了我们在上一节中看到的步骤3到6。以下是实施自动ARIMA应遵循的步骤:

  • 加载数据:此步骤将相同。将数据加载到笔记本中
  • 预处理数据:输入应该是单变量的,因此丢弃其他列
  • 适合自动ARIMA:使模型适合单变量系列
  • 预测验证集上的值:对验证集进行预测
  • 计算RMSE:使用预测值与实际值检查模型的性能

如您所见,我们完全绕过了p和q功能的选择。终于解脱了!在下一节中,我们将使用玩具数据集实现自动ARIMA。

6. Implementation in Python and R

我们将使用International-Air-Passenger数据集。 该数据集包含每月总乘客数(以千计)。 它有两列 - 月份和乘客数量。 您可以从此链接下载数据集。

#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()

在这里插入图片描述

#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()

在这里插入图片描述

#calculate rmse
from math import sqrt
from sklearn.metrics import mean_squared_error

rms = sqrt(mean_squared_error(valid,forecast))
print(rms)
output -
76.51355764316357

Below is the R Code for the same problem:

# loading packages
library(forecast)
library(Metrics)

# reading data
data = read.csv("international-airline-passengers.csv")

# splitting data into train and valid sets
train = data[1:100,]
valid = data[101:nrow(data),]

# removing "Month" column
train$Month = NULL

# training model
model = auto.arima(train)

# model summary
summary(model)

# forecasting
forecast = predict(model,44)

# evaluation
rmse(valid$International.airline.passengers, forecast$pred)

7. How does Auto Arima select the best parameters

在上面的代码中,我们简单地使用.fit()命令来拟合模型,而不必选择p,q,d的组合。 但该模型是如何找出这些参数的最佳组合的? 自动ARIMA会考虑生成的AIC和BIC值(如代码中所示),以确定最佳的参数组合。 AIC(Akaike信息准则)和BIC(贝叶斯信息准则)值是比较模型的估算器。 这些值越低,模型越好。

如果您对AIC和BIC背后的数学感兴趣,请查看这些链接。

8. End Notes and Further Reads

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

我建议练习我们在这里练习的问题:时间序列练习题。 您也可以参加我们针对同一练习题创建的培训课程,时间序列预测,为您提供一个头脑 开始。

祝您好运,并随时在下面的评论部分提供您的反馈和提问。

猜你喜欢

转载自blog.csdn.net/weixin_41697507/article/details/89428859