最近又有朋友(感谢这位朋友)来询问为何他的时序数据用ARIMA模型后出现的是一条直线,像下面这样(图源网络,仅作参考解释说明的示例):
是不是很奇怪,为何这里会产生一条直线?掌柜查阅了一番后发现原来是这么回事,下面进行讲解。
首先,使用ARIMA模型进行时序预测为何会出现是一条直线?
解答:简单来说是因为你的时序数据中存在“季节/周期性”(注:这里的季节性/周期性指的是 以同样的频率 持续重复出现)的特征。所以模型无法识别你的数据到底是哪种季节/周期特征(比如以“周”为单位的weekly季节/周期,或以“月”为单位的monthly季节/周期等),最后就只能输出一条直线来代替。
其次,如何确定时序数据中有“季节/周期性”特征存在的???
解答:
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是一条直线说明那段时序不具有 季节/周期性。
第三种方法:FFT (全称叫做 Fast Fourier Transform)。是一种计算序列的离散傅里叶变换的算法,它将原始信号(这里是时间)转换为一定的频率来表示(说人话就是基于时间找到周期性变化的幅度、偏移量等因素)。不过该方法对多季节的时序数据效果不太好,这里不做演示。
最后,已知有季节/周期性数据存在,所以就不能再用那个简单的ARIMA模型来处理。
参考资料:
ARIMA model producing a straight line prediction
arima-forecast-straight-line
Classical decomposition
seasonal_decompose 函数的官方文档