时序模型——如何用Python进行时序模型预测的baseline预测(简单规则)
在对时间序列问题进行建模预测之前,通常可以通过一些简单的规则对结果进行提前的预测,可以作为baseline,供之后的模型进行参考。很多数据分析的比赛,都可以基于对于背景的理解和数据分析获得有用的规则,通过"if A then B"等方式设计出很好的基准方案。
一般我们可以采取一些简单的统计量作为特征:
- 中位数:较为稳健;
- 均值:分布较符合正态分布时;
01.时间序列规则法(周预测)
在之前的时间序列ARIMA模型中,我们对于扫码量的周期性把握的不够明确,从而导致预测出的结果与实际数据存在一定的差异性。因此我们在总结上述的经验同时,对预测模型进行进一步的改进和数据分析。因此先以周为单位进行分析,选取的数据是从2021年10月25日之后的八周数据,数据如图1所示:
1.1 均值预测
(1)factors:初步的周期因子选为周一至周日的八周每天的平均值,并将得到的7个平均值取平均值,而周一至周日每天的均值除以7个均值的均值,得到初步的factors1如下:
(2)base:最后一周的平均值作为初步的base1,做预测时,只要将周期因子,乘以一个base,就可以做下一周的预测。预测结果如图2所示:
预测的结果与实际的第九周数据的效果图如图3所示:
1.2 均值与中位数的融合
将均值和中位数的数值如下表所示,由于周期因素的存在,用统一的均值来作为base预测工作日和周末的客流量可能会不太准确,为了优化base的选择,我们可以将销量去周期之后再取均值作为base。
直接用最后一周的平均客流量作为base并不一定是最好的方法。也许最后三天或最后五天的均值能更好的反映最新的情况。但是,我们不能直接对最后三天客流量取均值(最后三天是周末,这样取的base就偏大了)。需要去掉周期性因素后,再取平均。具体做法,就是用客流量除以周期因子。按照比例进行融合过程如下:
(1) 均值:中位数=1:9实现过程如下:
预测的结果与实际的第九周数据的效果图如图4所示:
(2) 均值:中位数=2:8,实现过程如下:
预测的结果与实际的第九周数据的效果图如图5所示:
(3) 均值:中位数=3:7,具体实现过程如下:
预测的结果与实际的第九周数据的效果图如图6所示:
其他情况以此类推得到预测数据。
1.3 总结
综上所述:平均值和中位数之比为9:1时,预测的效果最佳,且误差最小,剩余的其他比例算出来的意义也不大。但是这样预测效率较低,不能得到未来一个月的预测结果,只能进行滚动循环得到未来一个月的预测结果。因此为了使得算法的效率更加高,我们以月为周期进行预测。具体实现过程如下,并用代码实现落地。
02. 时间序列规则法(非自然月预测)
本次算法选取的训练数据为2021年10月1日至2022年3月1日五个月的数据,以月为周期进行预测的步骤如图7所示:
2.1 统计每日为(周1-周7)的频次
代码实现时,通过定义了add_timestamp()和get_total_balance()函数去将时间数据进行割分,从而得到每日为(周1-周7)的频次。得到该频次的目的是将星期中的周期性放入每日中,从而使得之后得到的因子更加准确。得到的部分频次表如图8所示:
2.2 获得加权因子
基于时间序列中按周预测时得到的最佳的因子factors,进而去计算出每日的加权因子。加权因子的具体计算过程为:频次*星期周期因子除以频次的总数。得到的部分结果如图9所示:
2.3 通过非自然月的上个月预测下一个月(本次用2月预测3月)
由于2021年的2月只有28天,因此以2月为基数进行预测3月,三月得到的结果也是28天的。为了解决这一问题,我们将所有的月份按照30天进行预测,由2月的数据预测出的3月份的结果与真实数据效果图如图10所示:
由非自然月的3月预测4月份的结果和真实的4月数据的效果图如图11所示:
2.4 总结
以月为周期进行预测,预测数据和真实数据的走势大体相同,但是数据具有一定的滞后性,以及预测的结果和真实数据也具有一定的差距,后续需要对滞后性及其数据的准确性进行进一步的改进,但也要避免过拟合。
模型落地代码实现如需要,后台私信。