时间序列模型算法 - ARIMA (一)

简介: 时间序列模型算法 - ARIMA (一)

1.时间序列模型概述


时间序列是研究数据随时间变化而变化的一种算法。是一种预测性分析算法。它的基本出发点就是事物发展都有连续性,按照它本身固有的规律进行。


时间序列的常用算法包括:

有这几个那如何选择模型呢


首先我们要知道时间序列就是按照时间顺序排列,随时间变化的随机过程,也就是说有对应的均值、方差、协方差等。

时间序列可以解决在只有时间(序列项)而没有其他可控变量下对未来数据的预测问题,常用于经济预测、股市预测、天气预测等。


如果随机过程随着时间变化,则此过程是非平稳的,相反,如果随机过程的特征不随时间变化,则此过程为平稳的


  • 如果导致非平稳的原因确定:ES、MA、AR、ARMA
  • 如果是平稳序列:ARIMA

1.1 时间序列的不同分类


时间序列是按时间顺序排列的、随时间变化且相互关联的数据序列。分析时间序列的方法构成数据分析的一个重要领域,即时间序列分析。


时间序列根据研究的依据不同,可有不同的分类。


按研究对象的多少划分,有一元时间序列和多元时间序列。

按时间的连续性将时间序列分为离散时间序列和连续时间序列两种。

按序列的统计特性划分,有平稳时间序列和非平稳时间序列。

如果一个时间序列的概率分布与时间t无关,则称该序列为严格的(狭义)平稳时间序列。


如果序列的一、二阶矩存在,而且对任意时刻t满足:


(1)均值为常数


(2)协方差为时间间隔 T 的函数。则称为宽平稳(广义)时间序列。以后研究的时间序列主要是宽平稳时间序列。


按时间序列的分布规律划分,有高斯型时间序列和非高斯型时间序列。


1.2 确定性时间序列分析方法概述


一个时间序列可以分解为以下四部分:


(1)长期趋势变动。它指时间序列朝一定方向持续上升或下降,或停留在某一水平上,它反映了客观事物的主要变化趋势。

(2)季节变动。

(3)循环变动。通常指周期为一年以上,由非季节因素引起的波形相似的波动。

(4)不规则变动。通常为突然变动和随机变动。


1.3 三种时间序列模型


1687246877848.png

2.指标平滑ES


2.1 一次指数平滑法


线性回归算法中,每个经验点的权重是一致的,即很早以前的经验数据也可能对预测数据有较大的影响。很多实际场景中,未来一段时间的趋势可能和在最近一段时间的趋势关系更加紧密。比如小明去年数学考试成绩一直不及格,今年连续多次考试90多分,预测小明下一次数学考试的成绩,情理上90多分的可能性更高。采用传统的线性回归算法,预测结果可能是70多分。


指数平滑法原则认为,时间越靠过去的经验数据对趋势的影响越小。我们假定时间t的观测值为y(t),时间t的预测值为S(t),则时间t+1的预测值S(t+1)为


1687246927125.png

另外还有二次指数平滑、三次指数平滑,就不介绍,懒得写


3.ACF与PACF


首先来说ACF与PACF是用来确定模型AR(p,)、MA(q,)、ARMA(p,q)、ARIMA(p,l,q),中p、q。方法如下:

  • 截尾:落在置信区间(95%的点都符合该规则)


如何用PACF图和ACF图来确定p、q值

通常我们确定了模型后,看模型的数据的阶数和2倍标准差范围。


这里先解释一下 阶数就是历史观测项,比如当前时间t数据为x t x_tx t 阶数为7,表示x t − 7 x_{t-7}x



🥳开始可以对照上面的表进行分析


acf、pacf图如下图


a4015c68386546e2a14cb35c447fba37.png

可以看到acf图中q到7阶段时,后续的值逐渐倾向于0的,是符合拖尾的,在pacf图中p到1阶段时,后续的值逐渐倾向于0的。所以模型为AR(1),

假设选择模型为ARMA


其acf、pacf图如下图

176d36acc6fe4edfbe282de1f6e9fc61.png


ACF和PACF都呈现衰减趋于零,在1阶位置就开始基本落在2倍标准差范围,所以是ARMA(1,1)模型


4.AR


AR是线性时间序列分析模型,通过自身当前数据与历史之前的数据之间的相关关系(自相关)来建立回归方程,

在时间序列中,当前观测值可以通过历史的观测值,结合相关性获得,公式如下:


1687247027390.png

5.MA


过将一段时间序列中白噪声序列进行加权和,可以得到移动平均方程。

在时间序列中,当前观测值是由历史的误差的线性组合成的,这些误差互相独立分布且服从正态分布。公式如下:


1687247050165.png

6.ARMA


自回归移动平均模型是与自回归和移动平均模型两部分组成。

ARMA(p,q)模型全称为自回归移动平均模型,公式如下:


1687247084358.png

7.ARIMA


ARIMA(p,d,q)模型全称为差分自回归移动平均模型

(Autoregressive Integrated Moving Average Model,简记ARIMA).

自回归(AR),差分(I),移动平均(MA)

趋势参数:

  • p:趋势自回归阶数。
  • d:趋势差分阶数。
  • q:趋势移动平均阶数。


ARIMA与ARMA模型公式都是一样的,区别在于,ARIMA公式中的Y变成差分算子(即Y是经过原始Y值差分计算了一次的新值),保证了数据 的稳定性。


7.1 差分


差分(difference)又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具。它将原函数f(x) 映射到f(x+a)-f(x+b) 。差分运算,相应于微分运算,是微积分中重要的一个概念。总而言之,差分对应离散,微分对应连续。差分又分为前向差分、向后差分及中心差分三种。


通常情况下我们用到的是前向差分公式如下:

1687247143004.png

差分的阶


称为阶的差分,即前向阶差分 ,如果数学运用根据数学归纳法,有其中,为二项式系数。特别的,有前向差分有时候也称作数列的二项式变换


😍以物理学中来理解,一个汽车位移与时间的问题。

一阶导数表示速度,二阶差分表示速度的导数加速度。同样的,在时间序列模型中,一阶差分表示相邻时间的数据的变化情况,二阶差分就表示这种变化的变化强弱。


8. ARIMA实践


8.1 读取数据


🥰这里的数据集AirPassengers.csv,百度都搜到得


import numpy as np
import pandas as pd
from datetime import datetime
import matplotlib.pylab as plt
data=pd.read_csv('AirPassengers.csv',encoding='utf-8')
data.head(5)

be85bc2563a74ca9a462e70432519983.png

8.2 画图,观察数据是否非平稳


def draw_ts(timeSeries):
    f = plt.figure(facecolor='white')
    timeSeries.plot(color='blue')
    plt.legend()
    plt.show()
draw_ts(data)

2ea4de84a4324e6f9f381613ca31c6cf.png

🐻从图中看,序列是非平稳时间序列。


8.3 差分,观察数据


一阶差分


data['diff_1']=data.diff()
draw_ts(data['diff_1'])


59b761c5324547ada371b2f711514507.png

二阶差分,我们通常最多就做到二阶差分就行


data['diff_2']=data['diff_1'].diff()
draw_ts(data['diff_2'])

ce7fd79a101142869d7997ea17e9f607.png


🐻大致可以看图,差分为平稳时间序列


8.4 单位根检验,确定数据为平稳时间序列


单位根检验背后的直觉是它确定趋势定义时间序列的强度。

有许多单位根测试,Augmented Dickey-Fuller可能是更广泛使用的之一。它使用自回归模型并优化跨多个不同滞后值的信息标准。


测试的零假设是时间序列可以用单位根表示,它不是静止的(具有一些时间依赖的结构)。替代假设(拒绝零假设)是时间序列是静止的。


空假设(H0):如果未被拒绝,则表明时间序列具有单位根,这意味着它是非平稳的。它有一些时间依赖的结构。

替代假设(H1):零假设被拒绝;

它表明时间序列没有单位根,这意味着它是静止的。它没有时间依赖的结构。


我们使用测试中的p值来解释这个结果。在下面的代码反馈结果也会出现p。低于阈值的p值(例如5%或1%)表明我们拒绝零假设(静止),否则高于阈值的p值表明我们未能拒绝零假设(非静止)。


  • p值> 0.05:无法拒绝原假设(H0),数据具有单位根并且是非平稳的。
  • p值<=0.05:拒绝原假设(H0),数据没有单位根并且是静止的。

我们先用原数据进行检验看看。


def testStationarity(ts):
    dftest = adfuller(ts)
    # 对上述函数求得的值进行语义描述
    dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
    for key,value in dftest[4].items():
        dfoutput['Critical Value (%s)'%key] = value
    return dfoutput
testStationarity(data)

315bdc7590274490943034e20120ae32.png


上图我们只需关注p值,其余的参数解释如下:


Test Statistic:ADF检验的结果

p-value:p值

Lags Used:滞后数量

Number of Observations Used:用于ADF回归和临界值计算的数量

Critical Value:临界值1%、5%、10%

下面我们用1阶差分来检验


diff_1=data.diff()
diff_1 = diff_1.dropna()
testStationarity(diff_1)

63d3c553a97a437aa30157b9be5909c1.png🐯从结果来看还无法拒绝原假设(原假设为是平稳时间序列),这时候我们通常对原数据先进行对数处理,再进行一次差分。


del data['diff_1']
del data['diff_2']
ts_log = np.log(data)
draw_ts(ts_log)


98b12ab6498044e0b0e1083fd5c85b59.png

logdiff_1=ts_log.diff(12)
logdiff_1 = logdiff_1.dropna()
logdiff_2=logdiff_1.diff(1)
logdiff_2=logdiff_2.dropna()
testStationarity(logdiff_2)

a5fa37ff688e41f89f8b8cd750f2328e.png


🙊p值小于0.05,拒绝原假设(原假设为是平稳时间序列),故数据为平稳时间序列


8.5 Q检验,检验是否数据具有相关性


检验当前时刻t到滞后时刻k(Lags Used),y t y_ty  与y_{t-k}的相关性。

由上小节得到的滞后值为12.


from statsmodels.stats.diagnostic import acorr_ljungbox
acorr=acorr_ljungbox(logdiff_2,lags=12)
acorr


c02f49b7e2e449768cfc8701813c441d.png


🏀这里acorr[0]为这12个时刻的统计值,acorr[1],为t时刻的统计值与滞后的12时刻的相关性。

从结果可以看出,p值较小,拒绝原假设(没有相关性),故数据有序列相关性


8.6 确定AR和MA,画ACF、PACF判断


from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
pacf = plot_pacf(logdiff_2, lags=20)
plt.title('PACF')
pacf.show()
acf = plot_acf(logdiff_2, lags=20)
plt.title('ACF')
acf.show()

a0132f0fa06a47c2b58bc49fd529c559.png

aa911ad66c6a4d6d8e3e66d749125478.png

🏉从图可得 p=1,q=1


8.7 使用AIC、BIC最小准则确定p、q


import statsmodels.tsa.stattools as st
model = st.arma_order_select_ic(logdiff_2, max_ar=5, max_ma=5, ic=['aic', 'bic', 'hqic'])
model.bic_min_order 


返回(2,3)


8.8 拟合ARIMA或者ARMA模型


使用差分后的数据


from statsmodels.tsa.arima_model import ARMA
model_arma = ARMA(logdiff_2, order = model.bic_min_order)
result_arma = model_arma.fit(disp = -1, method = 'css')


使用原始数据


from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(data, order=(1,1,1))
result = model.fit()


8.9 检验模型效果:残差检验


残差检验,对已经训练好的模型,对模型的残差,进行可视化,

对残差进行可视化,判断残差是否符合正态分布


若为正态分布则恭喜你,模型建立完毕

若不为正态分布,则说明残差中还有有用信息,需要你优化模型啦


resid = result.resid
from statsmodels.graphics.api import qqplot
qqplot(resid, line='q', fit=True)
plt.show()

86a5099541d14f4b890611929c64d5d6.png


8.10 预测


pred = result.predict(start=1, end =len(data) + 10 ) # 从训练集第0个开始预测(start=1表示从第0个开始),预测完整个训练集后,还需要向后预测10个
print(len(pred))
print(pred[-10:]) # 有负数,表明是一阶差分之后的
# 此时可以画出预测的曲线和data_diff进行比较

32fce2076062487c8a4bffc63e2ab0a1.png


8.11 将预测的平稳值还原为非平稳序列


result_fina = np.array(pred[0:-10]) + (np.array(data.shift(1)))
result_fina
# 如果还取了对数,进行如下操作
# result_log_rev = np.exp(result_fina)
# result_log_rev.dropna(inplace=True)
相关文章
|
16天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
53 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
16天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
62 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
27天前
|
机器学习/深度学习 人工智能 算法
青否数字人声音克隆算法升级,16个超真实直播声音模型免费送!
青否数字人的声音克隆算法全面升级,能够完美克隆真人的音调、语速、情感和呼吸。提供16种超真实的直播声音模型,支持3大AI直播类型和6大核心AIGC技术,60秒快速开播,助力商家轻松赚钱。AI讲品、互动和售卖功能强大,支持多平台直播,确保每场直播话术不重复,智能互动和真实感十足。新手小白也能轻松上手,有效规避违规风险。
|
29天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
74 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
3月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
111 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
2月前
|
机器学习/深度学习 数据采集 算法
如何在一夜之间成为模型微调大师?——从零开始的深度学习修炼之旅,让你的算法功力飙升!
【10月更文挑战第5天】在机器学习领域,预训练模型具有强大的泛化能力,但直接使用可能效果不佳,尤其在特定任务上。此时,模型微调显得尤为重要。本文通过图像分类任务,详细介绍如何利用PyTorch对ResNet-50模型进行微调,包括环境搭建、数据预处理、模型加载与训练等步骤,并提供完整Python代码。通过调整超参数和采用早停策略等技巧,可进一步优化模型性能。适合初学者快速上手模型微调。
103 8
|
2月前
|
机器学习/深度学习 算法 数据挖掘
基于GWO灰狼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了基于分组卷积神经网络(GroupCNN)和灰狼优化(GWO)的时间序列回归预测算法。算法运行效果良好,无水印展示。使用Matlab2022a开发,提供完整代码及详细中文注释。GroupCNN通过分组卷积减少计算成本,GWO则优化超参数,提高预测性能。项目包含操作步骤视频,方便用户快速上手。
|
2月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于WOA鲸鱼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了一种基于WOA优化的GroupCNN分组卷积网络时间序列预测算法。使用Matlab2022a开发,提供无水印运行效果预览及核心代码(含中文注释)。算法通过WOA优化网络结构与超参数,结合分组卷积技术,有效提升预测精度与效率。分组卷积减少了计算成本,而WOA则模拟鲸鱼捕食行为进行优化,适用于多种连续优化问题。
|
2月前
|
机器学习/深度学习 算法 搜索推荐
django调用矩阵分解推荐算法模型做推荐系统
django调用矩阵分解推荐算法模型做推荐系统
38 4