异常点检测,有时也叫离群点检测,英文一般叫做Novelty Detection或者Outlier Detection,是比较常见的一类非监督学习算法。
1 异常点检测算法使用场景
什么时候我们需要异常点检测算法呢?常见的有三种情况。
- 在做特征工程的时候需要对异常的数据做过滤,防止对归一化等处理的结果产生影响。
- 对没有标记输出的特征数据做筛选,找出异常的数据。
- 对有标记输出的特征数据做二分类时,由于某些类别的训练样本非常少,类别严重不平衡,此时也可以考虑用非监督的异常点检测算法来做。
2 异常点检测算法常见类别
异常点检测的目的是找出数据集中和大多数数据不同的数据,常用的异常点检测算法一般分为三类。
第一类是基于统计学的方法来处理异常数据,这种方法一般会构建一个概率分布模型,并计算对象符合该模型的概率,把具有低概率的对象视为异常点。比如特征工程中的RobustScaler方法,在做数据特征值缩放的时候,它会利用数据特征的分位数分布,将数据根据分位数划分为多段,只取中间段来做缩放,比如只取25%分位数到75%分位数的数据做缩放。这样减小了异常数据的影响。
第二类是基于聚类的方法来做异常点检测。这个很好理解,由于大部分聚类算法是基于数据特征的分布来做的,通常如果我们聚类后发现某些聚类簇的数据样本量比其他簇少很多,而且这个簇里数据的特征均值分布之类的值和其他簇也差异很大,这些簇里的样本点大部分时候都是异常点。比如BIRCH聚类算法原理和DBSCAN密度聚类算法都可以在聚类的同时做异常点的检测。
第三类是基于专门的异常点检测算法来做。这些算法不像聚类算法,检测异常点只是一个赠品,它们的目的就是专门检测异常点的,这类算法的代表是One Class SVM和Isolation Forest。
3 相关算法
3.1 均方差
在统计学中,如果一个数据分布近似正态,那么大约 68% 的数据值会在均值的一个标准差范围内,大约 95% 会在两个标准差范围内,大约 99.7% 会在三个标准差范围内。
因此,如果你有任何数据点超过标准差的 3 倍,那么这些点很有可能是异常值或离群点。
3.2 箱形图
箱形图是数字数据通过其四分位数形成的图形化描述。这是一种非常简单但有效的可视化离群点的方法。考虑把上下触须作为数据分布的边界。任何高于上触须或低于下触须的数据点都可以认为是离群点或异常值。
箱形图剖析:
四分位间距 (IQR) 的概念被用于构建箱形图。IQR 是统计学中的一个概念,通过将数据集分成四分位来衡量统计分散度和数据可变性。
简单来说,任何数据集或任意一组观测值都可以根据数据的值以及它们与整个数据集的比较情况被划分为四个确定的间隔。四分位数会将数据分为三个点和四个区间。
四分位间距对定义离群点非常重要。它是第三个四分位数和第一个四分位数的差 (IQR = Q3 -Q1)。在这种情况下,离群点被定义为低于箱形图下触须(或 Q1 1.5x IQR)或高于箱形图上触须(或 Q3 + 1.5x IQR)的观测值。
3.3 DBScan 聚类
DBScan 是一种用于把数据聚成组的聚类算法。它同样也被用于单维或多维数据的基于密度的异常检测。其它聚类算法比如 k 均值和层次聚类也可用于检测离群点。在本例中,作者将展示一个使用 DBScan 的示例。在开始之前,需要先了解一些重要的概念:
核心点:为了理解核心点的概念,我们需要访问一些用于定义 DBScan 任务的超参数。第一个超参数是 min_samples。这只是形成簇所需的最小核心点数量。第二个重要的超参数是 eps。eps 可以视为同一个簇中两个样本之间的最大距离。
边界点与核心点位于同一个簇中,但前者距离簇的中心要远得多。
其它任何点都被称作噪声点,它们是不属于任何簇的数据点。它们可能是异常的或非异常的,需要进一步研究。
以上代码的输出为 94。这是噪声点的总数。SKLearn 标记噪声点为-1。这种方法的缺点是维度越高,精度就越低。你还需要做一些假设,例如估计 eps 的正确值,这可能是一个挑战。
3.4 One Class SVM算法
One Class SVM也是属于支持向量机大家族的,但是它和传统的基于监督学习的分类回归支持向量机不同,它是无监督学习的方法,也就是说,它不需要我们标记训练集的输出标签。
那么没有类别标签,我们如何寻找划分的超平面以及寻找支持向量呢?One Class SVM这个问题的解决思路有很多。这里只讲解一种特别的思路SVDD, 对于SVDD来说,我们期望所有不是异常的样本都是正类别,同时它采用一个超球体而不是一个超平面来做划分,该算法在特征空间中获得数据周围的球形边界,期望最小化这个超球体的体积,从而最小化异常点数据的影响。
假设产生的超球体参数为中心 o 和对应的超球体半径 r>0,超球体体积 V(r) 被最小化,中心 o 是支持向量的线性组合;跟传统SVM方法相似,可以要求所有训练数据点 xi 到中心的距离严格小于 r,但同时构造一个惩罚系数为 C 的松弛变量 ξi,优化问题如下所示:
和支持向量机系列类似的求解方法,在采用拉格朗日对偶求解之后,可以判断新的数据点 z 是否在类内,如果z到中心的距离小于或者等于半径r,则不是异常点,如果在超球体以外,则是异常点。
在sklearn中,我们可以用svm包里面的OneClassSVM来做异常点检测。OneClassSVM也支持核函数,所以普通SVM里面的调参思路在这里也适用。
3.5 Isolation Forest算法
Isolation Forest(以下简称IForest)是周志华老师的学生提出来的,主要是利用集成学习的思路来做异常点检测,目前几乎成为异常点检测算法的首选项,它是随机森林大家族的一员。
算法本身并不复杂,主要包括
- 第一步训练构建随机森林对应的多颗决策树,这些决策树一般叫iTree;
- 第二步计算需要检测的数据点x最终落在任意第t颗iTree的层数ht(x)。然后我们可以得出x在每棵树的高度平均值h(x)。
- 第三步根据h(x)判断x是否是异常点。
对于第一步构建决策树的过程,方法和普通的随机森林不同。
首先采样决策树的训练样本时,普通的随机森林要采样的样本个数等于训练集个数。但是iForest不需要采样这么多,一般来说,采样个数要远远小于训练集个数。原因是我们的目的是异常点检测,只需要部分的样本我们一般就可以将异常点区别出来了。
另外就是在做决策树分裂决策时,由于我们没有标记输出,所以没法计算基尼系数或者和方差之类的划分标准。这里我们使用的是随机选择划分特征,然后在基于这个特征再随机选择划分阈值,进行决策树的分裂。直到树的深度达到限定阈值或者样本数只剩一个。
第二步计算要检测的样本点在每棵树的高度平均值h(x)。首先需要遍历每一颗iTree,得到检测的数据点x最终落在任意第t颗iTree的数层数ht(x)。这个ht(x)代表的是树的深度,也就是离根节点越近,则ht(x)越小,越靠近底层,则ht(x)越大,根节点的高度为0.
第三步是据h(x)判断x是否是异常点。我们一般用下面的公式计算x的异常概率分值:
s(x,m)的取值范围是[0,1],取值越接近于1,则是异常点的概率也越大。其中,m为样本个数。c(m)的表达式为:
从s(x,m)表示式可以看出,如果高度h(x)→0, 则s(x,m)→1,即是异常点的概率是100%,如果高度h(x)→m−1, 则s(x,m)→0,即不可能是异常点。如果高度h(x)→c(m), 则s(x,m)→0.5,即是异常点的概率是50%,一般我们可以设置$s(x,m)的一个阈值然后去调参,这样大于阈值的才认为是异常点。
在sklearn中,我们可以用ensemble包里面的IsolationForest来做异常点检测。
IForest和One Class SVM的对比:
IForest目前是异常点检测最常用的算法之一,它的优点非常突出,它具有线性时间复杂度。因为是随机森林的方法,所以可以用在含有海量数据的数据集上面。通常树的数量越多,算法越稳定。由于每棵树都是互相独立生成的,因此可以部署在大规模分布式系统上来加速运算。对于目前大数据分析的趋势来说,它的好用是有原因的。
但是IForest也有一些缺点,比如不适用于特别高维的数据。由于每次切数据空间都是随机选取一个维度和该维度的随机一个特征,建完树后仍然有大量的维度没有被使用,导致算法可靠性降低。此时推荐降维后使用,或者考虑使用One Class SVM。
另外iForest仅对即全局稀疏点敏感,不擅长处理局部的相对稀疏点 ,这样在某些局部的异常点较多的时候检测可能不是很准。
而One Class SVM对于中小型的数据分析,尤其是训练样本不是特别海量的时候用起来经常会比iForest顺手,因此比较适合做原型分析。
3.6 Robust Random Cut Forest
Random Cut Forest (RCF) 算法是亚马逊用于异常检测的无监督算法。它也通过关联异常分数来工作。较低的分数值表示数据点是正常的,较高的分数值则表示数据中存在异常。
「低」和「高」的定义取决于应用,但一般实践表明,超过平均分三个标准差的分数被认为是异常的。算法的细节可以在论文《Robust Random Cut Forest Based Anomaly Detection On Streams》里找到。
这个算法的优点在于它可以处理非常高维的数据。它还可以处理实时流数据(内置 AWS Kinesis Analytics)和离线数据。
作者在下面的视频中更详细地解释了这个概念:https://youtu.be/yx1vf3uapX8
本文给出了与孤立森林相比的一些性能基准。本文的研究结果表明,RCF 比孤立森林更准确、更快速。
完整的代码可以在这里找到:
https://github.com/awslabs/amazon-sagemaker-examples/tree/master/introduction_to_amazon_algorithms/random_cut_forest
学会五种常用异常值检测方法,亡羊补牢不如积谷防饥:https://baijiahao.baidu.com/s?id=1638194148356686894&wfr=spider&for=pc
异常点检测算法小结:https://www.cnblogs.com/pinard/p/9314198.html
数据挖掘中常见的「异常检测」算法有哪些?:https://www.zhihu.com/question/280696035