“利用ARIMA模型对时间序列进行分析的经典案例(详细代码)”一文中会遇到的问题总结(二)

“利用ARIMA模型对时间序列进行分析的经典案例(详细代码)”一文中会遇到的问题总结(二),第1张

“利用ARIMA模型对时间序列进行分析的经典案例(详细代码)”一文中会遇到的问题总结(二)

最近又有好些朋友来咨询掌柜关于使用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')

pred

运行后会得到如下数据:

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5579081.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存