作者简介
doublering,携程高级算法工程师,关注自然语言处理、LLMs、时序预测等领域。
一、背景
互联网行业中,有许多关键指标直接影响公司未来的规划与决策,比如流量、订单量、销售额等。有效地预测这些关键指标能够辅助公司提前做出相应的预算、规划、决策,实现收益的最大化。
预测关键指标实际上是个典型的时间序列预测问题,即基于指标的历史真实数据来预测未来一段时间的值。在携程也有一些相关的业务场景,本文将以预测流量、订单量、GMV为例,介绍我们在时间序列预测方面使用的一些方法与思考。
二、问题定义与难点
2.1 口径定义
预测目标值:流量、订单量和GMV等关键指标。
预测时长:未来30天。
重点关注节假日期间的预测,包括清明节、劳动节等法定节假日以及法定节假日的前后一段时间,要求在法定节假日的提前一段时间进行预报,为业务在关键时间节点的投放提供参考。
2.2 难点
在现实场景中,时间序列预测会受到宏观政策、自然灾害、社会运动等多种因素的影响,而且这些因素难以量化,这集中表现为时序数据中的突变点和非周期性。再者,时序数据的周期通常以天为单位,一些历史较短领域的训练样本会不足。同时,时序模型需要支持多个特征辅助预测,如节假日特征、时间类特征以及各种协变量等。为了更早地布局,需要进行长时预测,即预测未来一个月、半年、一年的值。
三、方案设计
3.1 数据选择与特征构建
选取近几年的关键指标的时序数据,时间粒度为“天”。我们画出各项指标的历史数据,可以看到明显的节假日效应,每个尖峰都对应着法定节假日或者寒暑假期间,数值的涨跌对应着工作日与非工作日等。
由此,我们依据时序顺序追溯构造7个假期/时间型特征,分别为:预测日是否为假期、预测日是否为工作日、预测日在假期中是第几天、预测日距离下一次假期的天数、预测日是周几(周日为1)、预测日所处星期在一年中是第几周、预测日所处的季节等。
同时,注意到各项指标之间的总体趋势是有关联的,当预测其中一项指标时,其他指标也可作为特征入模,以提高预测的准确性,因此总共构建了20个左右的特征。
3.2 模型介绍
通常来说,时间序列预测模型大致可分为三类:一是传统时间序列预测模型,比如移动平均、ARIMA、指数平滑法等,二是机器学习模型,比如线性回归、树模型、Prophet等,三是深度学习模型,比如时序卷积网络(TCN)、LSTM、Transformer等。
目前工业实践上,采用传统时间序列预测模型进行预估较为普遍。传统时间序列预测模型具有可解释性、简单直观、理论成熟等优点,但其通常只能以单变量的方式进行预测,而我们的任务涉及多个关键指标的预估,有多个特征会影响这些指标,而且这些指标之间也互有影响。除此之外,传统时间序列预测模型处理多步预测时,往往采用滚动预测的策略,即使用前一期预测值作为实际值加入模型,从而得到下一期的预测,这种策略会导致预测误差累计,从而使得多步预测的精准性越来越差。
机器学习方法可以利用多变量进行预测,学习到时间序列数据中的复杂模式和趋势,但是其需要针对每一个指标训练一个模型,并且涉及到多步预测时,也会存在误差累积的缺点。
近年来,基于深度学习的方法也被广泛地应用于时序预测任务中,例如时序卷积网络(TCN)、LSTM、Transformer等。这些方法克服了上述缺点,具有支持输入多个变量,自适应地提取特征,执行多步预测,一次性输出多个指标的预测值等优势。因此,本文的实战部分利用的是深度学习方法。下面简要介绍实践中涉及到的几种模型或方法。
3.2.1 Prophet
Prophet是Facebook开发的时间序列预测模型,具有简单易用、运行效率高、可解释性强等优点。Prophet是将时间序列看成是一个关于t的函数,并将时间序列分解为趋势项、季节项和节假日项等,有加法模型和乘法模型两种模式,加法模型的核心公式如下:
y(t)=g(t)+s(t)+h(t)+ϵt
其中,g(t)代表趋势项,s(t)代表季节项,h(t)代表节假日项(或者泛指外部变量), ϵt代表噪声项。
趋势项用于拟合时间序列非周期性的趋势变化,例如:上升、下降趋势。按照趋势模式,可分为线性趋势和非线性趋势,线性趋势的公式为:
g(t)=kt+m
非线性趋势的公式为:
其中,C表示上限容量,即g(t)所能达到的上界;k表示增长率;m表示偏移参数,趋势项斜率发生变化的转折点。调整m可以对曲线进行左右平移。在具体的实现中,C和k都是时间t的函数,且k的变化是不连续的,为了使g(t)连续会引入一系列复杂的变换,在此不赘述。
季节项用于拟合周、月、季等的周期性变化趋势,使用傅里叶级数来逼近:
记
则,s(t)=X(t)β,β是需要学习的,服从正态分布N(0,σ²)。
其中,P表示周期(年用365.25,周用7),N表示使用的逼近项数目(年用10,周用3)。
节假日项用于表示潜在的跳变点对预测的影响,例如:节假日、突发事件等。由于每个节假日对时间序列的影响程度不一样,因此,不同的节假日可以看成相互独立的模型。并且可以为不同的节假日设置不同的前后窗口值,表示该节假日会影响前后一段时间的时间序列。假设现在有L种不同的节假日,Di表示节假日窗口的日期集合,节假日项可表示为:
Z(t)=[1(t∈D1,…,1(t∈DL)]
h(t)=Z(t)κ
其中,κ同样服从正态分布N(0,ν²),ν叫做holidays_prior_scale,默认值是10,当值越大时,表示节假日对模型的影响越大;当值越小时,表示节假日对模型的效果越小。
最后,噪声项用于表示未预测到的随机波动。
根据以上介绍,Prophet模型其实是在训练:趋势项里的k,m;季节项里的β;节假日项里的κ;以及误差项ϵt。Prophet模型适用于预测符合以下条件的时间序列数据:
- 训练数据:拥有至少一个完整周期的数据,让模型完整学习规律;
- 数据趋势:数据有一定正常的周期效应,例如:周末效应、季节效应等;
- 跳变情况:明确可能发生跳变的时间点及窗口期,例如:双十一、春节等;
- 缺失值情况:历史数据的缺失值和异常值保持在合理范围内。
3.2.2 Informer
Informer是一种基于Transformer架构的时间序列预测模型。Transformer由自注意力机制的编码器和解码器组成。Informer的设计目标是解决传统的时间序列预测模型在长序列和多尺度预测上的挑战,以便模型能够更好地捕捉序列中的长期依赖关系和全局上下文信息。
Informer的关键特点包括:
- 一种稀疏自注意力机制,在时间复杂度和内存使用方面达到O(LlnL)。
- 自注意力蒸馏机制,通过对每个自注意力层结果上进行一维卷积,再通过一个最大池化层,对每层输出减半来突出主导注意力,并有效地处理过长的输入序列。
- 并行生成式解码器机制,对长时间序列进行一次前向计算输出所有预测结果而不是逐步的方式进行预测,这大大提高了长序列预测的推理速度。
Informer在时间序列预测任务中取得了很好的性能,尤其在长序列和多尺度预测上表现出色。它已经被广泛应用于气象预测、交通流量预测、金融市场预测等领域。论文中提到模型在ETT(变压器温度)、ECL(电力消耗)、Weather(天气)等标准数据集上达到SOTA。
3.2.3 Autoformer
之前基于Transformer的时间序列预测模型Informer,通过自注意力机制来捕捉时刻间的依赖,在时序预测上取得了一些进展。但是在长期序列预测中,仍存在不足:
- 长序列中的复杂时间模式使得注意力机制难以发现可靠的时序依赖。
- Informer不得不使用稀疏形式的注意力机制来应对二次复杂度的问题,但造成了信息利用的瓶颈。
为突破上述问题,作者提出了名为Autoformer的模型,主要包含以下创新:
- 突破将序列分解作为预处理的传统方法,提出深度分解架构(Decomposition Architecture),能够从复杂时间模式中分解出可预测性更强的组分。
- 基于随机过程理论,提出自相关机制(Auto-Correlation Mechanism),代替点向连接的注意力机制,实现序列级连接和O(LlnL)复杂度,打破信息利用瓶颈。
时间序列分解是指将时间序列分解为几个组分,每个组分表示一类潜在的时间模式,如周期项,趋势项。由于预测问题中未来的不可知性,通常先对过去序列进行分解,再分别预测。但这会造成预测结果受限于分解效果,并且忽视了未来各个组分之间的相互作用。作者提出深度分解层,将序列分解作为Autoformer的一个内部单元,嵌入到编码器-解码器中。在预测过程中,模型交替进行预测结果优化和序列分解,即从隐变量中逐步分离趋势项与周期项,实现渐进式分解。
序列分解单元基于滑动平均思想,平滑周期项、突出趋势项:
Xt= AvgPool(Padding(χ))
XS=X-Xt
其中,χ为待分解的隐变量,Xt,XS分别为趋势项和周期项,将上述公式记为:Xt,XS=SeriesDecomp(χ)。
此外,Autoformer通过自相关机制来实现高效的序列级连接,从而扩展信息效用。观察到,不同周期的相似相位之间通常表现出相似的子过程,作者利用这种序列固有的周期性来设计自相关机制,包含基于周期的依赖发现和时延信息聚合。
最终,作者表示在长期预测问题中,Autoformer在能源、交通、经济、气象、疾病五大时序领域大幅超越之前SOTA,实现38%的相对效果提升。
3.2.4 DLinear
DLinear的作者尝试质疑基于Transformer的模型进行时间序列预测的有效性。作者认为基于Transformer的模型忽略了有序的连续点之间的时间关系,时序上的位置信息在时序预测中时十分重要的,因此提出DLinear模型。
实际上,DLinear的结构非常简单,仅仅是在Autoformer 的分解层后面加上全连接层。模型使用分解层将输入时间序列分解为残差部分(季节性)和趋势部分。随后每个部分都被输入到各自的线性层,输出各自的结果。最终的输出就是两部分输出的和。作者表示DLinear在能源、交通、经济、气象、疾病等领域的数据集上超越了其他深度学习模型。
3.2.5 TimesNet
现实世界的时序数据往往是多种过程叠加,如交通数据的日变化和周变化,天气数据的日变化和年变化等。这种内在的多周期属性使得时序变化极其复杂。
对于某一特定周期过程,其内部每个时间点的时序变化不仅仅与临近时刻有关,也与邻近周期高度相关,即呈现周期内与周期间两种时序变化。其中周期内变化对应着一个周期内的短期过程,周期间变化则可以反应连续周期间的长期趋势。
TimesNet尝试从一个全新的多周期视角分析时序变化。一维时间序列通过快速傅里叶变换选取多个周期,基于多个周期对一维数据进行折叠,得到多个二维张量,每个二维张量的列和行分别反应了周期内与周期间的时序变化。通过这种方式将一维时序数据扩展至二维空间进行分析。
TimesNet由堆叠的若干个TimesBlock组成,每个TimesBlock都有时序数据升维、2D卷积提取表征、中间结果降维、自适应融合等步骤。输入序列X首先经过嵌入层得到深度特征。对于第l层时间块,输入为,经过时间块内部的处理得到输出:,注意到每一层时间块之间都进行了残差连接。
时间块的内部的处理过程:
1)时序数据升维
首先通过快速傅里叶变换对输入的一维时序特征提取周期,选取强度最大的k个频率{f1,…,fk},他们对应着最显著的k个周期{p1,…,pk},然后将其转化成二维张量。相关公式如下:
其中,代表每个频率分量的强度,Period代表快速傅里叶变换以及选取topk个频率和周期的过程。Reshape代表降一维结果转换成二维张量的过程,Padding表示在卷积过程中的补零操作。
2)2D卷积提取表征
对于每个频率分量的二维张量,使用2D卷积提取信息,此处使用Inception模型:
3)中间结果降维
将二维特征转换至一维空间,继续进行信息聚合:
其中,Trunc表示将步骤1)中Padding操作补充的零去除。
4)自适应融合
将上一步中得到的一维表征,与其对应的频率强度进行加权求和,得到一个时间块的最终输出。
通过时间块的设计,模型完成了从多个周期分别提取二维时序变化,再进行自适应融合的时序建模过程。各个时间块之间进行残差连接,便于梯度的直接回传,可加速模型收敛、避免梯度消失。
最终TimesNet在能源、交通、经济、气象、疾病等领域的数据集上达到最佳。
以上就是我们用于比较预测效果的模型,由于本文侧重实践,如果想要更深入地了解各个模型的具体细节,可以自行阅读原论文,论文链接在参考文献中给出。
四、实战
4.1 数据预处理
经过分析,自然状态下的某频道的流量、订单量等指标具有明显的周期性和趋势性,但这种周期性和趋势性在疫情期间无法有效体现,如图红框所示,在疫情期间各项指标的时序数值,较之疫情前后没有明显的周期性和趋势性,受疫情政策的影响较大。而经过22年底至23年初国内对疫情的快速过峰,23年的各项指标序列基本恢复了疫情前的周期性和趋势性,我们的目标是预测23年恢复自然状态之后的指标,因此考虑剔除疫情期间(2020/01/20~2023/01/19)的数据。
以某频道流量为例,画出去除疫情数据后的走势图,红线是以年为尺度进行分割,可以看出数据具有显著的年周期性。
4.2 模型训练与评估
以各项指标的历史数据和其他特征作为数据集,利用3.2中介绍的模型进行预测(Prophet模型只接受单输入,故不作统一比较)。下面以某频道流量为例进行介绍。数据经过脱敏处理。
经测试:Informer的效果在绝大部分情况下均不及Autoformer,因此后续的对比在Autoformer、DLinear和TimesNet中进行。
首先定义输入数据的几个参数:
- model_in:模型的输入维度,设定为20;
- model_out:模型的输出维度,设定为20;
- seq_len:训练模型时编码器时间窗口的大小,可理解为模型回看的时间周期;
- label_len:训练模型时解码器时间窗口的大小,label_len不要超过seq_len,一般设置为seq_len的一半;
- pred_len:预测窗口的大小,即对未来预测多少个时间步,本文中pred_len等于30。
评价指标:MSE(均方误差)和MAE(平均绝对误差)。
* Autoformer
* DLinear
* TimesNet
我们分别对不同的seq_len和label_len组合进行了对比实验,测试集的结果显示,当seq_len=180、label_len=90时,预测的结果最好。模型之间的横向对比显示,TimesNet的效果最好。
此外,针对可能发生的突变点,我们进行了T=120的预测,结果如下:
图像表明,TimesNet模型也无法捕捉到突变点的变化,这可能是训练数据太少导致的。为了能够捕捉到突变点,通过集成Prophet等对突变点较为敏感的传统模型,结果表明集成模型在保证预测精度的同时,还能较好地捕获突变点的变化,且MSE和MAE均小于原模型,如下图所示。
值得一提的是,以上方法的输入输出的维度是可以自己定义的,即可以单输入单输出、多输入单输出、多输入多输出等。
4.3 模型部署与回测
在离线训练模型完毕之后,我们将模型部署到了线上,每天更新T+30D的结果,流程如图所示:
模型上线后需要一定的监控机制,以便在模型预测的效果不好的时候及时修正模型。我们持续监控预测值和真实值的T+3D、T+7D、T+14D、T+21D、T+30D偏差,并以报表的形式展现。
以某频道为例,我们应用模型预测五一节假日某频道的流量,平均预测偏差率为+1.03%,峰值预测偏差率为+0.43%,模型达到了非常优秀的效果。另外,选取五一假期的结束日期作为截止点,3天、7天、14天、21天、30天的平均预测偏差率分别为:+3.7%、+1.8%、+1.4%、+5.5%、-9.6%。
五、总结与展望
本文从预测关键指标的任务出发,论述了时序预测的相关方法、模型的训练与评估、以及模型的在线部署与回测,其中部分内容做了简化处理。
总体而言,近几年来基于深度学习的时序预测的方法是在蓬勃发展的。但是,深度学习的方法很大程度上依赖于数据量,训练数据越多,模型就更的容易从中发现时序潜在的模式。而在现实场景中,数据量并不总是充足的,因此会影响深度学习模型的效果,有时甚至不如传统的方法。另一方面,由于时序数据本身带有公式化的数学特性,深度学习方法能否提供形式化的表征也是一种未知数。
不过,随着时间的发展,数据是会越来越多的,同时,目前越来越多的研究将传统的时序预测方法融合进深度学习时序预测模型中,这也是将数学特性融入深度学习方法的一种尝试。
在今后我们还将继续对基于深度学习的时序模型进行优化,如构造更多特征和协变量、增加预测置信区间、完善模型的评判标准等。