赞
踩
时序数据是业务监控中最多方法,双十一大盘、业务监控系统、系统性能平台等都可以看到他的身影。根据统计,60%+业务系统监控都是通过时序表达出来。在数量上,以在阿里云神农系统为例,一台机器有3500多个时序数据,以5秒作为采样周期1000台集群计算,每秒钟会产生70W个点。
时序数据从产生到看到一般分为几个阶段:
生成时序数据是为了对业务进行监控和报警,但这块目前非常依赖与人的经验,我们来看几个典型的问题:
例如下图的监控中,在2分钟时间内流量大小下跌30%以上,在2分钟内后又迅速恢复:
应对这种情况有几种典型做法:
这些方法有比较强的假设,并对数据的精度有较为严格的要求,在生产中容易产生误报。
与Pangu团队交流时发现,Latency告警是一个很依赖经验的问题,无法使用例如业务量等传统时序建模手段。主要有几大原因:
因此Latency是否正常判断,不能以单一要素维度去建模,要考虑到相关因素。
案例1:在分布式系统下,我们希望所有的实例行为是否都符合预期的,是否有一些实例没有被调度到造成了浪费
案例2:在安全建模中,会对需要对同一类人(例如同一个组织)进行行为建模,其中是否有局部的人行为异常(例如流量在非工作时间段非常大)
这两个案例都会需要从几千个、几十万个实例中去发现不一样的实例。传统的人肉判断方法会显得力不从心。
作为长期参与飞天操作系统研发,我们不断地在思考这些问题的本质原因和解决方法。在日志服务(SLS)新版本中,我们把机器学习功能在产品推出,希望能替代有经验开发、运维来解决这些问题。
以下系列文章中我们会介绍以上问题的思路及方法,欢迎大家的讨论。
1. 通过降维减小数据维度
通常,我们的时间序列数据是多维的,多维时间序列可用于描述受监测事物的多个方面状态与情况,然而随着维度的增长,多时间序列异常异常检测的计算时间会快速增加。通过观察发现当时间序列存在与异常发生原因无关的维度时,进行一些相关性分析,去除无关维度不会对异常检测的准确性产生决定性影响。
2. 使用简单的线性判别
在时间序列的研究当中,很多时候少即是多,时间序列受随机性,趋势性影响较大,往往越多的参数,越复杂的模型意味着很难去长时间,更泛化的拟合真实的数据。而模型的复杂通常也意味着复杂度的提升,因此我们提倡在大数据算法的设计当中,可以适当的为了泛化能力以及时间效率,选择较为简单的线性方法进行粗略的异常判别,后续再使用更精确的算法对子区间进行判别。
3. 尽量设计在线的算法
目前大多数异常检测方法均为静态方法,即对历史中特定段落的时间序列进行分析并得出结果。静态的时间序列方法不能应用于实时的时间序列异常检测。然而在许多应用场景中时间序列是不断增长的,因此我们对于实时获得的时间序列中的异常的需求同样迫切。而且在线的算法也意味着效率近似于线性,是一件非常让人愉悦的事情。
4. 通过并行的思想改善耗时部分的性能
大数据的异常检测对于检测方法提出了存储能力与计算能力的新要求。单个计算结点的存储能力与计算能力无法满足这些要求,我们需要利用并行化计算的方法改善异常检测方法的检测性能。
如何设计 Master 和 Slaver 结点的算法,以及它们划分,合并的关系,将哪个部分正确的,有效的用于并行计算,是这个方向上的研究重点。
5. 做好时间与检测效果的 Trade Off
针对于大数据所设计出的算法,应该有相应的调整系数,能够平衡效率和检测效果的不同侧重。对于某些不需要高精度检测,但是实时性较强的环境,可以通过调整参数来达到相应的需求。
6. 以框架的方式设计算法
以上所提出的几点,均是这个方向上的算法的设计思路,或者说期望达到的目标,一个算法想要很好的结合这三点是很困难的。因此我们认为或许可以使用框架的方式,将各种手段或者技术进行合理的整合,比如异常序列的粗预警,细预警的分离,多维数据,多指标检测的并行分离,等等手段,都可以通过框架的方式进行有机的整合,最终形成一个良好可用的算法。
时间序列一般具有如下比较明显的特征:
时间序列预测法用于短期、中期和长期预测。时间序列的本质特性是承认动态数据之间的相关性或依赖关系,这种相关性表征了系统的“动态”或“记忆”。如果这种相关性可用数学模型描述,则可有系统的过去及现在的取值预测其未来取值。
一般常用的指数平滑法为一次指数平滑、二次指数平滑、三次指数平滑。在平滑之前,首先需要有初始值,通常,如果数据项小于20,则初始取值第1、2、3期的平均值;如果数据项大于20,则可以把第1期的值作为初始值,记为$S_0$。
其中,$S_{t}^{1}$为t时刻的平滑值,$S_{t-1}^{1}$为t-1时刻的平滑值,$x_{t-1}$为t-1时刻的实际值,$\alpha$为常数值。
预测未来时刻的公式为:
$\alpha$选择的经验:当数据波动不大时,选择较小的值;当数据波动较大时,选择较大的值。
其中,$S_{t}^{1}$为t时刻第一期的平滑值,$S_{t}^{2}$为t时刻第二期的平滑值,$x_t$是t时刻的实际值,$\alpha$为常数值。
预测未来T时刻的计算公式为:
其中
其中,$S_{t}^{1}$为t时刻第一期的平滑值,$S_{t}^{2}$为t时刻第二期的平滑值,$S_{t}^{3}$为t时刻第三期的平滑值,$x_t$是t时刻的实际值,$\alpha$为常数值。
预测未来T时刻的计算公式为:
其中
下图为平台提供的各种滤波操作的结果示意图
* | select ts_smooth_simple(stamp, val) from log limit 100
* | select ts_smooth_fir(stamp, val, 'rectangle', 5, 1, 'avg') from log limit 100
问题假设:任何一个时间序列,可以分解为如下加法形式
其中,$m_t$表示缓慢变化的函数,$s_t$是已知周期为d的函数,称为周期项,$Y_t$是平稳随机噪声项。在估计和抽取时间序列中的确定性成分$m_t$和$s_t$时,使残差量$Y_t$是一个平稳过程,进而求得关于${Y_t}$的合适的数学模型,分析它的性质,并连同$m_t$和$s_t$可达到对${X_t}$预报和控制的目的。
不含有季节项成分模型
不失一般性,假设$E(Y_t) = 0$。
最小化$\sum_{t} (x_t - m_t)^2$以确定$\alpha_0, \alpha_1, \alpha_2$
其中,B是延迟算子,定义为
其中,$E(Y_t) = 0, s_t = s_{t+d}, t \in T$
将d步差分算子,作用于时序模型,得到如下表达式
利用序列的周期为d,则有如下表达式
利用d步差分算子,使经d步差分后数据不含有季节项,使得差分后的结果进行求解使得残差量满足平稳性。
时间序列分析的一些主要方法都是假定数据样本是来自平稳(随机)序列,这是进行分析和确立平稳时间序列线性线性模型的前提。检验数据的平稳性,实质上是检验原来产生数据样本的随机序列的平稳性。从本质上讲,时间序列模型是通过历史规律来预测未来的,即挖掘出的历史数据的一些性质在将来保持不变,这样对模型的预测才有意义,而平稳性就是用来刻画时间序列的统计性质关于时间平移的不变性。
由平稳序列的定义知,必须检验一下两个内容:
数据平稳性检验的参数检验方法:
首先根据平稳序列具有不随时间变化的均值函数和方差函数,其自相关(系数)函数仅是时间间隔的一元函数的性质,构造检验统计量;其次确定检验统计量的分布;进一步由所给数据计算相应统计量的值;最后查表作出结论,接受或者拒绝该数据是否是平稳随机序列。
线性回归模型
其中,$t=1,2,3,...,N, \epsilon_t ~ N(0, \sigma_{2}^{2})$
回归模型表示了因变量的观测值$y_t$对自变量$(x_{t_1},x_{t_2},x_{t_3},...,x_{t_r})$的相关性,这种模型在数学上处理了很多方法,如最小二乘参数估计,处理含有异常值的稳健回归方法(如M估计),处理多元非参数非线性回归的投影寻踪回归(projection pursuit regresion,PPR)。
上述模型描述了p阶自回归模型,q阶移动平均模式。经过证明,ARMA(p, q)过程的平稳性完全取决于回归参数$(\phi_1, \phi_2, \phi_3, ..., \phi_p)$,而与移动平均参数$(\theta_1, \theta_2, ..., \theta_q)$无关。
* | select ts_predicate_simple(stamp, val, 10, 1, 'avg') from log limit 500
这张图显示原始序列和使用ARMA模型序列预测和异常点检测结果示意图
STL(Seasonal-Trend Decomposition Procedure Based on Loess)为时序分解中一种常见算法,将某时刻数据分解为趋势分量、周期分量、残差分量,具体公式如下:
STL分解算法的具体流程
- outer loop:
- 计算鲁棒性回归参数
- inner loop:
- Step 1: 去趋势
- Step 2: 周期子序列平滑
- Step 3: 周期子序列的低通滤波
- Step 4: 去除平滑周期子序列趋势
- Step 5: 去周期
- Step 6: 趋势平滑
* | select ts_decompose(stamp, val, 1, 'avg') from log limit 2000
下图展示利用本平台提供的算法对时序数据的分解结果
给定任意一组参数,均可得到一个模型,但是如何衡量模型的好坏?如何在众多模型中选择一个最好的模型?
AIC/BIC是评估统计模型的复杂度,衡量统计模型拟合的良好程度,一般情况下:
其中K是参数的数量,L是似然函数。假设条件:模型的误差服从独立正太分布,让n为观测数量,RSS为残差平方和,那么AIC的具体计算过程为:$AIC = 2ln(RSS/n) + 2K$,其中增加自由参数的数目提高了拟合的优良性,AIC鼓励数据拟合的优良性,但尽量避免出现过拟合的情况,所以有效的模型应该是AIC值最小的一个。
其中K是参数的数量,L是似然函数。
根据t时刻观测到的一组变量$X_t$预测变量$Y_{t+1}$的值。令$Y_{t+1|t}^{*}$表示根据$X_t$作出的对$Y_{t+1}$的预测。为了评价这个预测有用性,我们需要给出一个损失函数来表示当我们的预测偏离一个特定的量时我们的关心程度。通过假定一个二次损失函数,可以得到一个便利结果。二次损失函数的含义是选择合适的$Y_{t+1|t}^{*}$,使得$E(Y_{t+1} - Y_{t+1|t}^{*})^2$最小。
假设待预测的$Y_{t+1|t}^{*}$限定为$X_t$的线性函数
假设要求解出一个$\alpha$值,使得预测误差$(Y_{t+1} - \alpha^{'}X_t)$无关,即下式成立:
则预测$\alpha^{'}X_t$称为$Y_{t+1}$关于$X_t$的线性投影。
一个将$y_{t+1}$于$x_t$联系起来的线性回归模型如下:
给定一个关于y和x的T个观测值的样本,样本残差平方和定义为
参数95%的置信度在区间A的含义是:采样100次,计算95%置信度的置信区间,有95次计算所得的区间包含真实值。
真实值不变,变的是置信区间。
通常情况下,95%被作为常用的置信度,原理就在于$3\sigma$控制,此时已经有很高的置信度了。
随着置信度的上升,置信区间的跨度也就越大,对参数估计的精度必定降低。
点估计就一个值,精度高,但置信度则低。
已知模型:
且$x_{100} = 0.3, \epsilon_{100} = 0.01$
预测未来3期序列值的95%的置信区间。
估计值的计算:
预测方差的计算:
置信区间的计算
t | lower | upper |
---|---|---|
101 | 0.136 | 0.332 |
102 | 0.087 | 0.287 |
103 | -0.049 | 0.251 |
阿里云日志服务针对日志提供了完整的解决方案,以下相关功能是日志进阶的必备良药:
更多日志进阶内容可以参考:日志服务学习路径。
问题咨询请加钉钉群:11775223
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。