zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

回顾︱时间序列预测与分解有哪些模型?(一)

2023-04-18 14:11:06 时间

本节简单回归一下时间序列任务的几种方向以及有哪些比较优秀的开源算法。

1 时序预测

时序预测从不同角度看有不同分类。从实现原理的角度,可以分为传统统计学、机器学习(又分非深度学习和深度学习)。

按预测步长区分, 可以分为单步预测和多步预测,简单来说就是一次预测未来一个时间单元还是一次预测未来多个时间单元的区别。

按输入变量区分, 可以分为自回归预测和使用协变量进行预测,区别在于维度中是否含有协变量,例如预测未来销售量时,如果只接受时间和历史销售量数据,则是自回归预测,如果可以接受天气、经济指数、政策事件分类等其他相关变量(称为协变量),则称为使用协变量进行预测。

按输出结果区分, 可以分为点预测和概率预测,很多模型只提供了点预测而不提供概率预测,点预测模型后再加蒙特卡洛模拟(或其他转化为概率预测的方式)往往不能准确反映模型输出的预测概念,而在大多数场景下,概率预测更贴近事实情况,对于未来的预测本身就应该是一种概率分布。

按目标个数区分, 可以分为一元、多元、多重时间序列预测。举例理解,使用历史的销售量预测未来1天的销售量为一元时间序列预测,使用历史的进店人数、销售量、退货量预测未来1天的进店人数、销售量、退货量(预测目标有三个)为多元时间序列预测,使用历史的红烧牛肉面、酸菜牛肉面、海鲜面的销售量预测未来1天的红烧牛肉面、酸菜牛肉面、海鲜面的销售量(预测目标有三种)为多重时间序列预测。

这些分类是不同角度下的分类,同一种算法往往只能是分类中的一种,例如传统的统计学算法只适合做自回归预测而不适合协变量预测。

图2 时序预测分类对应关系

2 时间序列分解

时间序列由 趋势,季节性和周期性以及剩余的其它部分组成(例如重大事件等),只不过不同的时间序列其占比不同,比如随机波动可能完全是由残差构成的; 当我们将时间序列分解为不同的components时,通常将趋势和周期组合为单个成为趋势周期的components(有时为简单起见也称为趋势)。 因此,我们认为时间序列包含三个部分:趋势周期部分,季节性部分和其它部分(包含时间序列中的任何其他内容)。

一般来说,做事件序列分解有两种方式,加性和乘性:

yt=St+Tt+Rt 加性
yt=St×Tt×Rt 乘性

S代表了season 季节,t代表了trend 趋势,r代表了residual 其它难以分解无规律的部分

如果季节性波动的幅度或趋势性的强弱不随着时间的推移而发生变化则使用加法分解比较合适,如果季节性波动的幅度或者趋势性的强弱随着时间推移而发生变化(比如销量增长越来越快,销量增长曲线的斜率越来越大)则使用乘法分解比较合适,乘法分解的方式在经济学序列中很常见。

简单了解一下几个实现的库:

时序分解库一:statsmodels

之前笔者博客有记载过:

statsmodels︱python常规统计模型库 https://mattzheng.blog.csdn.net/article/details/104369913

它提供对许多不同统计模型估计的类和函数,并且可以进行统计测试和统计数据的探索。

包含的模型有:合效应和方差分量的混合线性模型 、具有自回归误差的最小二乘法、季节性ARIMA和ARIMAX模型、马尔可夫切换模型(MSAR),也称为隐马尔可夫模型(HMM)、比例风险回归(Cox模型)、非参数统计:单变量和多变量核密度估计

时序分解库二:facebook-Prophet

之前笔者博客有记载过:

R+python︱Facebook大规模时序预测『真』神器——Prophet(遍地代码图) https://mattzheng.blog.csdn.net/article/details/57419862

觉得比较赞的功能点:

  • 1、大规模、细粒度数据。其实并不是大量数据,而是时间粒度可以很小,在学校玩的计量大多都是“年/月”粒度,而这个包可以适应“日/时”级别的,具体的见后面的案例就知道了。不过,预测速度嘛~ 可以定义为:较慢!!!
  • 2、趋势预测+趋势分解,最亮眼模块哟~~ 拟合的有两种趋势:线性趋势、logistic趋势;趋势分解有很多种:Trend趋势、星期、年度、季节、节假日,同时也可以看到节中、节后效应。
  • 3、突变点识别+调整。多种对抗突变办法以及调节方式。
  • 4、异常值/离群值检测。时间维度的异常值检测。突变点和异常点既相似、又不同。
  • 5、处理缺失值数据。这里指的是你可能有一些时间片段数据的缺失,之前的做法是先插值,然后进行预测(一些模型不允许断点),这里可以兼顾缺失值,同时也达到预测的目的。可以处理缺失值数据,这点很棒。

还有一种比较简单挖掘周期性特征的方式:基本规则法

时间序列规则法快速入门 https://www.jianshu.com/p/31e20f00c26f?spm=5176.9876270.0.0.1b6d2ef1x7fsim

3 分解 + 预测结合

参考:时间序列分解之一 https://zhuanlan.zhihu.com/p/322273740

分解+预测联合来做,sktime有实现一部分这样的功能,不过sktime并没有进行时间序列分解,而是用多项式回归来提取趋势性数据的部分,因为对于gbdt来说,消除趋势就可以了,周期其实不需要消除,周期本身是循环的,分布是稳定的,就好像这样:

我们可以把上面的数据理解为去除趋势之后的剩下的season+residual的部分,那么接下来用gbdt就可以了。

趋势性的预测

如果有LR来做,会比较受异常点的影响,这一点对于电商销量来说是很致命的,因为双十一的销量就是一个异常点,根据mse的损失函数,异常样本会不断的被模型训练学习,难以收敛,同时导致了整个拟合平面的偏移,泛化性能会变得很差:

比如说上图,去掉异常样本之后,lr能够较好的拟合,如果加入了异常样本,则lr最终拟合出来的平面就是绿线这个鬼样子压根没法用,泛化性能很差,误差很大

其他部分的预测:

从gbdt切入比较好理解,gbdt外推能力差对于趋势性强的时间序列数据的拟合能力比较差,通过时间序列分解之后去除了趋势性的部分,那么剩下的季节性+residual的部分,也就是简单的方法没法拟合的部分,用gbdt这样复杂的模型来拟合就比较合适了。

几个算法库:

3.1 sktime

Sktime是一个使用时间序列进行机器学习的开源Python工具箱。这是一个由英国经济与社会研究理事会、消费者数据研究中心和艾伦·图灵研究所资助的社区驱动的基金项目。

https://github.com/alan-turing-institute/sktime

Currently, sktime provides:

  • State-of-the-art algorithms for time series classification and regression, ported from the Java-based tsml toolkit, as well as forecasting,
  • Transformers, including single-series transformations (e.g. detrending or deseasonalization) and series-as-features transformations (e.g. feature extractors), as well as tools to compose different transformers,
  • Pipelining,
  • Tuning,
  • Ensembling, such as a fully customisable random forest for time-series classification and regression, as well as ensembling for multivariate problems,
from sktime.forecasting.all import *
y = load_airline()
y_train, y_test = temporal_train_test_split(y)
fh = ForecastingHorizon(y_test.index, is_relative=False)
forecaster = ThetaForecaster(sp=12)  # monthly seasonal periodicityforecaster.fit(y_train)
y_pred = forecaster.predict(fh)
smape_loss(y_test, y_pred)
>>> 0.08661468139978168

3.2 tslearn

专用于时间序列数据的机器学习Python工具包

https://github.com/tslearn-team/tslearn

>>> from tslearn.utils import to_time_series_dataset>>> my_first_time_series = [1, 3, 4, 2]
>>> my_second_time_series = [1, 2, 4, 2]
>>> my_third_time_series = [1, 2, 4, 2, 2]
>>> X = to_time_series_dataset([my_first_time_series,
                                my_second_time_series,
                                my_third_time_series])
>>> y = [0, 1, 1]

4 一些深度学习时序库

4.1 AWS的DeepAR

DeepAR,可以将时间序列与多个分组关联,可以处理统计学难以处理的非线性问题和规模问题,可以在几乎没有历史数据的情况下执行冷启动时间序列预测,只需要有类似的事件序列相支持。 例如,我有历史方便面的销售数据若干,现在新上市了一款自热米饭,只有几天的数据,依然可以使用 DeepAR 结合历史方便面的数据预测自热米饭的未来销售走势。这也是算法的一大亮点。

详细的后面会单独说一篇。

4.2 sktime-dl

https://github.com/sktime/sktime-dl

序列分类包含:

  • Time convolutional neural network (CNN)
  • Encoder (Encoder)
  • Fully convolutional neural network (FCNN)
  • Multi channel deep convolutional neural network (MCDCNN)
  • Multi-scale convolutional neural network (MCNN)
  • Multi layer perceptron (MLP)
  • Residual network (ResNet)
  • Time Le-Net (TLeNet)
  • Time warping invariant echo state network (TWIESN)

回归任务:

  • Time convolutional neural network (CNN)
  • Encoder (Encoder)
  • Fully convolutional neural network (FCNN) Multi layer perceptron (MLP) Residual network (ResNet) Time Le-Net (TLeNet) InceptionTime (Inception)

Forecasting任务: 常规RNNs/LSTMs

4.3 demand_forecast

https://github.com/jingw2/demand_forecast

一些Deep算法的集合: DeepAR, MQ-RNN, Deep Factor Models, LSTNet, and TPA-LSTM

DeepAR

MQ-RNN

Deep Factors

TPA-LSTM

4.4 microsoft/forecasting

https://github.com/microsoft/forecasting 应该比较偏向传统且一些已经放在了Azure之中: