1,问题的动机
什么是异常检测?
假想你是一个飞机引擎制造商,当你生产的飞机引擎从生产线上流出时,你需要进行 QA(质量控制测试),而作为这个测试的一部分,你测量了飞机引擎的一些特征变量,比如引 擎运转时产生的热量,或者引擎的振动等等。
这样一来你就有了一个数据集,从到,你将这 些数据绘制成图表,看起来就是这个样子:
假如有一天,你生产了一个新的飞机,那么你想检测这个飞机是否正常,这个飞机的的特征变量是,我们想知道这个特征向量是不是正常的,即这个测试数据不属于该组数据的几率如何。我们所构建的模型应该能根据 该测试数据的位置告诉我们其属于一组数据的可能性 ?(?)。
在图中,蓝色圆圈内部表示属于该组数据的可能性较高,越是偏远的地方,可能性就越低。
这种方法称为密度估计,表达如下:
异常检测主要用来识别欺骗。例如在线采集而来的有关用户的数据,一个特征向量中可 能会包含如:用户多久登录一次,访问过的页面,在论坛发布的帖子数量,甚至是打字速度 等。尝试根据这些特征构建一个模型,可以用这个模型来识别那些不符合该模式的用户。
再一个例子是检测一个数据中心,特征可能包含:内存使用情况,被访问的磁盘数量, CPU 的负载,网络的通信量等。根据这些特征可以构建一个模型,用来判断某些计算机是不 是有可能出错了。
2,高斯分布
高斯分布也叫作正态分布。
3,算法
这一节,我们应用高斯分布开发异常检测算法。
当p(x)<时,为异常。
4,开发和评价一个异常检测系统
异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量 ? 的值来告诉我 们数据是否真的是异常的。我们需要另一种方法来帮助检验算法是否有效。当我们开发一个 异常检测系统时,我们从带标记(异常或正常)的数据着手,我们从其中选择一部分正常数 据用于构建训练集,然后用剩下的正常数据和异常数据混合的数据构成交叉检验集和测试 集。
例如:我们有 10000 台正常引擎的数据,有 20 台异常引擎的数据。
我们这样分配数 据:
6000 台正常引擎的数据作为训练集
2000 台正常引擎和 10 台异常引擎的数据作为交叉检验集
2000 台正常引擎和 10 台异常引擎的数据作为测试集
具体的评价方法如下:
1. 根据测试集数据,我们估计特征的平均值和方差并构建?(?)函数
2. 对交叉检验集,我们尝试使用不同的?值作为阀值,并预测数据是否异常,根据 F1 值 或者查准率与查全率的比例来选择 ?
3. 选出 ? 后,针对测试集进行预测,计算异常检验系统的?1值,或者查准率与查全率 之比。
5,异常检测与监督学习对比
之前我们构建的异常检测系统也使用了带标记的数据,与监督学习有些相似,下面的对 比有助于选择采用监督学习还是异常检测:
另外,对于很多技术公司可能会遇到的一些问题,通 常来说,正样本(异常数据)的数量很少,甚至有时候是 0,也就是说,出现了太多没见过的不同的异常 类型,那么对于这些问题,通常应该使用的算法就是异常检测算法。
6,选择特征
异常检测假设特征符合高斯分布,如果数据的分布不是高斯分布,异常检测算法也能够 工作,但是最好还是将数据转换成高斯分布,例如使用对数函数:? = ???(? + ?),其中 ? 为非负常数;或者 ? = ,?为 0-1 之间的一个分数,等方法。
编者注:在 python 中,通常用 np.log1p()函数,???1?就是 ???(? + 1),可以避免 出现负数结果,反向函数就是 np.expm1()
一个常见的问题是一些异常的数据可能也会有较高的?(?)值,因而被算法认为是正常的。 这种情况下误差分析能够帮助我们,我们可以分析那些被算法错误预测为正常的数据,观察 能否找出一些问题。我们可能能从问题中发现我们需要增加一些新的特征,增加这些新特征 后获得的新算法能够帮助我们更好地进行异常检测。