作者简介

饭饭爱吃饭,携程高级数据分析师,主要负责旅游领域数据赋能相关工作。对旅游趋势识别与推荐、旅游广告投放、旅游LBS等领域有浓厚兴趣。

一、背景

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

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

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

通常来说,时间序列预测工具方法可以归结为三大类:一类是基于业务场景理解的因子预测模型,一类是传统时间序列预测模型,比如均值回归、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有能较好地自动提取时序特征的能力。

在某条业务产线上,我们针对多城市的数据进行建模,训练了