文章转自https://scikit-learn.org/stable/modules/outlier_detection.html#outlier-detection(英文的)
许多应用都需要决定一个新的观测值是否与现有观测值的相同分布(即确定是新观测值是 inlier 还是 outlier )。通常,这种方法被用来做数据清洗。有两种重要的区别:
离群点检测:
训练数据包括远离正常观测值的离群点,这时,离群点检测估计器忽略异常值,只对训练数据中的集中区域进行拟合。
新奇点检测:
训练数据没有被异常值污染,我们需要检测的是新的观测值是否属于异常值。这种情况下,离群点也可被称为新奇点。
离群点和新奇点检测都被应用于异常检测,检测异常或不寻常的观测值。离群点检测也被认为是无监督异常检测;新奇点检测也被认为是半监督异常检测。在离群点检测中,估计器假定离群点/异常值位于低密度区,不能形成致密的群集。相反,在新奇点检测中,只要离群点/异常值位于低密度区,就能形成致密群集,并被认为是正常的。
scikit-learn 项目提供了一组用于新奇点或离群点检测的机器学习工具。其策略是通过从数据中无监督地学习对象来实现的。
estimator.fit(X_train)
然后以预测 predict 的方法将新的观测值分为正常值或异常值:
estimator.predict(X_test)
正常值被标记为1,异常值标记为-1,预测方法是利用估计器的原始评分函数计算出一个阈值,评分函数由score_samples 生成,阈值由contamination参数控制。
decision_function方法也由评分函数定义,负值为异常点,非负值为正常点:
estimator.decision_function(X_test)
注意:当估计器用于离群点检测时,默认情况下neighbors.LocalOutlierFactor 不支持 predict
, decision_function
and score_samples ,只支持fit_predict方法。训练样本的异常值分数通过
negative_outlier_factor_
属性计算。
如果真的想将neighbors.LocalOutlierFactor用于新奇点检测,预测新的数据的标签或计算其异常得分,可以在拟合估计器之前将参数 novelty 设置为True。在这种情况下,fit_predict不可用。
警告: 用局部离群因子Local Outlier Factor进行新奇点检测
当参数 novelty 设置为True,只能在新的看不见的数据上使用 predict
, decision_function
and score_samples
而不是在训练样本上使用,否则会导致错误的结果。训练数据的异常得分总是通过 negative_outlier_factor_
属性设置。
neighbors.LocalOutlierFactor的表现总结如下表所示:
Method | Outlier detection | Novelty detection |
---|---|---|
fit_predict |
OK | Not available |
predict |
Not available | Use only on new data |
decision_function |
Not available | Use only on new data |
score_samples |
Use negative_outlier_factor_ |
Use only on new data |
2.7.1 离群点检测方法综述
对scikit-learn中离群点检测方法进行比较,局部离群因子 Local Outlier Factor (LOF) 不会显示 一个黑色的决策边界,因为用来做异常点检测时不会对新数据产生预测值。
ensemble.IsolationForest 和 neighbors.LocalOutlierFactor在这些数据上的效果相当好。众所周知,svm.OneClassSVM对离群点非常敏感,因此离群点检测效果并不是非常好。最后,covariance.EllipticEnvelope假设数据是高斯分布,学习一个椭圆。有关估计器的更多细节,请参考Comparing anomaly detection algorithms for outlier detection on toy datasets以及下面的部分。
2.7.2. 新奇点检测
假设一个数据集有 个特征,个观测点,在该数据集上增加一个点,那么这个点是是否与其他观测点不同?我们可以换衣它是规则的吗?(或者说它来自同一分布吗?)或者相反地,它是不是与其他数据很相似而我们无法分辨。这就是新奇点检测工具和方法要解决的问题。
一般来说,要学习一个粗略的封闭的边界来划定初始分布的轮廓,并在内嵌的 维空间中画出。如果进一步的观测值落在边界界定的子空间内,则认为它来自与初始观测值相同的分布。而如果它在边界外,我们就可以以一定的自信评估说它们是异常的。
One-Class SVM由Schölkopf 等人引入,在Support Vector Machines模块中实现了sklearn.svm.OneClassSVM对象,用于新奇点检测。它需要选一个内核和一个标量参数来定义边界。虽然还没有确切的公式或算法来设置其带宽,RBF核经常被使用。这是 scikit-learn实现中的默认值。参数,也称为One-Class SVM的边界对应于在边界外找到一个新的规则的观测点的概率。
参考文献:
- Estimating the support of a high-dimensional distribution Schölkopf, Bernhard, et al. Neural computation 13.7 (2001): 1443-1471.
实例:
Examples:
- See One-class SVM with non-linear kernel (RBF) for visualizing the frontier learned around some data by a
svm.OneClassSVM
object. - Species distribution modeling
2.7.3. 离群点检测
离群点检测类似于新奇点检测,其目标是将常规观测的核心与一些污染的观测点(称为离群点)分离。然而,对于离群点检测,我们没有干净的数据集来表示可用于训练任何工具的常规观测总体。
2.7.3.1. Fitting an elliptic envelope 椭圆包络拟合
执行离群点检测的一种常见方法是假设规则数据来自已知分布(例如,数据是高斯分布)。从这个假设出发,我们通常试图定义数据的“形状”,并且可以将离群观测定义为离拟合形状足够远的观测值。
scikit-learn提供一个对象covariance.EllipticEnvelope ,该对象适用于数据的鲁棒协方差估计,因此可以将椭圆拟合到中心数据点,忽略中心模式之外的点。
例如,假设初始数据是高斯分布的,它将以鲁棒的方式(即,不受异常值的影响)估计初始位置和协方差。从这个估计得到的马氏距离用来推导出一个充分性的度量。该策略如下所示。
实例:
- See Robust covariance estimation and Mahalanobis distances relevance for an illustration of the difference between using a standard (
covariance.EmpiricalCovariance
) or a robust estimate (covariance.MinCovDet
) of location and covariance to assess the degree of outlyingness of an observation.
参考文献:
- Rousseeuw, P.J., Van Driessen, K. “A fast algorithm for the minimum covariance determinant estimator” Technometrics 41(3), 212 (1999)
2.7.3.2.隔离森林
在高维数据集中执行离群点检测的一种有效方法是使用随机森林。ensemble.IsolationForest
通过随机选择一个特征,然后在所选特征的最大值和最小值之间随机选择一个分割值,从而“隔离”观测值。
由于递归分区可以由树结构来表示,所以隔离样本所需的分裂数量等于从根节点到终止节点的路径长度。
这种路径长度,平均在这样的随机树的森林,是一个度量的正常和我们的决策函数。
随机划分产生明显更短的异常路径。因此,当随机树木的森林为特定样本产生较短的路径长度,他们很可能是异常。
该策略如下所示。
:---------:
示例:
- See IsolationForest example for an illustration of the use of IsolationForest.
- See Comparing anomaly detection algorithms for outlier detection on toy datasets for a comparison of
ensemble.IsolationForest
withneighbors.LocalOutlierFactor
,svm.OneClassSVM
(tuned to perform like an outlier detection method) and a covariance-based outlier detection withcovariance.EllipticEnvelope
.
参考文献:
- Liu, Fei Tony, Ting, Kai Ming and Zhou, Zhi-Hua. “Isolation forest.” Data Mining, 2008. ICDM‘08. Eighth IEEE International Conference on.
2.7.3.3. Local Outlier Factor 局部异常因子
在中等高维数据集上执行异常检测的另一种有效方法是使用局部异常因子(LOF)算法。
LocalOutlierFactor(LOF)算法计算反映观测异常程度的得分(称为局部异常因子)。它测量给定的数据点相对于它的邻居的局部密度偏差。其想法是检测具有比它们的邻居低得多的密度的样本。
在实践中,从k近邻得到局部密度。观测的LOF分数等于其k个最近邻的平均局部密度与其自身局部密度的比率:正常实例预期具有与其邻居类似的局部密度,而异常数据预期具有更小的局部密度。
所考虑的邻居的数量k(参数n_neighbors)通常按以下规则选择:1)大于集群必须包含的对象的最小数量,以便其他对象可以是相对于该集群的本地离群值。2)小于可能为局部离群值的对象所接近的最大数量。在实践中,这样的信息通常是不可用的,一般采取n_neighbors=20效果比较好。当异常值的比例高时(即大于10%),n_neighbors应该更大(在下面的示例中n_neighbors=35)。
LOF算法的优点在于,它同时考虑了数据集的局部和全局特性:即使在异常样本具有不同底层密度的数据集中,它也可以表现得很好。问题不是样本有多孤立,而是相对于周围的邻居是多么的孤立。
在应用LOF进行离群点检测时,没有predict
, decision_function
和 score_samples
方法,只有fit_predict方法。训练样本的异常分数可通过negative_outlier_factor_
属性来获得。注意,当LOF用于新奇点检测时,即当参数novelty被设置为True时, predict
, decision_function
和 score_samples
可用于新的不可见数据。参见Novelty detection with Local Outlier Factor。
该策略如下所示。
示例:
- See Outlier detection with Local Outlier Factor (LOF) for an illustration of the use of
neighbors.LocalOutlierFactor
. - See Comparing anomaly detection algorithms for outlier detection on toy datasets for a comparison with other anomaly detection methods.
参考文献:
- Breunig, Kriegel, Ng, and Sander (2000) LOF: identifying density-based local outliers. Proc. ACM SIGMOD
2.7.4. Novelty detection with Local Outlier Factor 用局部离群因子进行新奇点检
neighbors.LocalOutlierFactor
用于新奇点检测,也就是预测新的不可见数据的标签或计算其异常得分,在拟合估计器前需要将参数novelty
设为 True
以实例化估计器:
lof = LocalOutlierFactor(novelty=True)
lof.fit(X_train)
如果 fit_predict 不可用:
警告: 用局部离群因子Local Outlier Factor进行新奇点检测
当参数 novelty 设置为True,只能在新的看不见的数据上使用 predict
, decision_function
and score_samples
而不是在训练样本上使用,否则会导致错误的结果。训练数据的异常得分总是通过 negative_outlier_factor_
属性设置。
下面描述了具有局部离群因子的新奇点检测。