苏海明 亓开元 逄立业 郭涛 张连法
1.高效能服务器与存储技术国家重点实验室;2.济南浪潮数据技术有限公司云计算研发部
针对云平台中单维时序监控数据异常检测的问题,单纯的基于阈值的异常检测方法无法满足真实运维环境的需求,提出了一种结合小波分析与XGBoost的云平台时序监控数据异常检测算法。考虑单维时序数据的变化,提取小波包能量特征,组成特征数据集,将特征数据集作为 输入训练XGBoost分类模型。在某高校云平台监控数据集上进行实验,样本数据由人工标注,在此数据集上验证了该方法的准确性与有效性,最终异常检测的误报率为8.4%,准确率达到92.29%,相对传统方案,本文方案在异常识别准确率上并没有太大提升,但在误报率上降低了50%以上。
云平台也称为云计算平台,是指基于硬件资源和软件资源的服务,提供计算、网络和存储能力。云平台监控系统不间断的从平台中采集大量时序KPI[1](Key Performance Indicators)即关键性能指标,例如CPU使用率,网络吞吐量等,来判断平台的运行状态。随着云平台[2]的越来越成熟,平台规模也从最初的几台、十几台上升到几百台甚至上千台,同时平台自身的服务也越来越多、调用也越来越复杂,使监控数据具有海量且复杂的特点。
传统云平台中针对KPI的异常检测大多采用阈值的方式,即运维人员根据经验设置阈值,当KPI数据达到此阈值时,产生异常告警[3]。但实际的应用过程中发现,阈值设置太依赖于经验,很难全面的对繁杂的KPI准确设置阈值;阈值太高,对异常情况产生漏报,质量隐患难以发现,阈值太低,往往引发告警风暴,干扰运维人员的判断;另外对于一些数据抖动但低于阈值的情况,这种方式无法检测,产生漏报。
综上,单纯基于阈值来判定异常的方式无法满足云平台中异常检测的需求,这就要求我们使用机器学习和数据挖掘技术进行自动异常检测。但在真实云平台监控中,异常发生概率比较低,难以积累大量异常样本,这就导致在机器学习流程框架中需要具备自动化构建样本的能力,产生足够的数据以支持异常检测模型的训练。另外由于时序监控数据复杂,有时序数据的特点,即依赖于时间变化,用数值反应变化程度,这种变化可以有多种模式,常见的时序数据模式有平稳型、波动型和周期型。在监控系统中数据模式随业务改变而发生变化,这就要求在针对时序监控数据的异常检测中,检测模型有足够的泛化能力在不同的数据模式下检测出异常。
为了解决上述问题,本文开发一种基于XGBoost的异常检测方法,并将其应用于自研系统中。包含了数据特征提取,特征选择,XGBoost[4]模型训练与检测。
在一个监控系统中,采集的指标时序数据的一般表现为复杂的非平稳序列。小波分析[5]兼具时域与频域的分析能力,且具有可变的时频分辨率,适合分析信号中的突变信号。但小波变换只对信号的低频部分做进一步分解而对高频部分不再继续分解,而小波包变换不仅可以分解时序数据的低频部分,也可以分解数据中的高频部分,所以这种分解方式是一种更精细时序数据分解方法,提高了时序数据的时频分辨率。
本文中使用的小波包分解可用一个二叉树描述,如图1所示。图中每个节点表示一个信号频带,第一个数字表示小波包的分解层数,经过小波包分解不但可以覆盖所有原始信号频带,还可以在任意多尺度分解信号,得到全面的局部信息。
图1 小波包分解Fig.1 Wavelet packet decomposition
一般的对KPI数据进行j层小波包分解后,共可以得到2j个子频带。本文使用小波包能量特征作为分类特征,则第i个子频带对应的能量表示为:
XGBoost算法全称为极端梯度提升算法,是一种基于集成学习的弱学习算法。弱分类器即为比随机猜测略好但准确率不高的分类器。XGBoost的核心在于在分类器中不断添加特征分裂树,每一棵树就相当于一个弱分类器,将这些树进行集成组合,汇总所有弱分类器的建模结果,以获取比单个模型更好的分类表现。
若输入数据为{(x1,y1),(x2,y2),...,(xm,ym)},其中x为根据样本提取的特征,y为数据标签。则XGBoost模型的输出可以表述为:
式中,fk(xi)表示第k个弱分类器,弱分类器的总量为K个。
这K个弱分类器,为了组成强分类器,需要最小化函数:
其中i代表数据集中的第i个样本,m表第k棵树的数据总量,K表示所有树的个数。l(•)为损失函数,用于衡量真实标签与输出值之间的差异,Ω(•)为正则化函数,代表了模型的复杂度。正则化项中T为树的叶子节点个数,w为叶子节点的权值,γ和λ为正则项中的超参数。在每一轮迭代时,只对第t棵回归树的目标函数进行优化:
本文中使用的数据为某高校56节点云平台四个月的监控数据,监控数据采集工具为Telegraf,使用其自带插件CPU、DISK、MEM采集,采集周期为60s。采集的数据包含CPU,内存等关键性能指标的监控数据。异常点使用机器识别与人工判定[6]的方式标注。基于滑动窗口的方式对数据进行分割,窗口大小为60,步长大小为10,滤除数据中的缺失点,并添加数据标签,正常样本标记为负样本,异常样本标记为正样本。共提取出样本数据总数为21542,其中正常样本总数为20074,异常样本数为1468。异常样本占据样本集中的比例为6.81%。
本文基于XGBoost实现对KPI异常点检测,其实现过程如图2所示。
图2 异常检测流程Fig.2 Anomaly detection process
本文的流程包含了训练流程与测试流程,训练过程主要可以分为以下几个步骤:
实验前首先对KPI样本数据集进行归一化处理,使用min-max标准化方法,对原始数据进行线型变换,将数据映射到[0,1]之间,公式如下:
其中,x为原始数据的值,min为样本数据的最小值,max为样本数据的最大值,x*为归一化以后的数据值。划分训练集与测试集的比例为7∶3,7份数据用作模型训练,3份数据用作模型测试。
基于数据样本提取特征,构造特征集。对KPI样本值进行3层小波分解,小波基函数为Daubechies函数[7],是一种离散正交小波。共提取了8个频带,计算出各频带的能量值Ei。由于数据集中得异常样本过少,正样本占比仅为6.81%,为避免模型训练时对正常数据样本的倾斜过大,因此本文使用ADASYN算法[8]对特征数据集进行增强,平衡正常样本与异常样本的比例,一定程度上缓解了模型过拟合。
XGBoost算法模型包含了大量参数,设置恰当的参数是决定数据异常检测准确率的一个关键因素。通过对模型调参确定XGBoost算法最优参数,提高异常检测的准确率。本文使用网格搜索的方法进行参数选择,主要调整的参数为learning_rate学习率,n_estimators迭代次数,max_depth数最大深度。
根据经验值最优迭代系数设置范围为[10,750],步长设置为5,最优树深度设置范围为[3,20],步长设置为1,最优学习率设置范围为[0.01,0.3],步长设置为0.01。最终选择出最佳参数:{‘n_estimators’∶240,‘learning_rate’∶0.1,‘max_depth’∶5}。
XGBoost模型训练后,模型以文件方式进行保存,提取测试数据的小波包能量特征,将特征输入训练好的模型中,输出异常检测结果。
为了评估模型的有效性,本文使用误报率FPR,召回率Recall,精确率Pre和准确率Acc四个方面来进行评价。计算公式为:
式中:TP表示正确识别的异常,TN为正常样本数,FP为正常检测为异常的样本数,FN为异常检测为正常的样本数。
本文提出的方法与其他方法进行对比。结果如表1所示。
表1中的结果对比5种模型的异常检测结果,其中支持向量机(SVM),SVM+PCA,随机森林(RF)方法特征方面使用本文中特征进行模型构建。反向传播神经网络(BP)模型使用文献[9]中的方案进行特征提取与模型构建。
表1 不同模型异常检测结果(%)Tab.1 Anomaly detection results of different models(%)
本文中的XGBoost模型误报率与其他结果相比,从表1中的结果可以看出,SVM方法与本文中的XGBoost具有相似的召回率,但误报率比SVM方法低的多,误报率明显降低,误报率仅有8.4%,比SVM模型的结果低45%,与文献[9]中的方案相比,误报率降低了50%。但在召回率上表现不那么明显,几种模型表现都具有91%以上的召回率,但本文构建出了模型在这几种模型中异常样本召回比例相对较高,达到了92.88%,与SVM模型相比有0.13%的优势。而在精确率与准确率上本文使用的方法具有更明显的优势,文献[9]使用的方法,仅有84.5%的精度与87.45%的准确率,本文使用的方法精确率相对提高了5.85%,准确率提高了4.84%。
本文针对云环境下单维时序监控数据异常检测问题,提出了结合小波包分解与XGBoost模型的异常检测方法,提取数据样本小波包分解后各个频带上的能量特征,并使用XGBoost构建异常检测模型。对比RF,SVM与BP的异常检测效果,证明了特征构造的有效性与XGBoost异常检测模型的可用性。该方式在异常表述上比较简单并可较轻易的在工业生产中使用。