文章来源:携程技术(id:ctriptech) 作者:饭饭爱吃饭

原文链接:干货 | 时间序列预测的常见方法及思考


一、背景


随着大数据的发展,自然科学、社会科学、工业工程、金融科技等领域都积累了海量的数据,在这些海量的数据中,时间序列数据(按时间戳顺序依次到达的数据)是其中重要的组成部分。利用这些时间序列数据来预测其未来一段时间的状态有着广泛的应用场景,比如在金融领域被使用来做现金流量预测、股票价格预测,在零售行业被使用来做业务收入预测、库存消耗预测,在旅游行业被使用来预测旅游订单量、客服服务量等,在气象、人口密度预测等方面也被广泛使用来帮助决策者做出有数据支撑的重要决策。


在携程也有一些时间序列预测相关的业务场景,比如下单量预测、话务量预测、客流量预测等,以下将介绍我们在处理时间序列预测相关问题使用的一些方法与思考。


二、时间序列预测比较常见的工具方法


通常来说,时间序列预测工具方法可以归结为三大类:一类是基于业务场景理解的因子预测模型,一类是传统时间序列预测模型,比如均值回归、ARIMA、指数平滑预测法(比如Holt-Winters)等,还有一类是机器学习模型,比如支持向量机、树模型(比如GBM、QRF)、神经网络模型(比如RNN、CNN)等。


2.1 基于业务场景理解的因子预测模型


基于因子的时序预测是一种传统的预测手法,在一些特定场景有着比较好的表现,比如某条业务线刚起步,历史数据的积累有限的时候。同时该方法基于其业务解释性强、准确率也比较高的特点,可以作为时序预测项目的baseline,并且在黑盒模型做输出时,可以帮助进行后置校准,避免输出较大的偏差。


以下举几个案例:


1)需要展示的客流量预测


需要进行展示的客流量预测这样的场景,是一个模型解释性要求比较高,同时周期性较强的场景。那么对于这样的业务场景,可以考虑分解出最重要的周期因子,来进行可解释地稳定地预测。具体实施的时候:考虑到时间序列数值除了受本身业务的影响,存在固定的周期性波动,同时还会受到已知或者未知事件的影响。因此在预测时,会单独将一些已知的重要事件单独进行预估,在基础预测的再叠加事件的影响。


这样的场景,因子预测的公式可以是:某日话务量 = 日话务基准量 * 周规律因子 * 事件影响因子


周规律因子的计算逻辑:基于对一段时间的周规律因子总结,可以得到周规律因子(可以以日话务量与周话务总量的比例关系来做因子,也可以以相邻几天日话务量之间的比例关系来做因子)


日话务基准量:基于周规律因子,可以用来计算每一天的日话务基准量


没有叠加事件影响因子的日话务预测量:基于日话务基准量预测的未来日话务基准量 * 周规律因子


事件影响因子的计算逻辑:可以通过整理出历史上该事件带来的额外话务量(实际量减去预测量)来计算。


2)一条新开拓的国际业务线


一条刚开始快速成长的国际业务线,特点是历史数据积累有限,同时数据量变化大。可能仅仅只能拿到2个月的数据,并且短时间内时序数据的性质(均值、方差)就会有极大的改变。因此用历史数据来预测未来的历史数据的参考性较低,所以需要深入业务去理解,找寻该业务特有的相关因子来进行预测,思路可以是:


首先基于业务相关度进行挖掘(未来入住需求量与售前话务量强相关,新市场新签用户数与未来下单量强相关),然后基于树模型的特征重要性进行核心影响因子的识别,来选择出最为重要的因子特征。最后基于统计学模型对核心影响因子的未来数值进行预测,并在此基础上预测未来的业务线状态。


2.2 传统时间序列预测模型


传统时间序列预测模型,通常指用于时间序列分析/预测的统计学模型,比如常用的有均值回归、ARIMA、指数平滑预测法等。


其中均值回归,指对历史一段时间的值取平均,作为未来每个时刻的预测。其他时间序列预测模型比如ARIMA(auto-regressive integrated moving average)、一些指数平滑模型(SEM,Holt-Winters等),主要通过对历史数据的建模分析,抽离出其中的趋势,最后通过对趋势的预测得到未来一段时间需求的变化。


基于统计学的传统时间序列预测方法,优点是复杂度低、计算速度快。但是有其局限性,通过对业界方法的调研与自己的实验,我们发现由于真实应用场景的复杂多样性(现实世界的时间序列往往受到各种不同因素的限制与影响,而难以预测),比如受到营销计划、自然灾害等的影响,传统的单一统计学模型的准确率相对来说会比机器学习差一部分,而机器学习模型或者更复杂的ensemble集成模型会有更好的效果。但传统时间序列预测模型也有其重要的意义,比如说:


可以作为预测的baseline model,为项目提供一个准确率的基准线,来帮助评估其他模型的提升。


前置清洗作用,时序模型由于其较好的可解释性,可以帮助剔除一些异常值,比如因服务器故障或者业务线逻辑调整产生的异常值。


作为集成模型中的一块,参与时序集成模型的训练。


可以提供一个预测结果的合理的范围,因为话务量通常不会短时间内激增。使用这个合理的范围,在黑盒模型最后输出结果时,帮忙进行后置校准,从而使预测系统更加稳定。


2.3 机器学习模型


在运用机器学习模型时,我们可以把时间序列模型当成一个回归问题来解决,常见的方法有树模型与神经网络模型两大类。


1)树模型


一般采用的是xgboost或者lightgbm的方法,现在业界也被广泛应用,这里就不多做介绍了。树模型的一个好处就是,相对于以上的方法,能更方便地添加一些category类的特征比如:是否季节末、是否公共价格、是否营业时间等。

在用树模型做时间序列预测时,特征工程的核心要点在于如何从历史的数据中抽取特征,这里介绍一些特征构建的经验:


离散类时间特征:年月日时分数,周几,一年中的第几天,第几周,一天中的哪个时间段等


判断类时间特征:是否调休,是否周末,是否公共假期等


滑窗类时间聚合特征:过去X天平均值,过去X天方差,过去X天最大值,过去X小时四分位数,过去X天偏态系数等


其他时序模型的预测值作为特征:ARIMA、SARIMA、指数平滑等


其他相关业务线数据的引入:比如对于售后业务线,引入售前业务线/预定业务线等数据,帮忙进行售后业务线的预测


2)神经网络模型


常见的利用神经网络技术来做时间序列预测的方法有有CNN、RNN、LSTM、GRU等。


相对于传统的树模型需要人工构建相关模型特征,神经网络模型通常需要喂入大量的数据来进行训练,因此如果同类时序的数据量够多(有够多彼此间相关性较强的时序),那么训练一个通用型的端对端的神经网络预测有时也有不错的效果,比如使用LSTM一方面可以较容易地整合外部变量,另一方面LSTM有能较好地自动提取时序特征的能力。


在某条业务产线上,我们针对多城市的数据进行建模,训练了一个灵活单一通用的端对端LSTM时间预测模型。具体在训练时,输入数据一方面包括了时间序列相关的数据,另一方面也包括了天气、节假日等外部变量,同时使用了encoder-decoder来帮助提取时序特征,在T+14的主要大城市时序预测上有较大的提升,达到日95%+的准确率。


同时,在实践中,我们发现对于一些产线,采用多任务学习的方法,可以有效地提高模型的泛化性以及准确率,比如预测未来某天某些时段的值时,将不同时段的值作为不同的任务目标来进行学习,或者是加入相关性很强的其他时序数据来作为不同的任务目标。


三、一些经验与思考


1)训练测试数据的划分


和其他机器学习场景不同,时间序列预测的数据是带有前后顺序的序列数据,因此在做训练测试数据的划分时,要注意不能泄露测试数据给模型,因此在做训练测试数据划分时,需要让测试数据全都在训练数据的时间戳之后。


2)一线业务人员经验的使用


在做一些时间序列预测场景时,我们发现一线业务人员经验是极其宝贵的,比如说一些抚平/剔除业务异常数据的经验,他们会知道在历史数据里哪些时间段的数据是异常的原因是什么,比如各种事件会对不同的业务线产生什么样的影响、一些预测偏差较大的原因可能是什么。这些宝贵的经验可以转化成时间序列历史数据清洗的规则或者是一些时间序列数据校准的Knowledge Base。


3)利用能反映未来的信息


当我们在做时间序列预测时,本质我们是在利用历史数据来预测未来,那么如果我们能够拿到更多关于未来的信息,则可以帮助我们预测的更准。什么是关于未来的信息呢?比如说:用户的预订信息,用户的浏览数据,这些数据能够侧面反映用户对于未来某天的兴趣值,从而帮助我们窥探未来。


4)如何保证输出结果的稳定性


在使用黑盒模型时,我们会发现有时模型输出会存在一些异常点,这可能是由于历史数据中存在一些没有被剔除的噪音,因此我们需要构建多种可解释性强的预测尺度范围,来校准最后的输出结果,从而提高模型输出的稳定性,生产中这样的校准有时也可以提高一定的准确率。


5)重新训练模型的频率


通常,当有新数据获得时,重新训练模型来进行预测,整体来说在每个时间戳能给出更好的预测结果。如果生产上准备采取这种思路的话,在训练的时候也要用相同的重新训练的方法,来评估哪种模型效果最好,即采用sliding window / expanding window的方法去在每个时间戳重新训练预测和记录误差来进行模型评估。当然这样计算量会比较大,比较适合单一产线并且对准确率较为看中的场景。


6)如何评估模型的好坏


对于不同的项目,评判时序预测模型好坏的标准是不同的,整体来说,要针对不同的项目场景,综合模型准确率、可维护性、可解释性、稳定性等多方面去评估一个预测模型或者一个预测框架的合理性和实用性。


7)历史数据该相信多少


事物是不断发展变化的,比如随着智能客服智能化程度的提高,需要人工客服处理的订单会逐渐变少,因此人工客服相关的时间序列数据的性质会处于不断变化之中,那么我们对于越久远的历史数据的信任度应该是要逐渐下降的。处理的方法是一方面我们可以通过分析来判断训练应该取多久内的时间序列数据,另一方面我们在训练时可以赋予越近的数据更高的权重。