ARIMA模型原理以及代码实现案例

2021年11月25日 阅读数:0
这篇文章主要向大家介绍ARIMA模型原理以及代码实现案例,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1、时间序列分析

北京每一年每月旅客的人数,上海飞往北京每一年的游客人数等相似这种顾客数、访问量、股价等都是时间序列数据。这些数据会随着时间变化而变化。时间序列数据的特色是数据会随时间的变化而变化。app

随机过程的特征值有均值、方差、协方差等。若是随机过程的特征随时间变化而变化,那么数据是非平稳的,相反,若是随机过程的特征随时间变化而不变化,则此过程是平稳的。函数

如图所示:学习

非平稳时间序列分析时,若致使非平稳的缘由是肯定的,能够用的方法主要有趋势拟合模型、季节调整模型、移动平均、指数平滑等。url

若致使非平稳的缘由是随机的,方法主要有ARIMA,以及自回归条件异方差模型等。spa

 

 

2、ARIMA

一、简介.net

ARIMA一般用于需求预测和规划中。能够用来对付随机过程的特征随着时间变化而非固定。而且致使时间序列非平稳的缘由是随机而非肯定的。不过,若是从一个非平稳的时间序列开始,首先须要作差分,直到获得一个平稳的序列。模型的思想就是从历史的数据中学习到随时间变化的模式,学到了就用这个规律去预测将来。code

 

ARIMA(p,d,q)blog

  • d是差分的步长(差分的阶数指的是进行多少次差分。好比步长为n的一阶差分diff(x) = f(x) - f(x - n), 而二阶步长为n的差分: diff(x) = f(x) - f(x-n), diff(x-n) = f(x-n) - f(x - n - n), diff二阶差分(x - n) = diff(x) - diff(x-n)),用来获得平稳序列
  • p为相应的自回归项
  • q是移动平均项数

 

二、自回归模型ARget

自回归模型描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测。自回归模型必须知足平稳性pandas

自回归模型须要先肯定一个阶数p,表示用几期的历史值来预测当前值。p阶自回归模型能够表示为:

yt是当前值,u是常数项,p是阶数,r是自相关系数,e是偏差

AR的限制:

  •  自回归模型是自身的数据进行预测
  • 必须具备平稳性
  • 必须具备相关性
  • 若是自相关系数小雨0.5,则不宜采用
  • 自回归只适用于预测与自身前期相关的现象

三、移动平均模型MA

移动平均模型关注的自回归模型中的偏差项的累加,q阶自回归过程的公式定义以下:

移动平均模型能有效地消除预测中的随机波动

 

四、自回归移动平均模型ARMA

自回归模型AR和移动平均模型MA模型相结合,咱们就获得了自回归移动平均模型ARMA(p,q),计算公式以下:

 

五、p、q的肯定

  (1)

  

  (2)结合最终的预测偏差来肯定p、q的阶数,在相同的预测偏差状况下,根据奥斯卡姆剃刀准则,模型越小越好。平衡预测偏差和参数个数,咱们能够根据信息准则函数法,来肯定模型的阶数。预测偏差一般用平方偏差即残差平方和来表示。

     经常使用的信息准则函数法:

  • ACI == 2*(模型参数个数)-2ln(模型的极大似然函数)
  • BIC = ln(n) * (模型中参数的个数)-2ln(模型的极大似然函数值),n是样本容量

 

六、模型的检验

主要的检验值:

  • 检验参数估计的显著性(t检验)
  • 检验残差序列的随机性,即残差之间是独立的

残差序列的随机性能够经过自相关函数法来检验,即作残差的自相关函数图

 

3、代码实现

摘自kaggle一道题目。Web traffic。连接:

https://www.kaggle.com/mohitguptaomg/simple-forecast-with-ar-ma-arima

一、背景

维基百科的每个主题每一天都有一个浏览量。给定了每个主题历史的浏览数目,让你预测一下将来这个主题浏览数目。

 

 

二、 步骤

  • 检查数据平稳性
  • 使数据平稳
  • 对数据求差分
  • 求自相关系数和偏相关系数
  • 使用ARIMA模型

一、检查数据平稳性而且使数据平稳, 而后对数据求差分

 1 import pandas as pd
 2 import numpy as dragon
 3 import pylab as p
 4 import matplotlib.pyplot as plot
 5 from collections import Counter
 6 from statsmodels.tsa.stattools import adfuller
 7 from statsmodels.tsa.seasonal import seasonal_decopose
 8 .....
 9 .....
10 def test_stationarity(x):
11     result = adfuller(x)
12     print('ADF : %f' % result[0])
13     print('p-value: %f' % result[1])
14     for key, value in result[4].items():
15         if result[0] > value:
16             print("The data is non stationery")
17         else:
18             print("The data is stationery")
19         break
20 
21 
22 tv_log = dragon.log(total_view['en']) # log使数据波动幅度变小,经常使用处理方法
23 tv_log_diff = tv_log - tv_log.shift() # 步长为1的差分
24 tv_log_diff.dropna(inplaces=True)
25 test_stationarity(tv_log_diff)

 

二、求自相关系数与便相关系数

 1 from statsmodels.tsa.statools import acf, pacf
 3 
 4 lag_acf = acf(tv_log_diff, nlags=10)
 5 lag_pacf = pacf(tv_log_diff, nlags=10, method='ols')
 6 
 7 plot.subplot(1, 1, 1)
 8 plot.plot(lag_acf)
 9 
10 plot.axhline(y=0, linestyle='--', color='g')
11 plot.title('Autocorrelation Function')
12 plot.show()
13 
14 
15 plot.subplot(1, 1, 1)
16 plot.plot(lag_pacf)
17 
18 plot.axhline(y=0, linestyle='--', color='g')
19 plot.title('Partial Autocorrelation Function')
20 plot.show()

结果:

 

能够看到截尾的位置均为1处,所以p,q均取1.

 

三、ARIMA

 1 from statsmodels.tsa.arima_model import ARIMA
 2 from pandas import DataFrame
 3 
 4 size = int(len(tv_log - 100))
 5 train_arima, test_arima = tv_log[0:size], tv_log[size:len(tv_log)]
 6 history = [x for x in train_arima]
 7 predictions = list()
 8 originals = list()
 9 error_list = list()
10 
11 for t in range(len(test_arima)):
12     # 预测一个从新训练一遍模型
13     model = ARIMA(history, order=(1, 1, 1)) # 不要使用差分后的数据, 这里面填写的是步长为d的差分 order对应的参数(p,d, q)
14     model_fit = model.fit(disp=0)
15     output = model_fit.forcast()
16     pred_value = dragon.exp(output[0])
17     original_value = dragon.exp(test_arima[0])
18 
19     predictions.append(pred_value)
20     originals.append(original_value)