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


    一、时间序列分析

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

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

    如图所示:

    非平稳时间序列分析时,若导致非平稳的原因是确定的,可以用的方法主要有趋势拟合模型、季节调整模型、移动平均、指数平滑等。

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

    二、ARIMA

    1、简介

    ARIMA通常用于需求预测和规划中。可以用来对付随机过程的特征随着时间变化而非固定。并且导致时间序列非平稳的原因是随机而非确定的。不过,如果从一个非平稳的时间序列开始,首先需要做差分,直到得到一个平稳的序列。模型的思想就是从历史的数据中学习到随时间变化的模式,学到了就用这个规律去预测未来。

    ARIMA(p,d,q)

    • 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是移动平均项数

    2、自回归模型AR

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

    自回归模型需要先确定一个阶数p,表示用几期的历史值来预测当前值。p阶自回归模型可以表示为:

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

    AR的限制:

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

    3、移动平均模型MA

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

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

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

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

    5、p、q的确定

      (1)

      

      (2)结合最终的预测误差来确定p、q的阶数,在相同的预测误差情况下,根据奥斯卡姆剃刀准则,模型越小越好。平衡预测误差和参数个数,我们可以根据信息准则函数法,来确定模型的阶数。预测误差通常用平方误差即残差平方和来表示。

         常用的信息准则函数法:

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

    6、模型的检验

    主要的检验值:

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

    残差序列的随机性可以通过自相关函数法来检验,即做残差的自相关函数图

    三、代码实现

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

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

    1、背景

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

    2、 步骤

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

    1、检查数据平稳性并且使数据平稳, 然后对数据求差分

     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)

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

     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.

    3、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)
    谢谢!
  • 相关阅读:
    正确使用SqlConnection对象,兼谈数据库连接池
    简单设计实现基于Forms认证的注册登录等用户基础服务
    简单利用Memcached进行缓存层设计
    殊途同归,ado.net快速实现MySql的CRUD
    【数据库设计】“Max加一”生成主键的注意点
    利用FastReflectionLib快速实现对象克隆
    容易遗忘的一些小代码之 Cross apply and Outer apply
    OBJECT_ID 有哪些种类
    BIWORK 分区表阅读与实践笔记
    容易遗忘的一些小代码之 Merge Operation and Output Clause
  • 原文地址:https://www.cnblogs.com/ylxn/p/10750642.html
Copyright © 2020-2023  润新知