离群点检测Outlier Detection


目录:

    在《[新奇检测NoveltyDetection]》我们已经介绍了关于异常检测的基本理论、方法和基于python算法one-class SVM实现其中新奇检测的基本逻辑。本篇介绍异常检测的另外一个主题——离群点检测。

    离群点检测是异常值检测的一种,其思路与新奇检测一致;区别在于离群点检测的原始观测数据集中已经包含异常值,而新奇检测则不包括。

    以下是利用Python中SKlearn机器学习库的EllipticEnvelope实现对离群点的检测。EllipticEnvelope是Sklearn协方差估计中对高斯分布数据集的离群值检验方法,且该方法在高维度下的表现效果欠佳。

    import numpy as np
    from sklearn.covariance import EllipticEnvelope
    xx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))
    # 生成训练数据 
    X = 0.3 * np.random.randn(100, 2)
    X_train = np.r_[X+2, X-2]
    # 生成新用于测试的数据 
    X = 0.3 * np.random.randn(10, 2)
    X_test = np.r_[X + 2, X - 2]
    # 模型拟合 
    clf = EllipticEnvelope()
    clf.fit(X_train)
    y_pred_train = clf.predict(X_train)
    y_pred_test = clf.predict(X_test)
    print ("novelty detection result:",y_pred_test)
    

    以下为代码输出结果:

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

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

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

    对比Python的这两种异常值检测方法,当数据集在高斯分布下时,基于鲁棒协方差估计的EmpiricalCovariance效果要好于OneClassSVM算法;但在非高斯分布情况下,OneClassSVM的应用效果要好于EmpiricalCovariance(例如数据集中包含两个核心)。

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

    在高斯分布下,EmpiricalCovariance效果好于OneClassSVM。

    plot_outlier_detection_0011111

    在非高斯分布下,OneClassSVM效果好于EmpiricalCovariance。

    plot_outlier_detection_0021111

    在非高斯分布下,OneClassSVM效果好于EmpiricalCovariance。

    plot_outlier_detection_0031111

    除了上述算法外,Python 的Sklearn机器学习库还提供了EmpiricalCovariance和MinCovDet两种算法。EmpiricalCovariance是基于最大似然协方差估计的算法。MinCovDet是基于最小协方差行列式(Minimum Covariance Determinant,简称MCD)的算法,是鲁棒协方差估计。


    尾巴

    但整体来看,离群值检测的方法还主要集中在基于统计模型的监测上,这种算法的应用局限性在文章《[新奇检测Novelty Detection]》中已经提到。Python 的SKlearn中对于异常检测的算法支持不够丰富,而且其中除了OneClassSVM的使用场景相对广泛之外,其余的算法应用型比较局限。