最近又有好些朋友来咨询掌柜关于 使用ARIMA模型对时间序列进行预测的👉 这篇博客 遇到了一些问题,这里掌柜再次收集大家的问题来一一解答。

PS: 本博客假定大家已经具备ARIMA模型的基础知识!!!

问题汇总如下:

  • 怎么判断我的数据是否适合ARIMA模型呢?
  • 得到的时序预测图是负值,明显不对。怎样保证为正值?
  • 想要最后预测的数据,而不是预测的平稳数据,怎么拿到?
  • 想获取预测点的值应该怎么做的,没有API接口呀,可以告知一下吗?
  • 不需要做ADF检验吗?
  • 怎么确定ARMA/ARIMA的最优模型?
  • 还原到原始时间序列那一步应该是要加在平稳序列预测的结果上吧。代码第95行中的ts_record,运行完之后是原始数据呀,这样还是对非平稳的原始序列进行预测的?
  • 在pr = result.predict(‘1988’, ‘2020’,typ=‘levels’) 里面加入了typ参数 就和这个结果是一样的。请问是不是typ这个参数控制输出预测值的类型呢?
  • 最后用真实值预测的时候,真实值和预测值的线性变化图趋势很接近。但是用 result.predict(‘1988’, ‘2020’)想将模型的预测值导出来的时候,发现输出结果和真实值差别很大,将真实值和输出值单独做线图也差别很大,是为什么?
  • statsmodels的版本是多少?
  • AttributeError: ‘NoneType’ object has no attribute 'fit’报错如何解决?

该篇博客先解决前面六个问题,

1. 怎么判断我的数据是否适合(非季节性)ARIMA模型呢?

答:
一般需要遵循两点:

  • 时序数据本身具有一定的趋势性, 差分过后 可以去除趋势,让 时序呈现平稳 状态;
  • 可以通过历史数据的 较强自相关性 (自相关性指时间序列滞后值之间的线性关系)对未来进行预测;且受随机噪声的影响不大。

2. 得到的时序预测图是负值,明显不对。怎样保证为正值?

答:
首先思考一下,为何时序预测会出现负值?不同案例中可能存在多个客观因素干扰,但是大致会有这么几种情况:

  • 第一种:你的 时序 数据本身是 呈现递减趋势 ,而且差分后波动幅度不大,那么预测就会出现负值的情况;
  • 第二种: 预测的步长太长 ,超过实际可预测区间;
  • 第三种:时序数据中存在缺失值或NULL值,你之前 处理缺失值或NULL值的时候,用 0填充过 ,所以才会后面预测出现负值。

那么 如何处理这些负值? 一般来说,都会 直接用0来替代 负值。或许用numpy的absolute()函数也能处理。当然如果是第一种情况,建议换个模型来预测。
目前暂时想到这些办法, 如果大家有更好的处理方式,欢迎评论区留言!谢谢。

3. 想要最后预测的数据,而不是预测的平稳数据,怎么拿到?

4. 想获取预测点的值应该怎么做的,没有API接口呀,可以告知一下吗?

第三和第四个问题都是同一个,所以一起回答。因为在经典模型那篇最后得到的是差分后的预测值,所以很多朋友在问 如何获取原始时序的预测值?
答:
直接上代码( 还是以经典模型那篇的示例数据来演示的

#第六步:使用ARIMA模型进行未来10年预测
import warnings
warnings.filterwarnings('ignore', 'statsmodels.tsa.arima_model.ARMA',
                        FutureWarning)
warnings.filterwarnings('ignore', 'statsmodels.tsa.arima_model.ARIMA',
                        FutureWarning)
model = ARIMA(data,order=(7,0,0)) #导入ARIMA模型
result = model.fit()
#预测未来10年
pred = result.predict(start = 90, end = 99, dynamic = True)
#下面这句也可以
#pred = result.predict('1991', '2000')

运行后会得到如下数据:
在这里插入图片描述

5. 不需要做ADF检验吗?

答:其实是需要的,只是当时的博客没有加入这段。

  • 那么问题又来了,为何要做ADF检验? 或ADF检验的用处是什么?

    • 简单来说,ADF检验就是为了检查时序是否是平稳的!ADF检验的英文全称Augmented Dickey-Fuller test。
    • 它是一种假设性检验,其中的零假设是数据不平稳。
  • 当通过ADF检验计算,如何看ADF检验的结果?这里主要看p值

    • p > 0.05, 表示不拒绝零假设(H0),说明时序数据是不平稳的,且存在单位根。
    • p <= 0.05, 表示拒绝零假设(H0),说明时序数据是平稳的,且不存在单位根( 简单解释一下,单位根指的是概率统计学中,一些随机过程(比如随机游走)的一个特征。 再直白点说,如果时间序列存在单位根,说明它存在随机趋向)。
  • Python中ADF检验的具体方法/代码:

    • 常用statsmodels库里面的adfuller模块来进行ADF检验。
    • 参考代码:
from statsmodels.tsa.stattools import adfuller
def adf_test(timeseries):
    print("Results of Dickey-Fuller Test:")
    dftest = adfuller(timeseries, autolag="AIC")
    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
    print(dfoutput)

6. 怎么确定ARMA/ARIMA的最优模型?

答:
计算不同模型的AIC,最低的就是相对最优的时序模型

剩余五个问题改天继续解答,如果大家还有疑问,可以继续评论区留言,谢谢🤝。

PPS:
个人知识有限,也许文中存在理解错误,也欢迎大家捉虫!
😁

参考资料:
Stationarity and detrending (ADF/KPSS)
negative-values-in-time-series-forecast
Unit root

最近又有好些朋友来咨询掌柜关于使用ARIMA模型对时间序列进行预测的????这篇博客 中遇到了一些问题,这里掌柜再次收集大家的问题来一一解答。PS: 本博客假定大家已经具备ARIMA模型的基础知识!!!问题汇总如下:怎么判断我的数据是否适合ARIMA模型呢?得到的时序预测图是负值,明显不对。怎样保证为正值?想要最后预测的数据,而不是预测的平稳数据,怎么拿到?想获取预测点的值应该怎么做的,没有API接口呀,可以告知一下吗?不需要做ADF检验吗?怎么确定ARMA的最优模型?还原到原始时间序列 严平稳与弱平稳: **严平稳:分布不随时间的改变而改变。**如白噪声(正态),期望始终为0,方差为1。 **弱平稳:期望与相关系数(依赖性)不变。**未来某时刻的t值Xt就要依赖于它的过去信息,所以需要依赖性。 仔细看,阴影部分是预测后的结果走势,这里是蓝色的直线??? 是不是很奇怪,为何这里会产生一条直线? 起初掌柜也很是困惑,于是向这位朋友拿了全部数据来进行实测也是得到同样的结果。。。后来掌柜搜遍全网后研究一番,原来是这么回事!下面开始进行讲解。 首先,使用ARIMA模型进行时序预测为何会出现是一条直线? 解答:简单来说是因为你的时序数据中存在“季节周期性”(注:这里的季节性是泛指)特征。所以模型
NotImplementedError: statsmodels.tsa.arima_model.ARMA and statsmodels.tsa.arima_model.ARIMA havebe
R2 —— 评估回归的方法 回归是将函数拟合到数据的方法。例如,我们能够通过卫星统计沃尔玛门口停车场的汽车数量,也可以通过其收益报告了解沃尔玛在对应时段的销售额。于是,你想建立一个汽车数量与沃尔玛季度收益的函数关系,以便于您炒股。但是,在建立了汽车数量与季度收益的函数关系以后,我们应该如何评判你和出来的函数关系的优劣呢?常用的度量拟合效果的参数是决定系数R2。本文将详细介绍R2的计算原理及负值产生的原因分析: 什么是R2R2用于比较回归模型的预测误差与简单的Y=样本点平
因为之前在学数据分析课程的时候老师讲到时间序列这里,但只是简单的对这个经典时间序列案例介绍了一下,并没有涉及对差分次数d的查找、找ARIMA模型的p、q值和模型检验 这三个步骤。 后来我搜寻了整个网络,终于结合各个文章的解释,对代码进行了重新的梳理,下面就是详细的整个代码过程(如果问题,欢迎提出来指正!????): # -*- coding: utf-8 -*- # 用 ARIMA 进行时间序列预测 原文作者:Jason Brownlee 原文地址:https://machinelearningmastery.com/save-arima-time-series-forecasting-model-python/ 译者微博:@从流域到海域 译者博客:blog.csd
参考了网上的资料,虽然不太明白是什么意思,但是这样的模型不能用。 参考:http://stackoverflow.com/questions/15054800/auto-arima-forecast-with-multivariate-xreg-unexpected-results/15056937#15056937 转载于...
转载自 https://mp.weixin.qq.com/s/g6xwiRYhNyulwLlBYLh-4Q?scene=25 仅仅用于学习方面,如有侵权,请联系 root@smileyan.cn 「时间序列」是指某一个指标按照时间的统计或者观测而成的数列。比如,在运维的领域中,某主机每秒的CPU使用率、某业务每分钟的请求数量等,都可以形成一条时间序列;「异常检测」是指对反常的、和历史不同的行为模式识别。如某台一直空闲的机器,CPU使用率突然飙升至100%、某系统在本应业务繁忙的时间段请求数量降.
ARIMA模型 前面讲到的指数平滑模型,对于预测误差要求是无相关性并且结果是满足以0为中心的正态分布的。对时间序列分析是,有些情况下,把相关性考虑进去能做更好的预测。ARIMA模型就包含了对时间序列的无规律部分做预测的模型,在无规律部分,允许出现非零相关性。 对时间序列做差分 ARIMA模型是针对稳定时间序列的。若是你的分析对象是非稳定的时间序列,那么你首先就需要对时间序列做差分,直
ARIMA模型是一种常用的时间序列分析方法,它可以用来预测未来的数据趋势。ARIMA模型包括自回归(AR)、差分(I)和移动平均(MA)这三个部分。 在Python中,我们可以使用statsmodels库来实现ARIMA模型的拟合和预测。下面是一个简单的ARIMA模型的实现示例: ```python import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa.arima_model import ARIMA # 读取数据 data = pd.read_csv('data.csv', index_col='date', parse_dates=True) # 绘制原始数据图像 plt.figure(figsize=(15, 5)) plt.plot(data) plt.title('Original Data') plt.show() # 训练ARIMA模型 model = ARIMA(data, order=(1, 1, 1)) result = model.fit(disp=-1) # 预测未来数据 forecast = result.forecast(steps=30) # 绘制预测结果图像 plt.figure(figsize=(15, 5)) plt.plot(data, label='Original Data') plt.plot(forecast, label='Predicted Data') plt.title('Predicted Data') plt.legend() plt.show() 在上面的代码中,我们首先读取了数据并绘制了原始数据的图像。然后使用ARIMA模型训练数据,并使用已训练的模型预测未来30个时间点的数据。最后,将原始数据和预测结果绘制在同一个图像中进行对比。 需要注意的是,ARIMA模型的参数需要根据数据的特征进行调整。在上面的代码中,我们使用了order=(1, 1, 1)来初始化ARIMA模型,这个参数需要根据实际情况进行调整。
如何解决报错ValueError: Input contains NaN, infinity or a value too large for dtype('float64')的问题 62692