作者:刘平
转自:「智能运维前沿」订阅号
今天给大家介绍Netman实验室在异常检测领域的研究成果:基于机器学习的KPI自动化异常检测系统(Opprentice)。在实际生产环境中,异常检测系统的痛点就是异常检测算法的选择以及算法参数的调整,这个过程往往耗费大量的人力和时间,但是往往效果无法达到预期,Opprentice主要针对这类难题设计,通过将异常检测问题转换为监督式的机器学习问题,实现了异常检测算法的自动选择和算法参数的自动调整。
在实际的运维场景中,构建一个异常检测系统往往需要两个角色共同参与:领域专家和算法开发人员。领域专家也就是我们的运维人员,他们对KPI曲线的行为很熟悉,可以通过观察KPI曲线并结合自己的领域知识,判断KPI曲线是否出现异常;算法开发人员负责构建异常检测系统,他们熟悉异常检测器(算法),但是实际中有各种不同类型的KPI曲线需要维护,所以需要为不同类型的KPI曲线选择合适的异常检测器以及合适的算法参数。
在实际构建异常检测系统时,首先需要运维人员结合自己的领域知识向算法开发人员描述异常,然后开发人员根据这些描述来为KPI曲线选择合适的检测器和算法参数,接着领域专家根据这些检测器的检测结果向开发人员反馈,来进一步优化检测器。所以实际中经常需要经过多次迭代才能开发出可用的异常检测系统,有时还会出现最终开发失败的例子,这是因为:
运维人员难以事先给出准确、量化的异常定义
选择和综合不同的检测器需要很多人力
检测器算法复杂,参数调节不直观
实际中经常需要经过多次迭代才能开发出可用的异常检测系统,有时还会出现最终开发失败的例子。因此,我们就会问,有没有一个可以自动选择异常检测器和自动调节算法参数的系统呢?答案是有!,我们实验室的研究成果:基于机器学习的KPI自动化异常检测系统(Opprentice)就是针对它设计的,下文将主要介绍Opprentice 的设计思想以及设计框架。
Opprentice (Operator's Apprentice)的主要思想就是跟着运维人员从历史数据中学习,运维人员就像是一个“师傅”,将自己的领域知识“教“给Opprentice,然后Opprentice根据“学”到的知识来自动选择合适的异常检测器和算法参数。如下图所示,运维人员首先在历史的KPI曲线上标记出异常,接着Opprentice 使用十几种不同类型的检测器提取出上百个异常特征,此时有了人工标记的数据和异常特征,我们就可以将异常检测问题转化成机器学习中监督式的分类问题,将提取出的特征作为机器学习算法的输入,通过分类算法将KPI曲线上的点分为正常和异常,从而实现了异常检测。
Opprentice主要由两部分组成:离线训练分类器和在线检测,在离线训练分类器部分,首先运维人员使用我们开发的异常标注工具,方便快速的标注出KPI曲线上的异常数据,并且设置期望Opprentice达到的准确率(precision)和召回率(recall),然后Opprentice会使用十几种不同类型的检测器提取出KPI曲线的特征,其中每种检测器都有多种不同的参数配置,因此最终会提取出上百个异常特征。因为提取出的上百个异常特征中会存在无关特征和冗余特征,一些机器学习算法使用包含有这些特征的数据训练模型时准确度会降低,为了解决这个问题,我们选择了一种集成学习算法(ensemble learning algorithm)来训练分类器:随机森林,随机森林算法使用了多棵决策树,最终的结果是由每棵决策树的结果投票决定的,并且训练决策树的特征和数据都只是采样了整体特征和数据的一部分,因此使用随机森林训练模型时,无关特征和冗余特征不会影响算法的性能。最后,将提取出的异常特征,运维人员的标注数据和准确性倾向作为输入,训练出异常分类器。
在线检测部分中,首先对于新的数据点进行特征提取,然后用训练出的分类器判断数据点是否异常。在实际中,新的KPI数据中往往会出现一些历史数据中没有出现过的异常类型,为了让分类器可以适应新出现的异常,就需要运维人员定期的对最新的KPI数据进行异常标记,Opprentice会定期训练新的模型来更新分类器。
我们使用了来自百度和清华校园网的数个月的真实数据对系统的性能进行了验证,下面四幅图是在四个不同类型的KPI数据上,Opprentice使用的随机森林模型跟其它检测器的性能对比,可以看出Opprentice均取得了优异的结果。
Opprentice将异常检测问题转换成了机器学习中的监督式分类问题,使用运维人员的标注数据,在历史数据中训练出分类模型来自动构建异常检测系统,从而解决了异常检测器的选择和算法参数调整的难题,为复杂检测器的实际应用提供了自动化的框架。
由于篇幅有限,没有介绍Opprentice的更多细节,特此附上论文链接,请点击阅读原文获取。