精华内容
下载资源
问答
  • java 异常及解决方法 1.BindException: Address already in use 解决方法 在网络编程中特别是在短时间内 new 的网络连接太多经常出现 .BindException: Address already in use: JVM_Bind 的异常网络有很多介绍此异常...
  • 异常值是属于数据集的概率小于 5% 的数据点。 该方法是经验性的,基于模拟 Pearson 分布的 95% 分位数,其中零偏斜和峰度从 1.8(均匀分布)到 6(拉普拉斯分布)变化。 模拟结果与数据点的数量和数据集的峰度呈...
  • Python数据分析基础: 异常值检测和处理

    千次阅读 多人点赞 2020-10-31 22:05:31
    本篇继续分享数据清洗中的另一个常见问题:异常值检测和处理。 1 什么是异常值? 在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本...

    作者:东哥起飞

    公众号:Python数据科学



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

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

    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数据科学,欢迎关注。
    数据科学网站:datadeepin

    展开全文
  • 离群检测样本 查找财务数据中的异常值
  • 数据分析--异常值处理

    千次阅读 2020-10-04 18:19:35
    1 什么是异常值? 模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些在这些性质上表现完全与整体样本不一致的点,我们就称其为异常点 异常点在某些场景下极为...

    参考资料:

    机器学习中的异常值检测和处理
    学会五种常用异常值检测方法,亡羊补牢不如积谷防饥 - 机器之心的文章 - 知乎

    1 什么是异常值?

    1. 模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些在这些性质上表现完全与整体样本不一致的点,我们就称其为异常点

    2. 异常点在某些场景下极为重要,如疾病预测,通常健康人的身体指标在某些维度上是相似,如果一个人的身体指标出现了异常,那么他的身体情况在某些方面肯定发生了改变,当然这种改变并不一定是由疾病引起(通常被称为噪音点),但异常的发生和检测是疾病预测一个重要起始点。相似的场景也可以应用到信用欺诈,网络攻击等等。

    2 异常值的检测方法

    1. 简单统计

    • 直接观察整体数据,使用pandas.describe()观察数据的统计描述(统计数据应当为连续性)
    • 简单使用散点图,从图中即可看出

    在这里插入图片描述

    2. 3 σ \sigma σ原则

    前提条件:数据分布需要服从正态分布或者近似正态分布
    这个是根据正态分布的性质而得出的方法

    在这里插入图片描述

    一个正态分布的横轴区间 ( μ − 3 σ , μ + 3 σ ) (\mu-3\sigma,\mu+3\sigma) μ3σ,μ+3σ)内的面积为99.730020%。
    若是不服从正态分布,可以使用原理 n n n倍标准差来描述,具体 n n n由应用场景确定

    算法实现

    
    import numpy as np
    import matplotlib.pyplot as plt
    seed(1)
    anomalies = []
    
    # multiply and add by random numbers to get some real values
    data = np.random.randn(50000)  * 20 + 20
    
    # Function to Detection Outlier on one-dimentional datasets.
    def find_anomalies(random_data):
        # Set upper and lower limit to 3 standard deviation
        random_data_std = std(random_data)
        random_data_mean = mean(random_data)
        anomaly_cut_off = random_data_std * 3
    
        lower_limit  = random_data_mean - anomaly_cut_off 
        upper_limit = random_data_mean + anomaly_cut_off
        print(lower_limit)
        # Generate outliers
        for outlier in random_data:
            if outlier > upper_limit or outlier < lower_limit:
                anomalies.append(outlier)
        return anomalies
    
    find_anomalies(data)
    

    3.箱型图

    使用箱型图的四方位居(IQR)对异常进行检测,也叫Tukey`s test

    举例:

    #计算df中某列的25%分位,下分位
    Q1 =  np.percentile(df[col], 25)
    #计算df中某列的75%分位,上分位
    Q2 = np.percentile(df[col], 75)
    IQR = Q2-Q1
    

    一般使用IQR的 1.5 1.5 1.5倍为标准:

    • 值大于上四分位+1.5*IQR为异常值
    • 值小于"下四分位-1.5*IQR"为异常值


    在这里插入图片描述

    举例:

    这只是举例检测异常的一个函数
    
    
    def detect_outliers(df,n,features):
        '''
            features:检测这个特征集然后检测特征集中某个特征是否含有异常值,将含有异常值的index记录下来
            若是某个index中(即某行)含有的异常值超过n个,就将其加入到outlier_indices
    
        '''
        outlier_indices=[]
        
        for col in features:
            # 1st quartile(25%)
            Q1 = np.percentile(df[col],25)
            #3rd quartile (75%)
            Q3 = np.percentile(df[col],75)
            # 四分位
            IQR = Q3-Q1
            
            #异常值范围
            outlier_step = 1.5*IQR
            
            outlier_list_col = df[(df[col]<Q1-outlier_step)|(df[col]>Q3 + outlier_step)].index
            
            outlier_indices.extend(outlier_list_col)
            
        outlier_indices = Counter(outlier_indices)
        multiple_outliers = list(k for k,v in outlier_indices.items() if v > n)
        
        return multiple_outliers
    
    

    使用seaborn中的boxplot或者boxenplot画图
    图上的菱形黑点就是异常值

    在这里插入图片描述

    4. 基于模型检测

    这种方法一般会构建一个概率分布模型,并计算对象符合该模型的概率,把具有低概率的对象视为异常点。

    • 如果模型是簇的集合,则异常是不显著属于任何簇的对象;
    • 如果模型是回归时,异常是相对远离预测值的对象。

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

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

    优缺点

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

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

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

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

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

    优缺点

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

    6. 基于密度的异常检测

    从基于密度的观点来说,离群点是在低密度区的对象。、

    基于密度的离群点检测与基于邻近度的离群点检测密切相关,因为密度通常用邻进度定义。

    • 一种常用的定义密度的方法是,定义密度为到k个最近邻的平均距离的倒数。如果该距离小,则密度高,反之亦然。
    • 另一种密度定义是使用DBSCAN聚类算法使用的密度定义,即一个对象周围的密度等于该对象指定距离 d d d内对象的个数。

    优缺点

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

    7.基于聚类的异常检测

    一个对象是基于聚类的离群点,如果该对象不属于任何簇,那么该对象属于离群点

    DBScan 是一种用于把数据聚成组的聚类算法。它同样也被用于单维或多维数据的基于密度的异常检测。其它聚类算法比如 k 均值和层次聚类也可用于检测离群点。

    核心点:在定义DBScan任务的超参数,第一个超参数是min_samples。这只是形成簇所需的最小核心点数量。第二个重要的超参数是eps。eps可以视为同一个簇中两个样本之间的最大距离

    边界点与核心点位于同一个簇中,但前者距离簇的中心要远得多
    在这里插入图片描述

    离群点对初始聚类的影响:

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

    优缺点

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

    8.专门的离群点检测

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

    除了以上提及的方法,还有两个专门用于检测异常点的方法比较常用:One Class SVM和Isolation Forest,详细内容不进行深入研究。

    9. 孤立森林

    https://blog.csdn.net/extremebingo/article/details/80108247

         ~~~~     孤立森林是一种无监督学习算法,属于组合决策树家族。这种方法和以上所有方法都不同。之前的所有方法都在试图寻找数据的常规区域,然后将任何在此定义区域之外的点都视为离群点或异常值。

         ~~~~     这种方法的工作方式不同。它明确地隔离异常值, 而不是通过给每个数据点分配一个分数来分析和构造正常的点和区域。它利用了这样一个事实:异常值只是少数,并且它们具有与正常实例非常不同的属性值。

         ~~~~     该算法适用于高维数据集,并且被证明是一种非常有效的异常检测方法。由于本文关注的是实现,而不是理论,因此作者不打算进一步讨论算法的工作原理。但是,周志华合著的论文《Isolation Forest》涵盖了其工作方式的全部细节。

    10.Robust Random Cut Forest

    Github地址

    Random Cut Forest (RCF) 算法是亚马逊用于异常检测的无监督算法。它也通过关联异常分数来工作。较低的分数值表示数据点点是正常的,较高的分数值则表示数据中存在异常。

    「低」和「高」的定义取决于应用,但一般实践表明,超过平均分三个标准差的分数被认为是异常的。
    算法的细节可以在论文《Robust Random Cut Forest Based Anomaly Detection On Streams》里找到。

    这个算法的优点在于它可以处理非常高维的数据。它还可以处理实时流数据(内置 AWS Kinesis Analytics)和离线数据

    作者在下面的视频中更详细地解释了这个概念https://youtu.be/yx1vf3uapX8

    本文给出了与孤立森林相比的一些性能基准。本文的研究结果表明,RCF 比孤立森林更准确、更快速。
    在这里插入图片描述

    3 异常值的处理方法

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

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

    展开全文
  • 如何从大量数据中找出异常值

    千次阅读 2018-11-08 08:30:59
    机器学习中数据预处理阶段,首先要考虑的就是将数据集中的异常值找出来,然后再做额外处理。当然,异常值的处理并不存在什么银弹,只能具体情况具体分析再根据效果选择处理方法。 直方图 看看数据集直方图也许能看出...

    前言

    机器学习中数据预处理阶段,首先要考虑的就是将数据集中的异常值找出来,然后再做额外处理。当然,异常值的处理并不存在什么银弹,只能具体情况具体分析再根据效果选择处理方法。

    直方图

    看看数据集直方图也许能看出点端倪,比如下面这个图,下方的是原始数据集,上面的是对应直方图,可以看到大多数都分布在11000左边,它的右边存在一些分布,这些分布极少的点很可能就是异常点。

    image

    sigma原则

    一些简单的场景可能直接使用某些准则就能找出异常值,比如3 sigma或5 sigma之类的。如下图,这里用3 sigma准则找到5个异常点。该过程主要计算出平均值mu和标准差sigma,然后再比较[mu-3*sigma,mu+3*sigma]

    image

    二次sigma处理

    如果直接使用sigma原则效果不好,也就是说可能有些没问题的点被识别成异常点,或者有些异常点没有被发现,那么这种情况下可以考虑用二次sigma处理。第一次使用n1 sigma,第二次n2 sigma。

    快速傅里叶变换

    如果是周期性的时序数据,假如原始信号包含了噪音,可以考虑用快速傅里叶变换找出异常点。

    假设有一个原始时序序列,现在对其添加高斯噪音,高斯噪音直方图为图中第二行,然后变成第三行带高斯噪音的时序序列,增加噪音后看起来相当混乱,所以我们进行傅里叶变换将其转换到频域看能否将噪音分离,计算时通过快速傅里叶变换加快运行。

    从频率响应能清楚看到最独特的两个点,对应的频率为5,知道频率后可以通过一定的带宽进行噪音分离,那么比如选择0.5,那么频率范围就是[4.5,5.5]。将噪音去除后,我们再通过傅里叶逆变换即能得到去除噪音后的时序信号。

    image

    中值方法

    类似的还有均值方法,但是均值有时会将差异平均掉了,效果没这么好,于是更多使用中值方法。它的主要思想是定义一个窗口大小,然后通过移动窗口不断将数值与窗口内的中值进行比较,该点与中值的距离如果超过指定的阈值,则说明这是一个异常点。下面是经过中值方法过滤前后。

    image

    其他方法

    可以使用马尔科夫链蒙特卡洛(MCMC)、高斯过程等等。

    github

    https://github.com/sea-boat/MachineLearning_Lab/blob/master/outliers

    -------------推荐阅读------------

    我的开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)

    为什么写《Tomcat内核设计剖析》

    我的2017文章汇总——机器学习篇

    我的2017文章汇总——Java及中间件

    我的2017文章汇总——深度学习篇

    我的2017文章汇总——JDK源码篇

    我的2017文章汇总——自然语言处理篇

    我的2017文章汇总——Java并发篇


    跟我交流,向我提问:

    欢迎关注:

    展开全文
  • 数据分析之异常值检测与处理

    千次阅读 多人点赞 2020-03-20 15:10:22
    (一)什么是异常值? 在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体...

    (一)什么是异常值?

    在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些在这些性质上表现完全与整体样本不一致的点,我们就称其为异常点,通常异常点在预测问题中是不受开发者欢迎的,因为预测问题通产关注的是整体样本的性质,而异常点的生成机制与整体样本完全不一致,如果算法对异常点敏感,那么生成的模型并不能对整体样本有一个较好的表达,从而预测也会不准确。

    从另一方面来说,异常点在某些场景下反而令分析者感到极大兴趣,如疾病预测,通常健康人的身体指标在某些维度上是相似,如果一个人的身体指标出现了异常,那么他的身体情况在某些方面肯定发生了改变,当然这种改变并不一定是由疾病引起(通常被称为噪音点),但异常的发生和检测是疾病预测一个重要起始点。相似的场景也可以应用到信用欺诈,网络攻击等等。

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

    1. 简单统计

    如果使用pandas,我们可以直接使用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中的代码实现,主要使用了numpy的percentile方法。

    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)不能处理具有不同密度区域的数据集,因为它使用全局阈值,不能考虑这种密度的变化。

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

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

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

    7. 基于聚类的方法来做异常点检测

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

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

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

    8. 专门的离群点检测

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

    除了以上提及的方法,还有两个专门用于检测异常点的方法比较常用:One Class SVM和Isolation Forest,详细内容不进行深入研究。

    (三)异常值的处理方法
    检测到了异常值,我们需要对其进行一定的处理。而一般异常值的处理方法可大致分为以下几种:

    • 删除含有异常值的记录:直接将含有异常值的记录删除;视为缺失值:将异常值视为缺失值,利用缺失值处理的方法进行处理;平均值修正:可用前后两个观测值的平均值修正该异常值;不处理:直接在具有异常值的数据集上进行数据挖掘;
    • 是否要删除异常值可根据实际情况考虑。因为一些模型对异常值不很敏感,即使有异常值也不影响模型效果,但是一些模型比如逻辑回归LR对异常值很敏感,如果不进行处理,可能会出现过拟合等非常差的效果。
    展开全文
  • Python数据清洗--异常值识别与处理01

    千次阅读 2020-12-29 00:40:30
    前言在《Python数据清洗--类型转换和冗余数据删除》和《Python数据清洗--缺失值识别与处理》文中已经讲解了有关数据中重复观测和缺失值的识别与处理,在本节中将分享异常值的判断和处理方法。异常值也称为离群点,...
  • 【代码模版】数据异常值处理

    千次阅读 2020-03-04 19:29:35
    异常值的处理需要考虑业务情景,不同的业务情景对异常值的定义及处理...显示某个连续型特征标准分的绝对值是大于3的数据信息(一般认为是异常值) # create std_score std_score = (DataFrame['column_name'] - Data...
  • 文章目录根据年龄和工资回归删除年龄和工资中的异常值根据工资和奖金处理数据集可视化工资和奖金数据集找出工资和奖金的异常值删除异常值后重新可视化工资和奖金数据 安然数据集——回归和异常值处理 以下代码是在...
  • Python机器学习:异常值查找和处理

    千次阅读 2020-12-04 21:23:19
    再一次的通过写文章的方式...由于目前学习到的3种算法(线性回归、逻辑回归、随机森林),所以还是处理异常值处理异常值可以像处理缺失值的方法一样:删除或用特殊值代替如何查找到异常值?查看数据的描述统计信息d...
  • 在统计学中,离群点是并不属于特定族群的数据点,是与其它相距甚远的异常观测。离群点是一种与其它结构良好的数据不同的观测。 例如,你可以很清楚地看到这个列表中的离群点:[20,24,22,19,29,18,4300,30,18] 当...
  • 数据挖掘中的异常值分析

    千次阅读 2018-04-11 10:27:27
    数据挖掘中异常值分析是保证数据质量的前提,它在数据处理的阶段是数据探索阶段,总之,找出数据异常值,有利于我们最终得出的模型的稳定性。异常值分析主要有三种方法:1.简单的统计量分析: 我们可以先对采集到...
  • 6月12日给大家讲解了一下数据获取的东东(时隔略久,忘记的请点击数据获取回顾),时隔一个月,接着我们的 用Excel进行数据分析系列 的第二篇:数据处理。文末有获取本篇实例数据的方法。目录...
  • 用箱形图寻找异常值

    万次阅读 2019-03-20 19:45:28
    异常值检验有很多种方法,这里主要说箱形图。所谓的异常就是和大众不一样呗,就是指样本中出现的明显偏离大多数观测值的个别值。...数据小于Q1-QR1.5或者数据大于Q3+1.5QR为异常值; 实例 数据来自:http://www.uni-...
  • 原标题:异常值的识别与处理,看这一篇就够了 在数据分析工作中,面对收集而来的数据数据清洗是首要环节。而异常值处理是其中的一个重要部分。下面就给大家介绍一下如何处理数据中的异常值。一、异常值判断何为...
  • 基于Python的异常值处理汇总

    千次阅读 2020-07-23 14:28:46
    其中,异常值是指数据集中存在的不合理的点,这些异常点如果不加以剔除或者修正而错误的包括进数据的计算分析过程中,那么会对结果产生非常不好的影响,导致结果偏差。因此,重视异常值的出现,分析其产生原因,并对...
  • 在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些...
  • 在《Python数据清洗(一):类型转换和冗余数据删除》和《Python数据清洗(二):缺失值识别与处理》文中已经讲解了有关数据中重复观测和缺失值的识别与处理,在本节中将分享异常值的判断和处理方法。 异常值也称为离群...
  • Pandas数据对象中的缺失表示为NaN。 import pandas as pd # 读取杭州天气文件 df = pd.read_csv("E:/Data/practice/hz_weather.csv") # 数据透视表 df1 = pd.pivot_table(df, index=['天气'], colu...
  • 数据清理】处理异常值和缺失值大杂烩识别异常值处理异常值缺失值插补插补方法插值效果检验处理缺失值的R包 识别异常值 方法1:Boxplot / 四分位数和四分位距。 方法2:当前值在平均值的±3个标准差之外。 方法...
  • 利用Python进行异常值分析实例代码

    千次阅读 2021-02-03 20:21:45
    异常值是指样本中的个别值,也称为离群点,其数值明显偏离其余的观测值。常用检测方法3σ原则和箱型图。其中,3σ原则只适用服从正态分布的数据。...异常值分析是检验数据是否有录入错误以及含有不合常理的数据。忽...
  • DataFrame中检测某行异常值

    千次阅读 2019-11-04 17:14:26
    col = data[3] col[np.abs(col)>3] #某行绝对值大于3的数 data[(np.abs(data)>3).any(1)] #全部abs大于3的行和列,以下两种不可取 #data[np.abs(data)>3] #data[data>3] data[np.abs(data.ix[:,0])>...
  • 缺失分析 缺失产生的原因 有些信息暂时无法获取,或者获取信息的代价太大。...在某些情况下,缺失并不意味着数据有错误。对一些对象来说某些属性是不存在的,如一个未婚者的配偶姓名、一个儿童的固
  • 异常值检测方法汇总

    万次阅读 多人点赞 2020-04-08 17:16:57
    异常检测项目流程前言一、项目流程1.目标确立2.数据准备3.数据分析处理4.模型算法(重点)4.1 传统统计方法4.1.1 3σ准则4.1.2 四分位(箱线图)4.2 机器学习方法(重点)4.2.1 监督学习算法4.2.2 无监督学习算法...
  • 正态性与异常值

    千次阅读 2020-06-01 14:50:26
    许多参数估计方法均要求数据分布为正态(normality),且期望不存在异常值(outlier)。 3.1 简介 3.1.1 概念 (1)正态分布 正态分布(或称“常态分布”,normal distribution)是一种分布频次从中间往两边递减的...
  • %% 数据准备 x1 = [7 1 11 11 7 11 3 1 2 21 1 11 10]'; x2 = [26,29,56,31,52,55,71,31,54,47,40,66,68]'; x3 = [6 15,8,8,6,9,17,22,18,4,23,9,8]'; x4 = [60,52,20,47,33,22,6,44,22,26,34,12,12]'; y = [78.5 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,551
精华内容 47,820
关键字:

寻找数据异常值