机器学习&数据挖掘

离群点检测Outlier Detection

Author
宋天龙
发布于 2015-05-11
3493 次阅读
0 次赞
0 次分享
离群点检测Outlier Detection
AI 智能核心导读

离群点检测的核心在于其训练集已包含异常值。在Sklearn中,EllipticEnvelope常用于高斯分布数据集的离群值检验。算法对比表明:高斯分布场景下协方差估计效果优于One-Class SVM,而非高斯分布场景下后者表现更佳。目前离群检测多依赖统计模型,除One-Class SVM适用性较广外,其余算法场景较为局限。

异常检测:离群点检测(Outlier Detection)

在《[新奇检测 Novelty Detection]》中,我们已经介绍了关于异常检测的基本理论、方法和基于 Python 算法 One-Class SVM 实现其中新奇检测的基本逻辑。本篇将介绍异常检测的另外一个核心主题——离群点检测

一、 离群点检测与新奇检测的区别

离群点检测是异常值检测的一种,其核心思路与新奇检测一致。二者最根本的区别在于:离群点检测的原始观测数据集中已经包含异常值,而新奇检测的训练集中则不包括异常值。

二、 基于 Sklearn 的 EllipticEnvelope 实现

以下是利用 Python 中 Sklearn 机器学习库的 EllipticEnvelope 实现对离群点检测的示例。

EllipticEnvelope 是 Sklearn 协方差估计中专门针对高斯分布数据集的离群值检验方法。需要注意的是,该方法在高维度下的表现效果欠佳

1. 代码实现

python
1import numpy as np 2from sklearn.covariance import EllipticEnvelope 3 4xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500)) 5 6# 生成训练数据 7X = 0.3 * np.random.randn(100, 2) 8X_train = np.r_[X + 2, X - 2] 9 10# 生成用于测试的新数据 11X = 0.3 * np.random.randn(10, 2) 12X_test = np.r_[X + 2, X - 2] 13 14# 模型拟合 15clf = EllipticEnvelope() 16clf.fit(X_train) 17y_pred_train = clf.predict(X_train) 18y_pred_test = clf.predict(X_test) 19 20print("novelty detection result:", y_pred_test)

以下为代码的输出结果:

code
1('novelty detection result:', array([ 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1]))

2. 可配置参数

在该函数中,核心的可配置参数如下:

python
1class sklearn.covariance.EmpiricalCovariance(store_precision=True, assume_centered=False)

三、 算法效果对比:协方差估计 vs One-Class SVM

对比 Python 的这两种异常值检测方法,其适用场景有着明显的差异:

  • 高斯分布场景:当数据集符合高斯分布时,基于鲁棒协方差估计的 EmpiricalCovariance 效果要优于 OneClassSVM 算法。
  • 非高斯分布场景:在非高斯分布情况下(例如数据集中包含两个核心),OneClassSVM 的应用效果则要好于 EmpiricalCovariance

不同数据集分布状态下的应用效果

以下是在三种不同数据集的分布状态下,二者的应用效果对比:

  1. 在高斯分布下EmpiricalCovariance 效果好于 OneClassSVM

    plot_outlier_detection_0011111
    plot_outlier_detection_0011111

  2. 在非高斯分布下OneClassSVM 效果好于 EmpiricalCovariance

    plot_outlier_detection_0021111
    plot_outlier_detection_0021111

  3. 在非高斯分布下OneClassSVM 效果好于 EmpiricalCovariance

    plot_outlier_detection_0031111
    plot_outlier_detection_0031111

四、 Sklearn 中的其他协方差估计算法

除了上述算法外,Python 的 Sklearn 机器学习库还提供了以下两种协方差估计算法:

  • EmpiricalCovariance:基于最大似然协方差估计的算法。
  • MinCovDet:基于最小协方差行列式(Minimum Covariance Determinant,简称 MCD)的算法,属于鲁棒协方差估计。

五、 总结

整体来看,离群值检测的方法目前还主要集中在基于统计模型的监测上,这种算法的应用局限性在文章《[新奇检测 Novelty Detection]》中已经提到。

Python 的 Sklearn 中对于异常检测的算法支持还不够丰富,除了 OneClassSVM 的使用场景相对广泛之外,其余算法的应用性都比较局限。

分享
最后修订: 2015-05-11