(记录下自己第一次独立解决一个问题,至于结果嘛,呵呵呵)
本文的目的是用统计学的方法预测一组数据
经过对数据简单的观察与分析及查阅多方资料,最终选用SARIMAX模型进行预测。(过程还算艰辛吧,这个问题一共做了不到半个月😂。)
step1:准备数据
关于数据这个问题呢,我一直就觉得没啥好说的。原因在于既然是想做数据的预测,就说明手里是有一份数据的,是想通过这份数据得出一些东西。至于想找一堆数据来验证某些统计学方法那就另当别论了,这是专业人士干的事。
step2:想办法预测
因为我手里的数据是明显具有季节性的,所以有两条路做预测:(1)借助某种季节性预测模型;(2)做季节性分解。
way1:借助季节性模型
找了本很牛的书,书名为:《时间序列分析预测与控制》,发现带季节性时序预测是门学问。通过这本书,我主要的收获如下:AR(自回归过程)+MA(滑动平均过程)——>ARMA(自回归滑动平均混合模型)——>ARIMA(自回归滑动平均过程)——>SARIMA(季节性自回归滑动平均过程)——>SARIMAX(再加一个变量云云)。
光看上面这些字母看不懂,找书看它的公式即含义发现这根本不是一时半会儿就能学会的。于是就放下这一块,转向如何用python实现。主要是用到了statsmodels这个库(中间还有许多故事)。为了学习这个库中某些函数的用法,我还特地去找了相应的官方文档,发现并没有什么用,全英文,全全的英文,我是看不懂英文吗?不!我是看不懂这里的英文😓。无可奈何,就去学习前任的代码,经验喽。所以这篇文章我不想贴代码,因为就没几行是我自己写的,我只是搬运工。。。
用该模型做预测的流程是:对数据做平稳性检验(保证该数据是可以用SARIMAX预测的)(如果不平稳,就想办法让它平稳,直到它足够平稳,最常用的办法是差分)——白噪声检验(保证该数据是处于模型的适用范围的)(不通过我也没办法,换个模型吧)——借助网格搜索法用sm.tsa.statespace.SARIMAX函数在某种度量下(AIC,BIC,MAPE…)的最优解——将所得到的模型的最优解所对应的参数进行预测(model后.fit后.predict)
其实,这种方法最大的诟病就在于找合适的参数,书上说,一般来说待搜索的网格很少。但以我的经验,那些网格所找到的参数完全有改进的空间。一种笨的办法就是遍历喽,遍历怎么加速呢?并行喽。啊啊啊,数学家的重要性就出来了,能不能告诉我找到什么时候我就该停止了啊!
way2:季节性分解
直接一个函数搞定ExponentialSmoothing。本来还想着光经典分解法就有两种:加法和乘法。调试各种参数之后发现影响很小很小很小,结果也远不如way1。

中间走了不少弯路,吃一🗡长一智吧。