异常检测(Anomaly Detection),以下简称AD,是机器学习算法的一个常见应用。它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。
一、什么是AD?
为了解释AD,下面举一个例子。
假设生产出飞机引擎,需要进行QA(Quality Assurance质量保证,关注的是对质量的检测,通过改进细节提高质量),我们测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,或者引擎的振动等等。而我们生产了m个引擎,那么就有了一个数据集。如下图所示:
将这些数据绘制成图标,如下所示:
这里的每个叉,都是无标签数据。后来有一个新的飞机引擎生产出来,新的飞机引擎的特征变量为。所谓的异常检测问题:我们希望知道这个新的飞机引擎是否有某种异常,所以要进行检测。
给定正常的数据集,检测是否是异常的,即这个测试数据不属于该数据集所在正常范围的概率如何。我们所构建的模型应该能根据该测试数据的位置,告诉我们其属于一组数据的可能性。如下图所示:
上图中,在蓝色圈内的数据属于该组数据的可能性较高,而越是偏远的数据,其属于该组数据的可能性越低。这种方法被称为密度估计,表达式如下:
下面将介绍利用高斯分布(正态分布)实现AD,首先回顾高斯分布的知识。
二、高斯分布
若变量 x 符合高斯分布(也称正态分布),即,则其概率密度函数为:
其中,μ 和 σ² 分别为均值和方差,可以利用已有的数据来计算,如下:
注:计算方差 σ²,我们除以了m,而在统计学中是m-1,但是对于机器学习而言,数据集一般不小,m与m-1区别很小,为了便于记忆和计算,一般选择除以m。
以下是修改 μ 和 σ 的值,相应的高斯分布:
三、高斯分布开发异常检测算法
对于给定的数据集,我们要针对每一个特征计算 μ 和 σ² 的估计值。
然后,给定新的检测实例,根据模型计算:
给定阈值 ε ,当 时,为异常。
下图是一个由两个特征的训练集,以及特征的分布情况;
下面是三维图表示的密度估计函数,z轴为根据两个特征的值所估计的p(x)值:
四、AD的量化数值评估
异常检测算法是一个非监督算法,意味着我们无法根据结果变量 y 的值来告诉我们数据是否真的是异常的,也就是说,我们计算出的数据是异常的,到底对不对。我们需要另一种方法来帮助检验算法是否有效。当我们开发一个AD系统时,我们从带标记(异常或正常)的数据着手,从中选择一部分正常数据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉验证集和测试集。依然按照以前的622划分。
例如:我们有 10000台正常引擎的数据,有20台异常引擎的数据,按以下划分:
6000台正常引擎的数据作为训练集;
2000台正常引擎和10台异常引擎的数据作为交叉验证集;
2000台正常引擎和10台异常引擎的数据作为测试集。
具体的评价方法如下:
1.根据测试集,估计特征的平均值和方差并构建p(x)函数;
2.对交叉验证集,我们尝试使用不同的 ε 值作为阈值,并预测数据是否异常,根据F1值或者查准率与查全率的比例来选择 ε 。
2.选出 ε 后,针对测试集进行预测,计算异常检验系统的F1值,或者查准率与查全率之比。
五、异常检测与监督学习
在第四节中,我们提到了带标记的数据,这与监督学习貌似很相似,但其实是不同的,下面的对比有助于我们是选择监督学习还是异常检测。
六、选择特征
对于AD,我们使用的特征是至关重要的,下面谈谈如何选择特征:
假设特征符合高斯分布,如果数据的分布不是高斯分布,AD也能工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:,其中 c 为非负常数;或者 ,c 为0-1之间的一个分数。
误差分析:
一个常见的问题是一些异常的数据可能也会有较高的 p(x)值,因为被算法认为是正常的。这时候误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察能否找出一些问题。我们可能从问题中发现一些规律或者结构,比如根据现有的特征进行组合,构建我们需要的新的特征,增加这些新的特征后,重新训练的算法能够帮助我们更好的进行异常检测。如下所示: