时序预测算法初探:基于机器学习的时序预测算法(1)
背景
在进行资源容量评估(例如对用户数以及TPS、CPU占用率、内存等资源数据进行评估)的时候,如何能够较为准确的预测未来某一时间点的资源容量是一个我们感兴趣的话题。比如,在对某局点进行容量评估时,传统的容量评估算法会人为设定一个未来时间点的预测用户数,然后根据当前忙时平均用户的资源占比评估未来容量情况。
这种方法存在的问题是:1. 设定的预测用户数一般通过人为估计得出,当局点较多时我们希望能够实时、自动的预测未来任意时间段的用户数;2. 当前平均用户的资源占比代表了当前的话务模型,最好需要一种能够预测未来话务模型变化的趋势的算法,从而能够更加精准的预测话务模型的变化趋势。这就要求我们的容量评估算法最好有一种基于时序预测的策略,来帮助我们更好的进行容量评估。
使用STL+ARIMA算法的预测策略
在实际话统数据中,我们发现对于一个稳定局点(实际上大多数局点都可视作稳定局点),用户数、话务模型以及资源占用率有较为规律的周期性。对于具有周期性(也称作季节性)数据,一个常用的算法是STL(Seasonal and Trend decomposition using Loess)分解,简单的来讲,STL分解可以将带有周期性的数据分解为三个分量的加和:周期性分量St、趋势分量Tt和残差Rt
如果为乘积形式:
需要处理为为加和:
STL算法使用了LOESS(可以看作是带kernel的kNN平滑)进行指数平滑,具体实现可以参考[1]。
在得到三个分量以后,我们可以直接使用周期分量用于预测季节性。对于趋势分量,除了回归算法,一种常用的算法是ARIMA(Auto Regressive Integrated Moving Average)算法。即ARIMA包括了三部分:AR, I, MA。
AR模型,或者自回归模型,描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测。如对于一个PP阶的AR,使用了过去PP个时间点的数据预测当前数据X_tX
注意除了回归项以外,还包含了一个噪声项\mu_tμ
,我们使用滑动平均MA来预测这个噪声项(此时我们把阶数定义为Q):
即当前噪声为历史噪声的移动平均。
此时,我们已经定义了一个完整的ARMA模型。但对于一个时间序列来说,往往是不稳定的(unstable)。简单的来讲,就是数据的均值会随时间的变化而变化。一种直接的将不平稳的时间序列转换为平稳的时间序列方法是差分(I),即计算相邻时间点数据的差值。也就是说,使用差分法将不平稳序列转化为平稳序列是ARIMA算法的关键。
为什么要将不平稳序列转化为平稳序列呢?因为我们期望得到一个平稳的序列,这样才能使用该序列预测未来序列。如果为不平稳的序列,说明时间变量会影响行为,从而无法对未来行为进行预测。
如何检验序列的平稳性呢?我们一般会对序列绘图,然后进行ADF检验观察序列是否平稳。
p.s. 有兴趣了解STL以及ARIMA的同学可以参考[3]
Facebook的Prophet算法概述
以上简述了一种常用的预测带有季节性的时间序列的算法,但STL分解+ARIMA算法的缺陷也很明显:
1、用户数、会话数以及话务模型并不严格按照固定的周期。节假日,运营商促销活动等因素都会影响实际的用户数和流量。
2、ARIMA需要人工将数据预处理(平稳化)。针对这些问题,Facebook在2017年开源了一种与STL分解相似的算法,Prophet[2]。
与STL分解相比,Prophet算法将时间序列分成了四个分量的加和:周期性分量st、趋势分量gt、假期分量ht和残差ϵt。
其中假期分量ht可以作为参数调节,且允许运维人员自定义假期、运营商促销等事件,这是Prophet算法的第一个亮点。
Prophet算法还有什么其他亮点呢?以及实际预测效果如何?且听下回分解
参考资料
[1] Cleveland, Robert B., William S. Cleveland, and Irma Terpenning. “STL: A seasonal-trend decomposition procedure based on loess.” Journal of Official Statistics 6.1 (1990): 3.
[2] Sean J. Taylor, Benjamin Letham “Forecasting at Scale” https://peerj.com/preprints/3190.pdf
- 点赞
- 收藏
- 关注作者
评论(0)