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

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之中:

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

  1. 时间序列预测(四)—— LSTM模型

    时间序列预测(四)-- LSTM模型 欢迎大家来我的个人博客网站观看原文:https://xkw168.github.io/2019/05/20/时间序列预测-四-LSTM模型.html 文章链接 ( ...

  2. 智能运维之时间序列预测中的经典时序模型

    # 技术黑板报 # 第七期 推荐阅读时长:12min 智能运维领域时间序列预测都有哪些典型应用场景?典型的算法有哪些?这些算法在实际落地应用中有哪些优缺点?让我们一起来看看云智慧对此是怎样理解的. 章 ...

  3. 时间序列预测(二)—— AR模型

    时间序列预测(二)-- AR模型 欢迎大家来我的个人博客网站观看原文:https://xkw168.github.io/2019/05/20/时间序列预测-二-AR模型.html 文章链接 (一)数据 ...

  4. 【统计】时间序列预测之 Holt-Winters 指数平滑模型

    Holt-Winters Exponential Smoothing 原文连接:link 作者作者:Sachin Date 翻译校对:datamonday Holt-Winters 指数平滑法用于预测 ...

  5. 时间序列模型预测_时间序列预测,使用facebook先知模型预测股价

    时间序列模型预测 1.简介 (1. Introduction) 1.1. 时间序列和预测模型 (1.1. Time-series & forecasting models) Tradition ...

  6. 时间序列预测之二:灰色模型

    目录 1.简介 (1)常见系统分类 (2)灰色预测法 2. 灰色生成数列 (1)累加生成(AGO) (2)累减生成(IAGO)​ (3)加权邻值生成​ 3. 灰色模型GM(1,1) 4. 检验预测值 ...

  7. 时间序列预测股票数据—以LSTM模型为例

    一.对时间序列的理解: 时间序列是按照一定时间间隔排列的数据,时间间隔可以是任意时间单位,通过对时间序列的分析,我们可以探寻到其中的现象以及变化规律,并将这些信息用于预测.这就需要一系列的模型,用于将 ...

  8. 论文阅读【时间序列预测2】TACTiS: Transformer-Attentional Copulas for Time Series

    [代码]https://github.com/ServiceNow/tactis [发表]ICML 2022 [领域]时间序列预测 TACTiS: Transformer-Attentional Co ...

  9. 【时序】时间序列预测真的需要深度学习吗?

    论文名称:Do We Really Need Deep Learning Models for Time Series Forecasting 论文下载:https://arxiv.org/abs/2 ...

最新文章

  1. Sublime text3 新建 HTML文件
  2. C# Winform 窗体美化(一、IrisSkin 换肤库)
  3. oracle conneciton properties,在WAS Liberty连接池中,我可以验证借用连接吗?
  4. 汇编语言:利用栈的特性对内存数据进行逆置
  5. SpringBoot2.0 整合 FastDFS 中间件,实现文件分布式管理
  6. 线程安全的map_面试必问-几种线程安全的Map解析
  7. amd显卡更新最新驱动鼠标顿卡的解决方法
  8. 安卓使用html文件遍历,安卓手机中使用html的input file,获取不到文件类型和文件名...
  9. APP性能测试之功耗测试
  10. 【概率论与数理统计】1.1 随机事件及其运算
  11. Vivado ROM IP核
  12. Bootstrap学习笔记02
  13. 固态硬盘与机械硬盘是否应该一起使用
  14. 记一次HBuilder X 封装H5 + 微信登录
  15. 【论文阅读31】《OptCuts: Joint Optimization of Surface Cuts and Parameterization》
  16. C 语言实现面向对象编程
  17. Java Web基础概述
  18. Spring Cloud---服务熔断Hystrix
  19. epoll的ET工作模式和LT工作模式
  20. vue Cannot create property ‘xxx字段‘ on string

热门文章

  1. javascript 计算后结果失精度的问题解决
  2. 怎么给iOS项目打包
  3. 2010伊始就这么忙
  4. 分布式场景下数据一致性的问题——【分布式锁】 Java常用技术方案
  5. Laravel5.2队列驱动expire参数设置带来的重复执行问题 数据库驱动
  6. 总结-eclipse
  7. php中时间戳和正常日期的相互转化
  8. Q133:PBRT-V3,BSSRDF的采样(15.4章节)
  9. tsdb java_OpenTSDB 问题集锦
  10. 简单的学生库管理系统