https://www.bilibili.com/video/BV1hv411v7tM?spm_id_from=333.880.my_history.page.click&vd_source=3ad05e655a5ea14063a9fd1c0dcdee3e
如果一个序列是按照时间序列排序的,是按照时间上一个等长的间隔时间去采样的,序列的先后是有相互影响/依赖关系的;那么基本上就可以说是时间序列了。
空气质量,气候预测,二氧化碳等,电力,交通,能源,石油等都是与时间有关系的序列数据。
original部分的横条虚线可能是一个平均的level。
把序列做了一个时序分解之后,呈现为具周期性的情形,时序也就有随时间变化的一个趋势。
时间序列分成了趋势、周期、噪声等。传统的方法就是基于这些分解之后做一些时序上的预测,
问题:基于历史的时序数据的观测来预测未来的状况。可能会遇到concept drift (概念漂移)的情况。
比如上图的左下角的模式,和右上角的中间部位的中间可能有一些调整;举例来说可能一个周期会涉及到一个模式场景的更新,可能它的误差就会有一个大的变化,那么我们如果基于左下角的框内的数据进行训练的话,那么做预测推测未来很可能是推测不出来的,这样的场景在时序上很常见;但是这样的问题不一定是有这大的偏差造成的,比如说很多不同时间尺度的系统。比如说短临的、enso的、台风的、季风的等;这些不同的情况的时间尺度上相差的是很大的;如果你用enso的信号来预测短临,那显然是预测不出来的。
所以这样的问题在时序上是比较大的挑战,首先我们可能要明确做的事情是什么时间尺度上的问题,然后做的预测也要尽可能的利用技术更新的手段尽量避免concept drift给我们模型带来的影响。
基于这样的一套东西我们去构建一套时序预测的模型。如上图所示,其这个建模的过程和大多数机器学习流程差不多。先是数据预处理,特征工程,模型的选择和构建、测试;然后反复的迭代直到最终的模型。
但是时序的特点,在预处理以及特征工程方面也有时序的特殊性。
比如说确实值的填充,可以直接暴力的填一些均值、中位数等,当时基于时序的数据的填充更好的则是基于时空邻近的来填充,比如说你还有一个时空数据,你填充一个点的缺失时,你可以用最邻近的、过去的一个观测来填充,也可以从空间上邻近的来填充;此外对于时序的预处理还可能要先确定处理的问题是什么样的时间尺度上的,到底是enso还是短临等。可能要基于已有的数据进行降采样。比如有每小时的数据,而你要做每天的事情;那你此时就要去往天的尺度去做降采样;等,类似这样的事情,可能需要先把尺度给统一了。第三点是时间序列的平稳性,这个在传统的时序模型中是比较重要的,因为比如说像Arima等类似的模型,对这样的不平稳的序列是没办法做预测的。但是对于现在的深度学习和机器学习来说这个问题没那么重要,如果做稳定的话在一定程度上也可以提升模型效果;此时一般的方法是把趋势项给干掉、或者说做差分等;这些操作都是可以循环的,比如说一阶差分还不是稳定的,那么还可以再做一阶差分(变成了二阶差分),总可以把它变成平稳的时序。对于这样一个异常值的处理,比如说对于3σ之外的都去掉(如上图红色小区域所示都去掉);或者是根据分位数Q3和Q1之间的距离,然后乘上一个系数,比如看上图右边的这个曲线图,Q3就是75%的分位数,Q1就是25%的分位数,Q3和Q1之间的距离,然后在Q3和Q1之外的范围就认为是异常值(outliers)给去/删掉,所以我们所有的时序上的范围就可以统一在Q1减去1.5倍的IQR,但是这个1.5也就是上图的α,这个是可以调节的。调解后就可以归并到图中曲线的范围内。
最后是标准化和归一化等常规的操作。
上图是常用的特征工程方法,其对传统的机器学习方法等还是比较重要的,
最基本的时序上可以挖掘出来一些基本的时间,比如年月日、季节、假期等;但是在气象方面可能假期没有那么特别,但是在农历、阳历方面这还是有差别的。比如对于潮汐预测方面,还是一个很重要的特征。
电商方面节假日、618,双11等就有影响了。然后基于时间可以做一些统计,比如min/max/median/mean/std...,以及偏度和峰度等。可以基于时间做一些统计 。
时间上如果基于传统的树模型去做的话,肯定是要做它的滞后项的,比如说要预测未来肯定要加入过去1,2天或者过去的一个阶段的特征,包括差分,我们可以算出它过去一段时间的趋势(是上升还是下降);包括他是在怎样的一个周期等。我们可以基于序列的平滑来算这样的一个指数。
还有基于时间差的一个聚合,这个也是电商业务中用到的比较重要的一个特征。比如预测未来的销量,那么会基于当天去算这一天 距离新年或距离上次双11、下次双11或上次618、下次618等的时间是怎么样的;比如双11刚过去,那么销量可能掉的比较厉害;也有可能距离双11或618比较近了,那么消费者可能会压抑住购买的行为而等到618当天买。这些都是比较重要的特征。
时间滑窗:基于这些时间也可以使用时间滑窗来统计,比如Rolling可以统计滑窗,就是根据一个时间点可以统计过去一个时间段的它的一个统计值。统计值则参考上图第二条的统计量。
最后一条就是加入一些行业内的一些领域知识、一些特征等。比如电商领域的节假日可能比较重要;但是在气象领域可能有一些其他型号比较影响长周期的预测。
但是这些特征其实只要用Python的话,其实只要两个库就可以了,pandas和tefresh is all you need!
那如何做稳定可靠的本地验证呢?
如果不是时序的话那么可以很随意的用K折交叉验证。
5折交叉验证就是分成5份,取其中的4份来训练,另一份来评测训练的效果。
这样循环5次这样得到的5次平均的预测结果的精度来作为最后的精度,这是非时序问题时的做法。但是有时遇到非均衡的问题时不能这样做。这个后续讨论。
因为时序数据未来要预测的值是不知道的,所以可以如下左图所示,在做验证时可以模拟真实场景下,黑色表示训练集,黄色表示预测的验证,我们可以用滑窗的方法来验证,我们可以做5个滑窗,滑窗中间的间隔我们可以根据实际情况数据量的大小来采取一个合适的间隔,然后我们其实也可以说。。。其实下图左部分是rolling,右部分是expanding,也就是我们从头开始一直做时序上的外推。
上图虚线以上是传统统计的时序预测模型,现在已经很少真正的使用了, 这些方法对数据预处理等要求特别高。且效果没有现在的方法的效果好;也打不到预期的效果。
但是作为一个内容的完整性,这里也简要阐述一下。
第一个AR是自回归,第二个MA是滑动平均,第三个ARMA是自回归移动平均,ARMA是AR和MA的一个组合,自回归AR其是可以比较好的反映一个序列的周期性(其能够比较好的预测出来);MA滑动平均的话,可以很好的把近段时间的趋势给反映处理。而ARIMA则是比上述多了一个差分的项;ARIMA要求对时序进行差分使得序列是平稳的,满足这样的条件后他才能比较好的做模型的预测,否则它的结果可能会差的很离谱。
而虚线下面的两个传统模型,是传统模型里面现在还在用,且用的效果还不错的两类模型;
第一个prophet是Facebook 2017年开源的模型;
而树模型如LGB,XGB,CATBOOST,RF,ET....等模型是大家还有些用的比较主流的一些模型;此类树模型结合前面的一套特征挖掘的内容,可以解决大多数中等数据量场景的一个预测。因为它很快的迭代且复用性特别高。
Prophet其实是基于时序的分解+机器学习来做的。
可以看图中第二行的公式,其是把一个时序分解成趋势项、周期项、节假日项然后对这些东西进行建模和预测;且这个prophet模型对缺失值和异常值以及一些时序上的shift更加的稳健。并且高效快速,基本上开箱即用。可以简单的认为其就是一个时序的automl。 TS-AutoML。如果你的时序数据不是那么的脏和缺失太多,那么你就可以用prophet跑一个结果。作为一个baseline 看一下是什么样子的。据了解它这个模型最初的开发是基于day类的数据,后来又扩充到非day类的数据;但是非day类的数据的效果会有一定的偏差(据说)。
深度学习与时序预测比较有效果的根据作者/讲者本人的实验在电商领域,有效果的模型可能就是上图第二个seq2seq+attention的。
如果简单粗暴的用LSTM和GRU,那么无论是性能上还是时间上,还是最后的一个效果上,并没有让模型结果超过树模型。
而DeepAR和ES-RNN等近年来特别火,在kaggle比赛中他们经常用。
而CNN和WaveNet这两个基本上可以当做一组。因为很多WaveNet是基于CNN,还有一个TCN的一个结构。后面也可以一起说一下。可以认为他们都是基于CNN的一个模型。
最后一个是transformer也是特别火,可以试一下。
2020年有一篇疫情预测的文章用的是transformer做的。
以上各模型除了DeepAR和ES-RNN是最早原生为时序而做的,其他最早的大都是NLP领域过渡过来的应用。
RNN类相对于其他的神经网络模型算法来说,其在时序上会传梯度,会基于时序上做反向传播;其原生的结构很容易造成梯度消失或爆炸等。为了缓解这个情况,其核心是在这样的时序的模型中加入了很多的门控机制。
forget gate来决定我们需要多长时间之前的信息,。。。。
通过激活函数来控制门的开闭。
GRU相对于LSTM来说,会训练更快,更快收敛。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |