作者简介
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)连续会引入一系列复杂的变换,在此不赘述。
季节项用于拟合周、月、季等的周期性变化趋势,使用傅里叶级数来逼近: