08月10, 2018

基于XGBoost算法的报警分类

背景

公司中常常会出现很多的报警,大量的报警充斥在运维工作人员的工作和生活中,给运维工作人员带来了很大的压力。更让他们头痛的是,他们需要对比报警事件与监控项的变化规律,需要在数量庞大的报警以及监控数据中找到问题的本质,这通常没有明确的规则,更多的时候需要依靠运维人员长期的工作经验。因此,如何能够快速的从报警事件中定位问题,缩小运维人员的排查范围成了提高运维效率的关键。

本文针对运维工作人员所关心的6大类报警,通过相关性检验,信息增益比多次筛选确定影响各类报警的监控指标,再以此为特征运用XGBoost算法对报警进行分类。真正做到了缩小排查范围以及预测报警事件的作用。

方法研究:

本文分别运用了微软论文中相关性分析,信息增益比确定影响各类报警的监控指标,运用XGBoost算法对报警进行分类,下面将详细分析:

相关性分析:

运维角度能够收集大量的机器维度的监控项,但是不是所有的监控项对于某一类报警都有影响,因此想要达到精确定位报警问题的目的,就需要初步的筛选出与报警相关的监控项。如下图所示,每当CPU事件发生时,cup占有率都会升高,而Disk事件发生时cup占有率的变化没有规律性变化,因此可以说明cup占有率与CPU事件相关而与Disk事件无关。 alt 报警是事件集,监控项是时序数据集,两者刻画问题的角度不同,因此判断相关性也比较困难。而微软在2014年SIGKDD会议上发表的论文《Correlating Events with Time Series for Incident Diagnosis》中对这一问题给出了解决方法,具体做法为: 作者将事件(E)和时序(S)数据相关关系问题转化为两个两样本问题,两样本假设检验的核心是判断两个样本是否来自相同的分布。首先选取事件发生前(或者后)对应的N段长为k的时序样本数据,用A1表示。样本组A2则是在时间序列上随机选取一系列长度为k的样本数据。样本集为A1并上A2。如果E和S相关,则A1和A2的分布不同,否则分布相同,怎样来判断A1和A2的分布是否相同?我们看下面这个例子:

alt

上图中样本0-4来自样本组A1,5-9属于样本组A2,使用DTW算法来计算两个样本之间的距离(DTW算法可以很好的适应序列数据的伸缩和位移)。某个属于样本组Ai(i=1或2)的样本X,对于X的r个最近邻居样本,与X属于相同样本组的个数越多则意味着样本组A1和A2分布更不同,即E和S越相关。例如,取邻居个数r=2,样本7的两个最近邻居分别是来自两个不同样本组的3和5,但是样本5的两个最近邻居是来自相同样本组A2的7和8。文章使用置信系数(Confident coefficient)来判断“假设检验H1”(两个分布不相同,即E和S相关)的可信度,置信系数越大,H1越可信。算法的两个关键参数:最近邻居个数r和时间序列长度k,邻居个数为样本个数的自然对数,时序数据的自相关函数曲线的第一个峰值为序列长度。

在运用K近邻算法时,首先序列集可以分为两部分M1和M2,M1是报警点附近的监控项序列,M2是非报警点周围的监控项序列。定义指示函数:

alt

其中x是序列元素,M是M1与M2的并集,Nk(x,M)指集合M中与元素x第k近的元素,接下来计算相关性的值: alt

其中p是集合M的元素个数,当p的值足够大时,Tkp满足正态分布,具体如下: alt

因此可以根据上式进行相关性的假设检验,从而选择出与报警类相关的监控项。

信息增益比:

利用相关性能选择出与报警类相关的所有特征,但是仍然有大量的监控项被选出,如果直接进行分类很容易出现过拟合现象。因此利用相关性检验只能是特征的初步筛选,为达到精确定位问题的目的,需要对监控项进行精细筛选,本文采用的方法是信息增益比。

信息增益和信息增益比是衡量离散特征对模型的贡献程度的重要指标,常常用于决策树的构建之初。特征A对于训练数据集D的信息增益g(D,A)用于表示特征A使数据集 D的分类不确定性减少的程度。对于数据集D,设|D|代表样本容量,设样本有K个类别 ,|ck|为属于类别ck的样本个数,再设特征A有n个不同的取值,并根据特征A的取值将 划分成n个子集,记子集Di中属于类别ck的样本集合为Dik,因此信息增益g(D,A)可以表示为: alt

信息增益比是对于信息增益的改进,克服了信息增益在选择训练特征时出现的偏向选择取值较多特征的问题,信息增益比的具体表示如下: alt

本文对于经过相关性检测筛选出的各个监控项计算信息增益比的值,并选出前K个值(实际操作用选择5个)作为影响报警的最后的监控项特征。

XGBoost算法:

在选择出影响各个报警的监控特征后需要建立相应的分类器进行报警分类,本文选择的是XGBoost算法。XGBoost算法是决策树模型与AdaBoost算法结合的产物,是GDBT模型的改进,在分类方面表现出优异的效果。XGBoost的分类思想以及具体实现:

若已知第t-1轮的决策树,则由Boost思想希望利用前t-1轮构建的决策树构建第t轮的决策树,因此第t轮的目标函数是:

alt

其中L(x)是损失函数,一般为似然函数,将L(x)在第t-1棵树处进行二阶泰勒展开:

alt

而对于一棵决策树而言: alt

其中Wj是第j个叶子节点的预测值,q(x)是一个索引映射,其作用是将输入映射到叶子的索引号上面;T是叶子节点的个数。因此目标函数可以写成如下形式:

alt

对Wj求导并带入上式中可得:

alt

由上式可知通过XGBoost算法可以直接构建出决策树每个叶子节点的预测值,于是问题转化为对于第t轮决策树应该构建多少个叶节点,而对节点的分裂可以用贪心算法进行计算。

若对于某一个叶节点进行再分裂,则会产生的目标函数的下降量为: alt

对于每一次叶节点的分裂应该枚举所有的可能的分割方案,并按照上述公式计算分裂后的目标函数下降量,直至达到最大的决策树深度,或者Gain值都小于0为止。

总结:

利用上述方法,我们对host.alive,df.bytes.used.percent、sys.disk.rw、cpu.idle、mem.swapused.percent和disk.io.util等6大类报警进行了分类,最终的结果如下:

  1. host.alive的报警指标: 'cpu.idle', 'net.if.totoal.bits.sum', 'mem.memused.percent', 'mem.swapused.percent', 'ss.closed';分类精确度:99.6%
  2. df.bytes.used.percent的报警指标:'load.1min','load.5min','load.15min','ss.timewait', 'ss.closed';分类精确度:81%
  3. sys.disk.rw的报警指标:'load.1min','load.5min', 'load.15min', 'df.statistics.used.percent', 'ss.timewait';分类精度:98%
  4. cpu.idle的报警指标:'df.statistics.used.percent', 'ss.timewait','ss.closed','cpu.idle', 'mem.memused.percent';分类精确度:76.6%
  5. mem.swapused.percent的报警指标:'agent.alive', 'load.1min','load.5min','load.15min', 'net.if.totoal.bits.sum';分类精度:80.8%
  6. disk.io.util的报警指标:'load.1min', 'load.5min','load.15min', 'mem.memused.percent', 'ss.closed';分类精度:75.9%

本文链接:https://www.opsdev.cn/post/aralmclassify.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。