快捷搜索: 王者荣耀 脱发

ARIMA模型预测后出现一条直线的原因

最近又有朋友(感谢这位朋友😁)来询问为何他的时序数据用ARIMA模型后出现的是一条直线,像下面这样(图源网络,仅作参考解释说明的示例):

是不是很奇怪,为何这里会产生一条直线?掌柜查阅了一番后发现原来是这么回事,下面进行讲解。

    首先,使用ARIMA模型进行时序预测为何会出现是一条直线? 解答:简单来说是因为你的时序数据中存在“季节/周期性”(注:这里的季节性/周期性指的是 以同样的频率 持续重复出现)的特征。所以模型无法识别你的数据到底是哪种季节/周期特征(比如以“周”为单位的weekly季节/周期,或以“月”为单位的monthly季节/周期等),最后就只能输出一条直线来代替。 其次,如何确定时序数据中有“季节/周期性”特征存在的??? 解答: 第一种方法:可以用statsmodels库里面的seasonal_decompose 函数来分解检测时序数据中的季节/周期性。具体方法如下:
import statsmodels.api as sm

#data指你自己的时序数据,model=additive代表是加法模式,
#extrapolate_trend=freq表示trend 、resid频率会从最近点开始,并且会对最近点的缺失值进行填充
#更多参数设置请参考官方文档:https://www.statsmodels.org/stable/generated/statsmodels.tsa.seasonal.seasonal_decompose.html
decomposition = sm.tsa.seasonal_decompose(data, model=additive, extrapolate_trend=freq)  
plt.rc(figure,figsize=(12,8))
fig = decomposition.plot()
plt.show()

最后得到的可视化分解图如下:

可以明显的从第三个图Seasonal看出来,这个时序数据集确实是存在季节/周期性特征的。

同样用这个方法我们可以对比看,分解经典那篇的时序数据,最后得到的图片是这样的: 第三个Seasonal是一条直线说明那段时序不具有 季节/周期性。

    第二种方法:就是直接plot 来观察 时序图(对于季节/周期性很明显的情况,比如👇这图)。 (图源:网络) 第三种方法:FFT (全称叫做 Fast Fourier Transform)。是一种计算序列的离散傅里叶变换的算法,它将原始信号(这里是时间)转换为一定的频率来表示(说人话就是👉基于时间找到周期性变化的幅度、偏移量等因素)。不过该方法对多季节的时序数据效果不太好,这里不做演示。 最后,已知有季节/周期性数据存在,所以就不能再用那个简单的ARIMA模型来处理。

参考资料:

经验分享 程序员 微信小程序 职场和发展