机器学习中的异常检测入门

顾名思义,异常检测是利用机器学习的方法,从一堆样本数据中选择出异常的个体。例如我们高中数学学习的3原则,就是异常检测的一个基础范例。

异常检测在生活中有重要的应用,如生产线产品质量控制、反恐任务、互联网异常用户检测等。

1 异常检测和分类任务

如果将0设定为正常样本,1设定为异常样本,异常检测又可以看做一个二分类的任务,那么它们之间有什么区别呢?

异常检测实际是一种非监督学习,而一般的分类任务是监督学习

异常检测通常有大量负样本(正常),没有或只有很少正样本(异常),而一般的监督学习一般同时有大量的正负样本

异常检测中的异常多种多样而且样本稀少,无法对异常进行学习。

2 算法前提

假设

异常检测算法有一个假设,即对于样本的每一个属性(代表第i个样本的第j个属性),它都满足高斯分布(正态分布):

预处理

显然,并不是所有样本属性都符合上述假设的,所以,要利用一定的预处理技术将样本属性变为正态分布。可以对属性值进行常见的变换,例如

平方根变换

对数变换

变换

这些变换并没有特殊的规律,可以尝试变换,之后检验是否符合正态分布,然后选择其中最好的变换方法。

更多数据变换预处理可以参考这篇文章,文中提到了一种方法:

首先根据数据样本画出均值和方差曲线

如果均值和方差不相关,则不需要转换

如果方差正比于均值,则进行square root transformation转换

如果标准差正比于均值,则进行logarithmic transformation转换

数据处理示例如下:

样本划分

之前说过,异常检测是一种可能带标记的非监督学习,其样本划分和普通学习任务不大一样,假设有10000个正常样本和20个异常样本,可以进行如下划分:

训练集:6000个正常样本(不需要异常样本,所以可以认定为非监督学习)

交叉验证集:2000个正常样本,10个异常样本

测试集:2000个正常样本,10个异常样本

可以看出,训练本身是不需要异常样本的,只需要根据正常样本学习出正常样本是什么样的,与之不同的就是异常样本。

3 算法详情

算法流程

如果假设样本各属性之间相互独立,对于一个样本而言,其出现的概率等于其不同属性出现概率的乘积:

故只需要知道即可算出一个样本的概率。

根据所有样本的属性,通过极大似然法可以算出:

于是,我们利用上述公式算出每个属性的得到了每个属性的概率分布,然后通过乘积得到了每个样本的出现概率,这里需要设定一个阈值,小于阈值记为异常样本。

通过该方法,便实现了异常检测。

上述流程中唯一不确定的是,该参数是不可以直接确定的,一般取决于想要控制的标准,标准越高,则该参数越小。标准越低,该参数越大。

算法解释

该算法为什么可以工作呢?其实很简单,和3原则一样,出现概率太小的样本可以视为不存在,如果他一旦出现,必定是出现了异常。如下图为两个属性的样本出现概率:

图中高度代表出现概率,若样本点所在位置的高度过低,低于阈值,则可能出现了异常。

算法优化

该算法有一个重要的前提——样本各属性之间相互独立,但是实际任务中,个属性往往不独立,例如一个用户登录次数多,那么浏览时间很可能就比较长,则不符合我们的模型,需要对算法进行优化。

如果你有概率统计的知识,就可以知道存在依赖关系的多变量高斯分布的公式:

其中x为n维向量,

描述的便是不同属性之间的相关关系,原算法是为单位矩阵时的特例

该算法的任务仍然是算出参数,同样由极大似然法可得:

注意,其中,等都为n维向量。

算出参数之后,对于任一样本,带入进行计算,和阈值进行比较即可,其余流程和原始算法相同。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180804G1MBQR00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券