中文文档: http://sklearn.apachecn.org/cn/stable/modules/outlier_detection.html
英文文档: http://sklearn.apachecn.org/en/stable/modules/outlier_detection.html
官方文档: http://scikit-learn.org/stable/
GitHub: https://github.com/apachecn/scikit-learn-doc-zh(觉得不错麻烦给个 Star,我们一直在努力)
贡献者: https://github.com/apachecn/scikit-learn-doc-zh#贡献者
关于我们: http://www.apachecn.org/organization/209.html
2.11. 新异类和异常值检测
许多应用需要能够判断新观测是否属于与现有观测相同的分布(它是一个非线性的),或者应该被认为是不同的(这是一个异常值)。 通常,这种能力用于清理实际的数据集。 必须做出两个重要的区别:
新奇检测: | 训练数据不被异常值污染,我们有兴趣检测新观察中的异常情况。 |
---|---|
离群点检测: | 训练数据包含异常值,我们需要适应训练数据的中心模式,忽略偏差观测值。 |
scikit-learn项目提供了一套可用于新奇和离群点检测的机器学习工具。 该策略是通过数据从无监督的方式学习的对象来实现的:
estimator.fit(X_train)
然后可以使用 predict 方法将新观察值作为内在值或异常值排序:
estimator.predict(X_test)
正常被标记为1,而异常值被标记为-1。
2.11.1. 新奇检测
从 个特征描述的相同分布考虑
个观察值的数据集。 现在考虑,我们再添加一个观察数据集。 新的观察与其他观察是不同的,我们可以怀疑它是正常的吗? (即是否来自相同的分配?)或者相反,是否与另一个相似,我们无法将其与原始观察结果区分开来? 这是新奇检测工具和方法所解决的问题。
一般来说,它将要学习一个粗略且紧密的边界,界定初始观测分布的轮廓,绘制在嵌入的 维空间中。 那么,如果进一步的观察在边界划分的子空间内,则它们被认为来自与初始观察相同的群体。 否则,如果他们在边界之外,我们可以说他们是异常的,对我们的评估有一定的信心。
One-Class SVM 已经由Schölkopf等人采用。 为此目的并在 支持向量机 模块的 svm.OneClassSVM
对象中实现。 需要选择kernel和scalar参数来定义边界。 通常选择RBF内核,尽管没有确切的公式或算法来设置其带宽参数。 这是scikit-learn实现中的默认值。 参数,也称为一级SVM的边距,对应于在边界之外找到新的但常规的观察的概率。
参考文献:
- Estimating the support of a high-dimensional distribution Schölkopf, Bernhard, et al. Neural computation 13.7 (2001): 1443-1471.
例子:
- 参见 One-class SVM with non-linear kernel (RBF) 用于通过
svm.OneClassSVM
对象可视化围绕某些数据学习的边界。
2.11.2. 离群点检测
离群点检测类似于新奇检测,其目的是将正常观察的核心与一些被称为“离群点”的污染物进行分离。 然而,在异常值检测的情况下,我们没有一个干净的数据集代表可用于训练任何工具的常规观察值的群体。
2.11.2.1. 椭圆模型适配
执行异常值检测的一种常见方式是假设常规数据来自已知分布(例如,数据是高斯分布的)。 从这个假设来看,我们通常试图定义数据的“形状”,并且可以将离散观察值定义为足够远离拟合形状的观测值。
scikit-learn提供了一个对象 covariance.EllipticEnvelope
,它适合于对数据的鲁棒协方差估计,从而将椭圆适配到中央数据点,忽略中央模式之外的点。
例如,假设异构数据是高斯分布的,它将以鲁棒的方式(即不受异常值的影响)来估计非线性位置和协方差。 从该估计得到的马氏距离距离用于得出偏离度量。 这个策略如下图所示。
例子:
- 参见 Robust covariance estimation and Mahalanobis distances relevance 说明使用标准 (
covariance.EmpiricalCovariance
) 或稳健估计 (covariance.MinCovDet
) 的位置和协方差来评估观察的偏离程度的差异。
参考文献:
- Rousseeuw, P.J., Van Driessen, K. “A fast algorithm for the minimum covariance determinant estimator” Technometrics 41(3), 212 (1999)
2.11.2.2. Isolation Forest
在高维数据集中执行异常值检测的一种有效方法是使用随机森林。
ensemble.IsolationForest
通过随机选择特征然后随机选择所选特征的最大值和最小值之间的分割值来隔离观察值。
由于递归分区可以由树结构表示,因此隔离样本所需的分裂次数等同于从根节点到终止节点的路径长度。
在这样的随机树的森林中平均的这个路径长度是正态性和我们的决策功能的量度。
随机分区产生明显较短的异常路径。 因此,当一个随机树林共同为特定样本产生较短的路径长度时,它们很有可能是异常的。
这个策略如下图所示。
例子:
- 参见 IsolationForest example 说明IsolationForest的用法。
- 参见 Outlier detection with several methods. 将
ensemble.IsolationForest
与neighbors.LocalOutlierFactor
,svm.OneClassSVM
(调整为执行类似异常值检测方法)和基于协方差的异常值检测与协方差的covariance.EllipticEnvelope
.
参考文献:
- Liu, Fei Tony, Ting, Kai Ming and Zhou, Zhi-Hua. “Isolation forest.” Data Mining, 2008. ICDM‘08. Eighth IEEE International Conference on.
2.11.2.3. 局部离群因子(LOF)
对中等高维数据集执行异常值检测的另一种有效方法是使用局部离群因子(LOF)算法。
neighbors.LocalOutlierFactor
(LOF)算法计算反映观测值异常程度的分数(称为局部离群因子)。 它测量给定数据点相对于其邻居的局部密度偏差。 这个想法是检测具有比其邻居明显更低密度的样品。
实际上,从k个最近的邻居获得局部密度。 观察的LOF得分等于他的k-最近邻居的平均局部密度与其本身密度的比值:正常情况预期具有与其邻居类似的局部密度,而异常数据 预计本地密度要小得多。
考虑的邻居数(k个别名参数n_neighbors)通常选择1)大于集群必须包含的对象的最小数量,以便其他对象可以是相对于该集群的本地异常值,并且2)小于最大值 靠近可能是本地异常值的对象的数量。 在实践中,这样的信息通常不可用,并且n_neighbors = 20似乎总体上很好地工作。 当异常值的比例高(即大于10%时,如下面的例子),n邻居应该更大(在下面的例子中,n_neighbors = 35)。
LOF算法的优点是考虑到数据集的局部和全局属性:即使在异常样本具有不同基础密度的数据集中,它也能够很好地执行。 问题不在于,样本是如何孤立的,而是与周边邻里有多孤立。
这个策略如下图所示。
例子:
- 参见 Anomaly detection with Local Outlier Factor (LOF),
neighbors.LocalOutlierFactor
使用说明。 - 参见 Outlier detection with several methods., 与其他异常检测方法进行比较。
参考文献:
- Breunig, Kriegel, Ng, and Sander (2000) LOF: identifying density-based local outliers. Proc. ACM SIGMOD
2.11.2.4. One-class SVM 与 Elliptic Envelope 与 Isolation Forest 与 LOF
严格来说,One-class SVM 不是异常检测方法,而是一种新颖性检测方法:其训练集不应该被异常值污染,因为它可能适合它们。 也就是说,高维度的异常值检测或对内容数据的分布没有任何假设是非常具有挑战性的, One-class SVM 在这些情况下给出了有用的结果。
下面的例子说明了当数据越来越少的单峰时, covariance.EllipticEnvelope
如何降低。 svm.OneClassSVM
在具有多种模式和 ensemble.IsolationForest
和 neighbors.LocalOutlierFactor
的数据在每种情况下表现良好。
对于以和well-centered的非线性模式,svm.OneClassSVM 不能受益于inlier群体的旋转对称性。 此外,它适合训练集中存在的异常值。 相反,基于拟合协方差的covariance.EllipticEnvelope 学习一个椭圆,这适合于inlier分布。ensemble.IsolationForest 和 neighbors.LocalOutlierFactor 表现也好。 | ![]() |
由于inlier分布变为双峰,所以covariance.EllipticEnvelope 不适合内部值。 但是,我们可以看到ensemble.IsolationForest ,svm.OneClassSVM 和 neighbors.LocalOutlierFactor 在检测这两种模式时遇到困难,而且 svm.OneClassSVM 往往会过度复杂:因为它没有 内在模型,它解释了一些区域,偶尔有一些异常值聚集在一起,作为内在的。 | ![]() |
如果inlier分布非常高斯,则 svm.OneClassSVM ensemble.IsolationForest 和 neighbors.LocalOutlierFactor 一样 能够恢复合理的近似, 而 covariance.EllipticEnvelope 完全失败。 | ![]() |
例子:
- 参见 Outlier detection with several methods. ,
svm.OneClassSVM
(调整为执行异常检测方法),ensemble.IsolationForest
,neighbors.LocalOutlierFactor
和基于协方差的异常值检测协方差的covariance.EllipticEnvelope
.
中文文档: http://sklearn.apachecn.org/cn/stable/modules/outlier_detection.html
英文文档: http://sklearn.apachecn.org/en/stable/modules/outlier_detection.html
官方文档: http://scikit-learn.org/stable/
GitHub: https://github.com/apachecn/scikit-learn-doc-zh(觉得不错麻烦给个 Star,我们一直在努力)
贡献者: https://github.com/apachecn/scikit-learn-doc-zh#贡献者
关于我们: http://www.apachecn.org/organization/209.html
有兴趣的们也可以和我们一起来维护,持续更新中 。。。
机器学习交流群: 629470233