【Python数据分析基础】: 异常值检测和处理

做者:xiaoyuhtml

微信公众号:Python数据科学python

知乎:python数据分析师算法


上一篇分享了关于数据缺失值处理的一些方法,连接以下: 【Python数据分析基础】: 数据缺失值处理

本篇继续分享数据清洗中的另外一个常见问题:异常值检测和处理。bash

1 什么是异常值?

在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,由于在通常的预测问题中,模型一般是对总体样本数据结构的一种表达方式,这种表达方式一般抓住的是总体样本通常性的性质,而那些在这些性质上表现彻底与总体样本不一致的点,咱们就称其为异常点,一般异常点在预测问题中是不受开发者欢迎的,由于预测问题通产关注的是总体样本的性质,而异常点的生成机制与总体样本彻底不一致,若是算法对异常点敏感,那么生成的模型并不能对总体样本有一个较好的表达,从而预测也会不许确。 从另外一方面来讲,异常点在某些场景下反而令分析者感到极大兴趣,如疾病预测,一般健康人的身体指标在某些维度上是类似,若是一我的的身体指标出现了异常,那么他的身体状况在某些方面确定发生了改变,固然这种改变并不必定是由疾病引发(一般被称为噪音点),但异常的发生和检测是疾病预测一个重要起始点。类似的场景也能够应用到信用欺诈,网络攻击等等。微信

2 异常值的检测方法

通常异常值的检测方法有基于统计的方法,基于聚类的方法,以及一些专门检测异常值的方法等,下面对这些方法进行相关的介绍。网络

1. 简单统计

若是使用pandas,咱们能够直接使用describe()来观察数据的统计性描述(只是粗略的观察一些统计量),不过统计数据为连续型的,以下:数据结构

df.describe()
复制代码

或者简单使用散点图也能很清晰的观察到异常值的存在。以下所示:机器学习

2. 3∂原则

这个原则有个条件:数据须要服从正态分布。在3∂原则下,异常值如超过3倍标准差,那么能够将其视为异常值。正负3∂的几率是99.7%,那么距离平均值3∂以外的值出现的几率为P(|x-u| > 3∂) <= 0.003,属于极个别的小几率事件。若是数据不服从正态分布,也能够用远离平均值的多少倍标准差来描述。学习

红色箭头所指就是异常值。大数据

3. 箱型图

这种方法是利用箱型图的四分位距(IQR)对异常值进行检测,也叫Tukey‘s test。箱型图的定义以下:

四分位距(IQR)就是上四分位与下四分位的差值。而咱们经过IQR的1.5倍为标准,规定:超过上四分位+1.5倍IQR距离,或者下四分位-1.5倍IQR距离的点为异常值。下面是Python中的代码实现,主要使用了numpypercentile方法。

Percentile = np.percentile(df['length'],[0,25,50,75,100])
IQR = Percentile[3] - Percentile[1]
UpLimit = Percentile[3]+ageIQR*1.5
DownLimit = Percentile[1]-ageIQR*1.5
复制代码

也可使用seaborn的可视化方法boxplot来实现:

f,ax=plt.subplots(figsize=(10,8))
sns.boxplot(y='length',data=df,ax=ax)
plt.show()
复制代码

红色箭头所指就是异常值。

以上是经常使用到的判断异常值的简单方法。下面来介绍一些较为复杂的检测异常值算法,因为涉及内容较多,仅介绍核心思想,感兴趣的朋友可自行深刻研究。

4. 基于模型检测

这种方法通常会构建一个几率分布模型,并计算对象符合该模型的几率,把具备低几率的对象视为异常点。若是模型是簇的集合,则异常是不显著属于任何簇的对象;若是模型是回归时,异常是相对远离预测值的对象。

离群点的几率定义:离群点是一个对象,关于数据的几率分布模型,它具备低几率。这种状况的前提是必须知道数据集服从什么分布,若是估计错误就形成了重尾分布。

好比特征工程中的RobustScaler方法,在作数据特征值缩放的时候,它会利用数据特征的分位数分布,将数据根据分位数划分为多段,只取中间段来作缩放,好比只取25%分位数到75%分位数的数据作缩放。这样减少了异常数据的影响。

优缺点:(1)有坚实的统计学理论基础,当存在充分的数据和所用的检验类型的知识时,这些检验可能很是有效;(2)对于多元数据,可用的选择少一些,而且对于高维数据,这些检测可能性不好。

5. 基于近邻度的离群点检测

统计方法是利用数据的分布来观察异常值,一些方法甚至须要一些分布条件,而在实际中数据的分布很难达到一些假设条件,在使用上有必定的局限性。

肯定数据集的有意义的邻近性度量比肯定它的统计分布更容易。这种方法比统计学方法更通常、更容易使用,由于一个对象的离群点得分由到它的k-最近邻(KNN)的距离给定。

须要注意的是:离群点得分对k的取值高度敏感。若是k过小,则少许的邻近离群点可能致使较低的离群点得分;若是K太大,则点数少于k的簇中全部的对象可能都成了离群点。为了使该方案对于k的选取更具备鲁棒性,可使用k个最近邻的平均距离。

优缺点:(1)简单;(2)缺点:基于邻近度的方法须要O(m2)时间,大数据集不适用;(3)该方法对参数的选择也是敏感的;(4)不能处理具备不一样密度区域的数据集,由于它使用全局阈值,不能考虑这种密度的变化。

5. 基于密度的离群点检测

从基于密度的观点来讲,离群点是在低密度区域中的对象。基于密度的离群点检测与基于邻近度的离群点检测密切相关,由于密度一般用邻近度定义。一种经常使用的定义密度的方法是,定义密度为到k个最近邻的平均距离的倒数。若是该距离小,则密度高,反之亦然。另外一种密度定义是使用DBSCAN聚类算法使用的密度定义,即一个对象周围的密度等于该对象指定距离d内对象的个数。

优缺点:(1)给出了对象是离群点的定量度量,而且即便数据具备不一样的区域也可以很好的处理;(2)与基于距离的方法同样,这些方法必然具备O(m2)的时间复杂度。对于低维数据使用特定的数据结构能够达到O(mlogm);(3)参数选择是困难的。虽然LOF算法经过观察不一样的k值,而后取得最大离群点得分来处理该问题,可是,仍然须要选择这些值的上下界。

6. 基于聚类的方法来作异常点检测

基于聚类的离群点:一个对象是基于聚类的离群点,若是该对象不强属于任何簇,那么该对象属于离群点。

离群点对初始聚类的影响:若是经过聚类检测离群点,则因为离群点影响聚类,存在一个问题:结构是否有效。这也是k-means算法的缺点,对离群点敏感。为了处理该问题,可使用以下方法:对象聚类,删除离群点,对象再次聚类(这个不能保证产生最优结果)。

优缺点:(1)基于线性和接近线性复杂度(k均值)的聚类技术来发现离群点多是高度有效的;(2)簇的定义一般是离群点的补,所以可能同时发现簇和离群点;(3)产生的离群点集和它们的得分可能很是依赖所用的簇的个数和数据中离群点的存在性;(4)聚类算法产生的簇的质量对该算法产生的离群点的质量影响很是大。

7. 专门的离群点检测

其实以上说到聚类方法的本意是是无监督分类,并非为了寻找离群点的,只是刚好它的功能能够实现离群点的检测,算是一个衍生的功能。

除了以上说起的方法,还有两个专门用于检测异常点的方法比较经常使用:One Class SVMIsolation Forest,详细内容不进行深刻研究。

3 异常值的处理方法

检测到了异常值,咱们须要对其进行必定的处理。而通常异常值的处理方法可大体分为如下几种:

  • 删除含有异常值的记录:直接将含有异常值的记录删除;
  • 视为缺失值:将异常值视为缺失值,利用缺失值处理的方法进行处理;
  • 平均值修正:可用先后两个观测值的平均值修正该异常值;
  • 不处理:直接在具备异常值的数据集上进行数据挖掘;

是否要删除异常值可根据实际状况考虑。由于一些模型对异常值不很敏感,即便有异常值也不影响模型效果,可是一些模型好比逻辑回归LR对异常值很敏感,若是不进行处理,可能会出现过拟合等很是差的效果。

4 异常值总结

以上是对异常值检测和处理方法的汇总。

经过一些检测方法咱们能够找到异常值,但所得结果并非绝对正确的,具体状况还需本身根据业务的理解加以判断。一样,对于异常值如何处理,是该删除,修正,仍是不处理也需结合实际状况考虑,没有固定的。

参考:

https://zhuanlan.zhihu.com/p/33665409 http://www.cnblogs.com/pinard/p/9314198.html https://blog.csdn.net/u013719780/article/details/48901183 http://www.cnblogs.com/charlotte77/p/5606926.html

《Python数据分析与挖掘实战》

关注微信公众号: Python数据科学,发现更多精彩内容。