时间序列多步预测的五种策略
点击蓝字
关注我们
#TSer#
时间序列知识整理系列,持续更新中 ⛳️
后台回复" 讨论 "加入讨论组交流吧 🏃
时间序列预测就是利用过去一段时间的数据来预测未来一段时间内的信息,包括连续型预测(数值预测,范围估计)与离散型预测(事件预测)等,具有非常高的商业价值。
通常,时间序列预测描述了预测下一个时间步长的观测值。这被称为“单步预测”,因为仅要预测一个时间步。例如,给定最近7天观察到的温度:
单步预测仅需要在时间步骤8进行预测。在一些时间序列问题中,必须预测多个时间步长。与单步预测相比,这些称为多步时间序列预测问题。
在开始之前,需要明确一些一直很模糊的问题,也就是 时间序列预测的数据形式 ,我们平常在公众号的一些blog里看到的时间序列预测的数据形式都很简单,并且基本都是 单个序列,单变量 的序列问题,比如说我们要预测某一个商品的未来销量。这类问题算是最初进入大众视野的时间序列问题的形式,arima,fbprophet之类的都是针对这类问题的。但是在一般复杂业务场景上碰到的问题基本上是成百上千的序列。
当然我们可以对每个序列单独用arima之类的方法来建模,理论上可以,但是实际上基本不可能,一方面 维护成千上万的模型的成本是不可估计 的,另一方面 不同商品的序列长度差异很大 ,有的序列长度可能非常完整有1500+个序列数据,有的冷门商品或者是新上的商品序列长度很短可能只有不到10个,这种情况下,后者基本没法单独建模。
因此实际上我们常见的业务问题的数据形式是这样的:
商品 日期 销量序列数据
nike的XXX款衣服 2020-01-01 100
nike的XXX款衣服 2020-01-02 200
nike的XXX款衣服 2020-01-03 150
nike的XXX款衣服 2020-01-04 250
...
这也是web traffic,m5 forecast,favorite store 这些序列比赛的数据的普遍形式,可以说我们面对的主要的问题形式是这样的。
对这些数据进行建模的时候我们面临最直接的问题就是,使用多少的时间步的历史数据预测未来多少个时间步的未来数据, 即时间窗的问题 ,比如我们就用前一天的数据预测后一天的,那么数据就要变成:
商品 日期 过去一天销量 销量序列数据
nike的XXX款衣服 2020-01-01 nan 100
nike的XXX款衣服 2020-01-02 100 200
nike的XXX款衣服 2020-01-03 200 150
nike的XXX款衣服 2020-01-04 150 250
...
这就是我们的所谓的 滞后特征 ,也是时间序列问题中最常见的也是最重要的特征衍生方法。
一般来说, 时间距离约接近的滞后特征对于预测的准确的贡献越大 。所以我们会用所谓的窗口的问题,比如你使用 “1阶滞后 2阶滞后……n阶滞后”来预测未来,则你的时间窗的长度为n,当然这个时间窗不一定连续,你可以使用“1阶滞后,3阶滞后,7阶滞后……n阶滞后”等,但是你的时间窗长度仍旧为n,只不过滞后特征的数量变少了而已。
除此之外,还有一个就是gap的问题,也就是 提前多少天预测 ,实际的应用的时候,很多时候除了多步预测之外,还需要你做提前预测,也就是你可能要提前几天的时间进行预测,例如你需要在11月1日预测11月11日,则就是提前10天做预测,那么进行特征构建的时候也需要注意,滞后特征要从10天前开始做起。
为了便于描述,这里假设一个序列:[1,2,3,4,5,6,7,8,9,10,X,Y,Z]
我们要做的是预测未来的3个时间点,X,Y,Z的序列的值,并且为了方便描述,这里我们统一仅仅使用1阶滞后特征。
第一种:直接多步预测
直接多步预测的本指还是单步预测, 多步转单步,比如上面我们要预测3个时间点的序列的值,则我们就构建3个模型:
model1:[1,2,3,4,5,6,7,8,9],[X]
model2:[1,2,3,4,5,6,7,8,9],[Y]
model3:[1,2,3,4,5,6,7,8,9],[Z]
这种做法的问题是如果我们要预测N个时间步,则复杂度很高,比如预测未来100天,则意味着我们要构建100个模型;
另外需要注意的是,在使用这种方法的时候,我们在进行特征工程的时候要比较小心,因为我们在序列问题的特征工程过程中常常会涉及到一些lag方法,即滞后特征的引入,比如对于: model1:[1,2,3,4,5,6,7,8,9],[X]
我们可以构建一阶滞后特征:[1,2,3,4,5,6,7,8,9],[nan,1,2,3,4,5,6,7,8],而待预测的X的一阶滞后是9,是我们已经观测到的值,因此取1阶滞后没有问题。
但是对于:model2:[1,2,3,4,5,6,7,8,9],[Y] 我们无法使用1阶滞后,因为Y的一阶滞后是X,X并不是我们的观测值,这个时候我们的滞后特征只能从二阶滞后开始做起
对于后续的model3,model4等,基本是一样的道理
这里我们仅仅使用了1阶滞后,所以时间窗长度是 1。
另外需要注意的是,时间窗的长度和我们处理无序的结构化问题有一些区别,我们直观的感受是,长度的概念对应的是样本的数量,但是实际上在结构化数据中,对应的是特征的维度,比如:
这就是滑动窗口的概念,当我们使用n阶滞后特征训练了一个模型之后,我们可以称这个模型为n阶滞后模型。
直接预测方法的缺点在于可能会出现较高的方差,特别是如果我们要预测的时间步长比较长的情况下,比如我们要预测未来100个时间步骤,则第100个时间步骤使用的最近的一样观测样本是100个时间步之前的,我们直到,周期约接近当前时间点的滞后特征预测效果越好,间隔时间越长效果越差。
第二种:递归多步预测
递归多步预测, 递归多步预测的本质还是简单的单步预测, 但是和第一种情况不同,递归多步预测不需要预测 时间步个模型,仅仅一个模型就够了。举个例子,假设我们构建了一个3阶滞后模型:
lag(t-3) lag(t-2) lag(t-1) t
1 2 3 4
2 3 4 5
...
则当我们预测的时候,还是以上面的例子为例:
[1,2,3,4,5,6,7,8,9,10,X,Y,Z]
我们先预测X,即根据:
用model 去 predict([8,9,10]) 得到 prediction(X),假设predict出来的结构为11.24, 然后我们把预测值当作特征 ,得到[9,10,11.24],然后用model去predict([9,10,11.24])得到prediction(y),依此类推。
由于使用预测代替真实值,因此递归策略会累积预测误差,即递归策略的偏差比较大,从而随着预测时间范围的增加,模型的性能可能会迅速下降。
第三种:直接+递归的混合策略
可以将直接策略和递归策略结合使用,以提供这两种方法的好处。
例如,可以为要预测的每个时间步构建一个单独的模型,但是每个模型都可以将模型在先前的时间步进行的预测用作输入值。
思路也不复杂,和直接预测一样我们要根据n个时间步构造n个模型,还是以原来的例子为例:[1,2,3,4,5,6,7,8,9,10,X,Y,Z]
我们先构造一个3阶滞后的model 1:[8,9,10][X],然后用model1 进行预测得到prediction(X),然后我们构造model2 ,按照直接预测法的思路,
model2应该是无法将X作为观测样本进行训练,因此model2可以是[8,9,10][Y],当然,使用直接预测法不一定要构造相同的n阶模型,也可以是[7,8,9,10][Y]……依此类推,但是核心都是无法使用X处的数据,因为X是未知的没有观测到的值,
那么混合策略的做法是,我们用model1预测X得到prediction(X),然后将这个prediction(X)作为model2的”观测“数据,纳入模型训练,即:
model2:[9,10,model1.prediction(X)][Y],然后