一、前言
外卖业务的快速发展对系统稳定性提出了更高的要求,每一次订单量大盘的异常波动,都需要做出及时的应对,以保证系统的整体稳定性。如何做出较为准确的波动预警,显得尤为重要。
从时间上看,外卖订单量时间序列有两个明显的特征(如下图所示):
- 周期性。每天订单量的变化趋势都大致相同,午高峰和晚高峰订单量集中。
- 实时性。当天的订单量可能会受天气等因素影响,呈现整体的上涨或下降。
订单量波动预警,初期外卖订单中心使用的是当前时刻和前一时刻订单量比较,超过一定阈值就报警的方式,误报率和漏报率都比较大。后期将业务数据上传到美团点评的服务治理平台,使用该平台下的基线报警模型进行监控报警。基线数据模型考虑到了订单量时间序列的周期性特征,但是忽略了实时性特征,在实际使用中误报率依然很高,大量的误报漏报导致RD对于报警已经麻木,出现问题时不能及时响应,因此,急需一种新的异常检测模型,提高报警的准确率。
二、异常检测的定义
异常,意为“异于正常”。异常检测,就是从一组数据中寻找那些和期望数据不同的数据。监控数据都是和时间相关的,每一个监控指标只有和时间组合一起才有其具体的含义。按照时间顺序,将监控指标组成一个序列,我们就得到了监控指标的时间序列。
基于预测的异常检测模型如下图所示,xt是真实数据,通过预测器得到预测数据,然后xt和pt分别作为比较器的输入,最终得到输出yt。yt是一个二元值,可以用+1(+1表示输入数据正常),-1(-1表示输入数据异常)表示。
异常检测主要有两种策略:
- 异常驱动的异常检测(敏感性):宁愿误报,也不能错过任何一个异常,这适用于非常重要的检测。简单概括,就是“宁可错杀一千,不能放过一个”。
- 预算驱动的异常检测(准确性):这种策略的异常检测,从字面理解就是只有定量的一些预算去处理这些报警,那么只能当一定是某种问题时,才能将报警发送出来。
这两种策略不可兼容的。对于检测模型的改善,可以从两个方面入手,一是预测器的优化,二是比较器的优化。我们从这两个方面描述模型的改善。
三、预测器设计
预测器,就是用一批历史数据预测当前的数据。使用的历史数据集大小,以及使用的预测算法都会影响最终的预测效果。
外卖订单量具有明显的周期性,同时相邻时刻的订单量数据也有很强的相关性,我们的目标,就是使用上面说的相关数据预测出当前的订单量。下面,我们分析几种常用的预测器实现。
3.1 同比环比预测器
同比环比是比较常用的异常检测方式,它是将当前时刻数据和前一时刻数据(环比)或者前一天同一时刻数据(同比)比较,超过一定阈值即认为该点异常。如果用图2.1模型来表示,那么预测器就可以表示为用当前时刻前一时刻或者前一天同一时刻数据作为当前时刻的预测数据。
如果将不同日期、时刻的监控数据以矩阵方式存储,每一行表示一天内不同时刻的监控数据,每一列表示同一时刻不同日期的监控数据,那么存储矩阵如下图所示:
图3.1 同比环比
假如需要预测图中黄色数据,那么环比使用图中的蓝色数据作为预测黄点的源数据,同比使用图中红色数据作为预测黄点的源数据。
3.2 基线预测器
同比环比使用历史上的单点数据来预测当前数据,误差比较大。t时刻的监控数据,与
t-1,t-2,...时刻的监控数据存在相关性。同时,与t-k,t-2k,...时刻的数据也存在相关性(k为周期),如果能利用上这些相关数据对t时刻进行预测,预测结果的误差将会更小。
比较常用的方式是对历史数据求平均,然后过滤噪声,可以得到一个平滑的曲线(基线),使用基线数据来预测当前时刻的数据。该方法预测t时刻数据(图中黄色数据)使用到的历史数据如下图所示(图中红色数据):
图3.2 历史数据求平均
基线数据预测器广泛应用在业务大盘监控中,预测效果如图3.3所示。从图中可以看出,基线比较平滑,在低峰期预测效果比较好,但是在外卖的午高峰和晚高峰预测误差比较大。
图3.3 基线数据预测
3.3 Holt-Winters预测器
同比环比预测到基线数据预测,使用的相关数据变多,预测的效果也较好。但是基线数据预测器只使用了周期相关的历史数据,没有使用上同周期相邻时刻的历史数据,相邻时刻的历史数据对于当前时刻的预测影响是比较大的。如外卖订单量,某天天气不好,很多用户不愿意出门,那么当天的外卖的订单量就会呈现整体的上涨,这种整体上涨趋势只能从同一周期相邻时刻的历史数据中预测出来。如图3.4所示,预测图中黄色数据,如果使用上图中所有的红色数据,那么预测效果会更好。
图3.4 Holt-Winters预测
本文使用了Holt-Winters来实现这一目标。
Holt-Winters是三次指数滑动平均算法,它将时间序列数据分为三部分:残差数据a(t),趋势性数据b(t),季节性数据s(t)。使用Holt-Winters预测t时刻数据,需要t时刻前包含多个周期的历史数据。
各部分的迭代计算公式(周期为k):
如图3.5所示,(a)显示了某一段时间内外卖订单的原始提单监控数据(分钟统计量,周期为1天),图(b)显示了其Holt-Winters的分解图(四幅图分别对应原始数据、残差数据分量、趋势数据分量、周期数据分量)。将订单量时间序列分解为残差数据a(t),趋势数据b(t),周期数据s(t)后,就可以使用下面的公式预测未来不同时刻时刻的订单量,其中h表示未来时刻距离当前时刻的跨度。
外卖订单量