机器学习笔记之五用arima模型做需求预测用arima模型做需求预测

Angel_Kitty Angel_Kitty     2022-09-15     129

关键词:

本文结构:

  • 时间序列分析?
  • 什么是ARIMA?
  • ARIMA数学模型?
  • input,output 是什么?
  • 怎么用?-代码实例
  • 常见问题?

时间序列分析?

时间序列,就是按时间顺序排列的,随时间变化的数据序列。
生活中各领域各行业太多时间序列的数据了,销售额,顾客数,访问量,股价,油价,GDP,气温。。。

随机过程的特征有均值、方差、协方差等。
如果随机过程的特征随着时间变化,则此过程是非平稳的;相反,如果随机过程的特征不随时间而变化,就称此过程是平稳的。
下图所示,左边非稳定,右边稳定。


非平稳时间序列分析时,若导致非平稳的原因是确定的,可以用的方法主要有趋势拟合模型、季节调整模型、移动平均、指数平滑等方法。
若导致非平稳的原因是随机的,方法主要有ARIMA(autoregressive integrated moving average)及自回归条件异方差模型等。


什么是ARIMA?

ARIMA (Auto Regressive Integrated Moving Average) 可以用来对时间序列进行预测,常被用于需求预测和规划中。

可以用来对付 ‘随机过程的特征随着时间变化而非固定’ 且 ‘导致时间序列非平稳的原因是随机而非确定’ 的问题。不过,如果是从一个非平稳的时间序列开始, 首先需要做差分,直到得到一个平稳的序列。

模型的思想就是从历史的数据中学习到随时间变化的模式,学到了就用这个规律去预测未来。

ARIMA(p,d,q)模型,其中 d 是差分的阶数,用来得到平稳序列。

AR是自回归, p为相应的自回归项。

MA为移动平均,q为相应的移动平均项数。


ARIMA数学模型?

ARIMA(p,d,q)模型是ARMA(p,q)模型的扩展。

ARIMA(p,d,q)模型可以表示为:



其中L 是滞后算子(Lag operator),d in Z, d>0。

AR:
当前值只是过去值的加权求和。


MA:
过去的白噪音的移动平均。


ARMA:
AR和MA的综合。


ARIMA:
和ARMA的区别,就是公式左边的x变成差分算子,保证数据的稳定性。


差分算子就是:


令 wt 为:


则 ARIMA 就可以写成:



input,output 是什么?

输入历史数据,预测未来时间点的数据。


怎么用?-代码实例

本文参考了:时间序列实例
另外推荐大家看这篇,36大数据上有一个python版讲的不错,里面对稳定性的定量检验的讲解比较详细:时间序列预测全攻略-附带Python代码

ARIMA模型运用的基本流程有几下几步:

  1. 数据可视化,识别平稳性。
  2. 对非平稳的时间序列数据,做差分,得到平稳序列。
  3. 建立合适的模型。
    平稳化处理后,若偏自相关函数是截尾的,而自相关函数是拖尾的,则建立AR模型;
    若偏自相关函数是拖尾的,而自相关函数是截尾的,则建立MA模型;
    若偏自相关函数和自相关函数均是拖尾的,则序列适合ARMA模型。
  4. 模型的阶数在确定之后,对ARMA模型进行参数估计,比较常用是最小二乘法进行参数估计。
  5. 假设检验,判断(诊断)残差序列是否为白噪声序列。
  6. 利用已通过检验的模型进行预测。

使用ARIMA模型对裙子长度预测

1、加载数据

skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat", skip=5)
str(skirts)
head(skirts)
boxplot(skirts)
length(skirts)

2、把数据转化为是时间序列

skirts_ts <- ts(skirts, start=c(1886), frequency=1)

1)查看时间序列对应的时间

skirts_ts

2)画出时间序列图

plot.ts(skirts_ts)

从图可知:女人裙子边缘的直径做成的时间序列数据,从 1866 年到 1911 年在平均值上是不平稳的


3、做差分得到平稳序列

1)做时间序列的一阶差分

skirts_diff <- diff(skirts_ts, differences = 1)
plot.ts(skirts_diff)

从一阶差分的图中可以看出,数据仍是不平稳的,继续差分


2)做时间序列的二阶差分

skirts_diff2 <- diff(skirts_ts, differences = 2)
plot.ts(skirts_diff2)

二次差分后的时间序列在均值和方差上看起来是平稳了


4、找到合适的ARIMA模型

寻找 ARIMA(p,d,q)中合适的 p 值和 q

1)自相关图ACF

acf(skirts_diff2, lag.max = 20)

acf(skirts_diff2, lag.max = 20, plot = F)

自相关图显示滞后1阶自相关值基本没有超过边界值,虽然5阶自相关值超出边界,那么很可能属于偶然出现的,而自相关值在其他上都没有超出显著边界, 而且我们可以期望 1 到 20 之间的会偶尔超出 95%的置信边界。 自相关图5阶后结尾


2)偏相关图PACF

pacf(skirts_diff2, lag.max = 20)

pacf(skirts_diff2, lag.max = 20, plot = F)

偏自相关值选1阶后结尾
故我们的ARMIA模型为armia(1,2,5


3)使用auto.arima()函数,自动获取最佳的ARIMA模型

library(forecast)

auto.arima(skirts_ts, ic=c("aicc", "aic", "bic"), trace = T)

Best model: ARIMA(1,2,0)

5、建立ARIMA模型:并对比arima(1, 2, 0)与arima(1, 2, 5)模型


1)arima(1, 2, 0)模型

(skirts_arima <- arima(skirts_ts, order = c(1, 2, 0)))

aic = 391.33

2)arima(1, 2, 5)模型

(skirts_arima <- arima(skirts_ts, order = c(1, 2, 5)))

aic = 381.6

AIC是赤池消息准则SC是施瓦茨准则,当两个数值最小时,则是最优滞后分布的长度。我们进行模型选择时,AIC值越小越好。所以arima(1, 2, 5)模型较好

6、预测:预测5年后裙子的边缘直径

(skirts_forecast <- forecast.Arima(skirts_arima, h=5, level = c(99.5)))

plot.forecast(skirts_forecast)

7、检验

观察 ARIMA 模型的预测误差是否是平均值为 0 且方差为常数的正态分布,同时也要观察连续预测误差是否自相关

1)检验预测误差的自相关性

tsdiag(skirts_arima)

下面第一个图表代表估计模型误差的绘图。图中竖线的长度比较相似,都处在稳定范围之内,即估计的模型没产生不符合要求的误差分布。

第二张绘图,显示估计的模型没造成误差之间的任何关系。这是符合数据生成时每个数据都是独立的这个前提的。由此可见,这ACF图符合检测要求。

第三张图,也就是Ljung-Box 指标。这个指标可对每一个时间序列的延迟进行显著性的评估。判定技巧是,P-value点的高度越高,我们的模型越可信。

acf(skirts_forecast$residuals, lag.max = 20)

Box.test(skirts_forecast$residuals, lag=20, type = "Ljung-Box")

p-value = 0.9871
相关图显示出在滞后1-20阶中样本自相关值都没有超出显著置信边界,而且Ljung-Box检验的p值为0.99,所以我们推断在滞后1-20阶(lags1-20)中没明显证据说明预测误差是非零自相关的。

Acf检验说明:残差没有明显的自相关性,Ljung-Box测试显示:所有的P-value>0.05,说明残差为白噪声。


2)判断预测误差是否是平均值为零且方差为常数的正态分布
做预测误差的时间曲线图和直方图(具有正态分布曲线)

预测误差的均值是否为0

plot.ts(skirts_forecast$residuals)

自定义判断预测误差的方差是正态分布的函数

plotForecastErrors <- function(forecasterrors){
  #画预测误差的直方图
  hist(forecasterrors, col="red", freq = F)
  #画方差是预测误差数据的方差,平均值是0的正态分布数据的线
  mysd <- sd(forecasterrors)
  mynorm <- rnorm(10000, mean = 0, sd = mysd)
  myhist <- hist(mynorm, plot = F)
  points(myhist$mids, myhist$density, type="l", col="blue", lwd=2)
}
plotForecastErrors(skirts_forecast$residuals)

下图显示时间序列的直方图显示预测误大致是正态分布的且平均值接近于0。因此,把预测误差看作平均值为0方差为服从零均值、方差不变的正态分布是合理的。


既然依次连续的预测误差看起来不是相关,而且服从零均值、方差不变的正态分布,那么对于裙子直径的数据,ARIMA(1,2,5)看起来是可以提供非常合适预测的模型。


常见问题?

1.ARIMA建模的步骤


  1. 观察数据是否是时间序列数据,是否有seasonal等因素。
  2. transform:Box-correlation,保证variance是uniform的。如果用box-cor还不能稳定,还要继续深入挖掘。
  3. ACF/PACF 是为了找到 MA 和 AR 的order。
  4. d=0-stationarity,1,2-non stationarity
  5. 白噪音check:确定这个模型是optimize的,mean=0,平方差=1.
  6. 误差是白噪音的时候,model就ok了,就可以预测了

2.决定ARIMA参数的方法


d是差分的阶数,几阶后就可以保证稳定:


modelfit,计算出来的参数是 1,1,1 ,但可能 2,1,1 预测效果更好,那就用后者。


或者用AIC比较俩模型。


推荐阅读:

这一篇实例也不错:python时间序列分析

AR和MA的定义,有图比较:

关于ACF,PACF可以看Duke的材料:

关于AIC,BIC:aic-bic-vs-crossvalidation

理论简介的不错:

需求预测与分仓规划:

一个课程:Time Series Forecasting Theory | AR, MA, ARMA, ARIMA

语音从零之五用科大讯飞语音包实现语音打开已安装应用程序

【更新】有人说不会使用科大讯飞的语音包。这里是传送门,能够參考从零系列的前四篇文章(一)利用科大讯飞语音包实现Android语音识别Demo(二)科大讯飞语音包Mscdemo的使用(三)自己定义类中调用讯飞语音包错误解决的方... 查看详情

机器学习笔记:参数&超参数

1参数简单来说,模型参数就是模型内部的配置变量1.1参数的特征具体来讲,模型参数有以下特征:(1)进行模型预测时需要模型参数(2)模型参数值可以定义模型功能(3)模型参数用数据估... 查看详情

12篇顶会论文,深度学习时间序列预测经典方案汇总

...公众号“圆圆的算法笔记”,更多算法笔记和世间万物的学习记录~早期的时间序列预测主要模型是诸如ARIMA这样的单序列线性模型。这种模型对每个序列分别进行拟合。在ARIMA的基础上,又提出了引入非线性、引入外部特征等... 查看详情

如何执行不涉及重新拟合 ARIMA 模型的多步超时预测?

】如何执行不涉及重新拟合ARIMA模型的多步超时预测?【英文标题】:Howtoperformmulti-stepout-of-timeforecastwhichdoesnotinvolverefittingtheARIMAmodel?【发布时间】:2019-10-1314:46:07【问题描述】:我有一个现有的ARIMA(p,d,q)模型适合使用python的时... 查看详情

《机器学习》(西瓜书)笔记--线性模型

第三章  线性模型3.1 基本形式线性模型(linearmodel)试图学得一个通过属性的线性组合来进行预测的函数,即一般用向量形式写成,其中w和b学得之后,模型就得以确定。3.2 线性回归对离散属性的处理:若属性值... 查看详情

中文nlp笔记:13用keras实现一个简易聊天机器人

参考技术A第一步,引入需要的包:第二步,定义模型超参数、迭代次数、语料路径:第三步,把语料向量化:第四步,LSTM_Seq2Seq模型定义、训练和保存:第五步,Seq2Seq的Encoder操作:第六步,把索引和分词转成序列:第七步,定... 查看详情

python机器学习笔记(代码片段)

Python机器学习笔记一机器学习概述1.1人工智能概述1.1.1机器学习与人工智能、深度学习关系机器学习和人工智能、深度学习的关系机器学习是人工智能的一个实现途径深度学习是机器学习的一个方法发展而来达特茅斯会议(Da... 查看详情

斯坦福2014机器学习笔记七----应用机器学习的建议

一、纲要  纠正较大误差的方法  模型选择问题之目标函数阶数的选择  模型选择问题之正则化参数λ的选择  学习曲线二、内容详述  1、纠正较大误差的方法  当我们运用训练好了的模型来做预测时,发现会有较... 查看详情

机器学习模型错误预测

】机器学习模型错误预测【英文标题】:MachineLearningmodelWrongPrediction【发布时间】:2020-02-0920:48:23【问题描述】:我有一个来自createML的机器学习分类器。该模型使用3400个样本进行训练,总体而言其准确度令人印象深刻。然而,... 查看详情

吴恩达机器学习笔记-第六周

十、应用机器学习的建议10.1决定下一步做什么很多时候我们会发现我们通过最小化代价函数获得的模型所预测的值和真实值有很大的偏差(其实就是泛化能力差),此时我们可以在训练完之后对我们的模型进行诊断测试。测试模型... 查看详情

火炉炼ai机器学习007-用随机森林构建共享单车需求预测模型(代码片段)

【火炉炼AI】机器学习007-用随机森林构建共享单车需求预测模型(本文所使用的Python库和版本号:Python3.5,Numpy1.14,scikit-learn0.19,matplotlib2.2)共享单车是最近几年才发展起来的一种便民交通工具,基本上是我等屌丝上班,下班,相亲,... 查看详情

机器学习笔记

机器学习笔记(三)文章目录机器学习笔记(三)线性模型简介线性回归线性几率回归线性模型简介线性模型最简单的案例是最小二乘法:在机器学习的术语中,当预测值为连续值时,称为“回归问题... 查看详情

机器学习笔记

机器学习笔记(三)文章目录机器学习笔记(三)线性模型简介线性回归线性几率回归线性模型简介线性模型最简单的案例是最小二乘法:在机器学习的术语中,当预测值为连续值时,称为“回归问题... 查看详情

软件需求模式阅读笔记之五

这周我学习的是软件需求模式的第二章------需求规格的内容。      目前为止还没有唯一正确的方法阻止需求规格,但是反复出现在大部分系统中的主题,是我们应该注意和掌握的内容。从大的方面来说,需... 查看详情

使用额外回归量预测 ARIMA 模型

】使用额外回归量预测ARIMA模型【英文标题】:forecastingARIMAmodelwithextraregressors【发布时间】:2016-06-0205:12:26【问题描述】:假设我有一些时间序列如下,我想预测c1领先一步,这样做在R中非常简单且容易:testurl="https://docs.google.c... 查看详情

pandas高级数据分析快速入门之五——机器学习特征工程篇(代码片段)

...四——数据可视化篇Pandas高级数据分析快速入门之五——机器学习特征工程篇Pandas高级数据分析快速入门之六——机器学习预测分析篇0.Pandas高级数据分析使用机器学习概述需求解决方案技术方案 查看详情

pandas高级数据分析快速入门之五——机器学习特征工程篇(代码片段)

...四——数据可视化篇Pandas高级数据分析快速入门之五——机器学习特征工程篇Pandas高级数据分析快速入门之六——机器学习预测分析篇0.Pandas高级数据分析使用机器学习概述需求解决方案技术方案 查看详情

r语言的arima模型预测

R通过RODBC连接数据库stats包中的st函数建立时间序列funitRoot包中的unitrootTest函数检验单位根forecast包中的函数进行预测差分用timeSeries包中diffstats包中的acf和pacf处理自相关和偏自相关stats包中的arima函数模型  查看详情