文章目录
- 前言
- 一、常见的2类无监督学习算法
- 1、聚类
- 2、降维
- 二、异常检测的常用算法
- 1、Z-score算法
- 2、KNN异常检测
- 3、Local Outlier Factor(LOF算法)
- 4、Isolation Forest(孤立森林)
- 总结
前言
这一节主要讲解几个异常检测的算法。
一、常见的2类无监督学习算法
1、聚类
简单说就是一种自动分类的方法,在监督学习中,你很清楚每一个分类是什么,但是聚类则不是,你并不清楚聚类后的几个分类每个代表什么意思。其多用于异常检测,因为聚类是发现样本之间的相似性,异常检测是发现样本之间的差异性,两者结合起来则可进行异常检测。
2、降维
处理数据,在尽可能保存相关的结构的同时降低数据的复杂度。常将其与用多维数据异常检测中,有相关论文可查。
二、异常检测的常用算法
常见的异常检测算法有Z-score算法、KNN算法、Local Outlier Factor、孤立森林。
1、Z-score算法
假设样本服从正态分布,用于描述样本偏离正态分布的程度。通过计算μ和σ得到当前样本所属于的正态分布的表达式,然后分别计算每个样本在这个概率密度函数下被生成的概率,当概率小于某一阈值我们认为这个样本是不属于这个分布的,因此定义为异常值。
获得了平均值和方差的估计值,给定新的一个训练实例,根据模型计算 p(x):
当p(x)<ε时,为异常。后续也有很多研究对此算法进行了拓展,更详细的讲解可参考以下网址:
http://t.zoukankan.com/ssyfj-p-12940077.html(机器学习基础—无监督学习之异常检测)
2、KNN异常检测
KNN算法专注于全局异常检测,所以无法检测到局部异常。
首先,对于数据集中的每条记录,必须找到k个最近的邻居。然后使用这K个邻居计算异常分数。有三种方法:
- 最大:使用到第k个邻居的距离作为离群值得分
- 平均值:使用所有k个邻居的平均值作为离群值得分
- 中位数:使用到k个邻居的距离的中值作为离群值得分
在实际方法中后两种的应用度较高。然而,分数的绝对值在很大程度上取决于数据集本身、维度数和规范化。
参数k的选择当然对结果很重要。如果选择过低,记录的密度估计可能不可靠,即过拟合;如果它太大,密度估计可能太粗略。K值的选择通常在10<k<50这个范围内。所以在分类方法中,选择一个合适的K值,可以用交叉验证法。但是,事实上基于KNN的算法都是不适用于欺诈检测的,因为他们本身就对噪声比较敏感。
3、Local Outlier Factor(LOF算法)
基于密度的局部离群因子(LOF)算法相对比较更加简单、直观以及不需要对数据的分布有太多的要求,还能量化每个数据点的异常程度。该算法是基于密度的算法,主要核心的部分是关于数据点密度的刻画。算法的整个流程如下所示:
- -近邻距离(k-distance): 在距离数据点最近的几个点中,第个最近的点跟点之间的距离称为点的-近邻距离,记为。
- 可达距离(rechability distance): 可达距离的定义跟k-近邻距离是相关的。当给定参数时,数据点到数据点的可达距离为数据点的-近邻距离和数据点与点之间的直接距离的最大值。即:
- 局部可达密度(local rechablity density):局部可达密度的定义是基于可达距离的,对于数据点,那些跟点的距离小于等于的数据点称为它的k_nearest_neighor,记为,数据点的局部可达密度为基于的最近邻的平均可达距离的倒数,即:
- 局部异常因子: 根据局部可达密度的定义,如果一个数据点跟其他点比较疏远的话,那么显然它的局部可达密度就小。但LOF算法衡量一个数据点的异常程度,并不是看它的绝对局部密度,而是看它跟周围邻近的数据点的相对密度。这样做的好处是可以允许数据分布不均匀、密度不同的情况。局部异常因子即是用局部相对密度来定义的。数据点 的局部相对密度(局部异常因子)为点的邻居们的平均局部可达密度跟数据点的局部可达密度的比值,即:
根据局部异常因子的定义,如果数据点 p 的 LOF 得分在1附近,表明数据点p的局部密度跟它的邻居们差不多;如果数据点的 LOF 得分小于1,表明数据点处在一个相对密集的区域,不像是一个异常点;如果数据点的 LOF 得分远大于1,表明数据点跟其他点比较疏远,很有可能是一个异常点。
总结:整个LOF算法,首先对于每个数据点,计算它与其它所有点的距离,并按从近到远排序,然后对于每个数据点,找到它的k-nearest-neighbor,最后计算LOF得分。
4、Isolation Forest(孤立森林)
在高维数据集中实现离群点检测的一种有效方法是使用随机森林。通过随机选择一个特征,然后随机选择所选特征的最大值和最小值之间的分割值来"隔离"观测。
先用一个简单的例子来说明 Isolation Forest 的基本想法。假设现在有一组一维数据(如下图所示),我们要对这组数据进行随机切分,希望可以把点 A 和点 B 单独切分出来。具体的,我们先在最大值和最小值之间随机选择一个值 x,然后按照 =x 可以把数据分成左右两组。然后,在这两组数据中分别重复这个步骤,直到数据不可再分。显然,点 B 跟其他数据比较疏离,可能用很少的次数就可以把它切分出来;点 A 跟其他数据点聚在一起,可能需要更多的次数才能把它切分出来。
把数据从一维扩展到两维。同样的,沿着两个坐标轴进行随机切分,尝试把下图中的点A’和点B’分别切分出来。我们先随机选择一个特征维度,在这个特征的最大值和最小值之间随机选择一个值,按照跟特征值的大小关系将数据进行左右切分。然后,在左右两组数据中,重复上述步骤,再随机的按某个特征维度的取值把数据进行细分,直到无法细分,即:只剩下一个数据点,或者剩下的数据全部相同。跟先前的例子类似,直观上,点B’跟其他数据点比较疏离,可能只需要很少的几次操作就可以将它细分出来;点A’需要的切分次数可能会更多一些。
按照关于“异常”的特性,一般情况下,在上面的例子中,点B和点B’ 由于跟其他数据隔的比较远,会被认为是异常数据,而点A和点A’ 会被认为是正常数据。直观上,异常数据由于跟其他数据点较为疏离,可能需要较少几次切分就可以将它们单独划分出来,而正常数据恰恰相反。这其实正是Isolation Forest(IF)的核心概念。IF采用二叉树去对数据进行切分,数据点在二叉树中所处的深度反应了该条数据的“疏离”程度。
通过学习,我们知道,此算法适用于:异常数据占总样本量的比例很小;异常点的特征值与正常点的差异很大的情况。同时也需注意:若训练样本中异常样本的比例较高,可能会导致最终结果不理想,因为这违背了该算法的理论基础;异常检测跟具体的应用场景紧密相关,因此算法检测出的 “异常” 不一定是实际场景中的真正异常,所以在特征选择时,要尽量过滤不相关的特征。
总结
以上就是今天学习所有内容,参考网站如下:
无监督算法与异常检测 一文读懂异常检测 LOF 算法(Python代码) 无监督学习中的异常值检测 机器学习基础—无监督学习之异常检测