离群点检测Outlier Detection

6 篇文章 0 订阅

http://www.dataivy.cn/blog/%E7%A6%BB%E7%BE%A4%E7%82%B9%E6%A3%80%E6%B5%8Boutlier-detection/

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

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

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

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


 

以下为代码输出结果:

  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]))


 


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

  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的使用场景相对广泛之外,其余的算法应用型比较局限。


离群(Outliers)是数据集中与其他数据显著不同的观测值。离群点检测(Outlier Detection)是指寻找这些离群的过程。在Python中,有多种方法可以进行离群点检测。 一种常用的方法是基于统计学的离群点检测方法,例如Z-Score方法或箱线图方法。Z-Score方法利用数据的标准偏差来判断数据是否为离群,一般将Z-Score大于某个阈值(例如3)的数据认为是离群。箱线图方法则利用数据的四分位数范围来判断离群,一般通过设定上下界来确定离群。 另一种方法是基于聚类的离群点检测方法,例如DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法。DBSCAN算法通过将数据划分为核心、边界和噪音,并通过密度连通性来确定离群。 还有一种流行的方法是基于机器学习的离群点检测方法,例如孤立森林(Isolation Forest)算法。孤立森林算法通过构建一棵随机的分割树来判断数据是否为离群,通过计算数据的路径长度来确定离群。 在Python中,可以使用一些库来实现这些离群点检测方法,如scikit-learn、statsmodels等。这些库提供了简便的API和丰富的功能,可以帮助我们进行离群点检测并进行进一步的分析和处理。 总而言之,在Python中进行离群点检测是一个相对简单且灵活的过程,可以根据具体需求选择适合的方法和库来进行处理。离群点检测对于数据分析和异常检测等领域具有重要的应用价值,并且在实际问题中有着广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值