精华内容
下载资源
问答
  • Python清除异常值四分位法

    千次阅读 2019-06-13 12:55:44
    看了...令 IQR=Q3−Q1IQR=Q3−Q1 ,那么 Q3+1.5(IQR)Q3+1.5(IQR) 和 Q1−1.5(IQR)Q1−1.5(IQR) 之间的值就是可接受范围内的数值,这两个值之外的数认为是异常值。 抄袭一张图:

    看了https://blog.csdn.net/zhuiqiuuuu/article/details/82721935 这篇文章,但是因为用不到pd,所以改了改。
    先上代码

    # Outlier detection
    import numpy as np
    
    def detect_outliers2(df):
        outlier_indices = []
    
        # 1st quartile (25%)
        Q1 = np.percentile(df, 25)
        # 3rd quartile (75%)
        Q3 = np.percentile(df, 75)
        # Interquartile range (IQR)
        IQR = Q3 - Q1
    
        # outlier step
        outlier_step = 1.5 * IQR
        for nu in df:
            if (nu < Q1 - outlier_step) | (nu > Q3 + outlier_step):
                df.remove(nu)
        return df
    
    if __name__ == '__main__':
        df = [-3331,2,3,4,11111]
        Outliers_to_drop = detect_outliers2(df)
        # Drop outliers
        print(Outliers_to_drop)
    

    输出:[2, 3, 4]

    效果描述:将输入的df清除异常值

    理论:
    首先计算出第一四分位数(Q1)、中位数、第三四分位数(Q3)。
    中位数我们都知道,就是将一组数字按从小到大的顺序排序后,处于中间位置(也就是50%位置)的数字。
    同理,第一四分位数、第三四分位数是按从小到大的顺序排序后,处于25%、75%的数字。

    令 IQR=Q3−Q1IQR=Q3−Q1 ,那么 Q3+1.5(IQR)Q3+1.5(IQR) 和 Q1−1.5(IQR)Q1−1.5(IQR) 之间的值就是可接受范围内的数值,这两个值之外的数认为是异常值。
    抄袭一张图:
    在这里插入图片描述

    展开全文
  • 基于Python异常值处理汇总

    千次阅读 2020-07-23 14:28:46
    不论是在机器/深度学习还是普通的业务场景的描述性统计分析等,我们首先要做的就是了解拿到的基础数据,观察数据结构,类型,缺失值,异常值等情况。其中,异常值是指数据集中存在的不合理的点,这些异常点如果不...

    背景:

    不论是在机器/深度学习还是普通的业务场景的描述性统计分析等,我们首先要做的就是了解拿到的基础数据,观察数据结构,类型,缺失值,异常值等情况。其中,异常值是指数据集中存在的不合理的点,这些异常点如果不加以剔除或者修正而错误的包括进数据的计算分析过程中,那么会对结果产生非常不好的影响,导致结果偏差。因此,重视异常值的出现,分析其产生原因,并对异常值进行剔除或者修正就显得尤其重要。本篇幅主要列举了本人遇到的一些异常值的处理方法,如有更好的,欢迎指正!

    1. 如何发现异常值?

    异常值的方法想法有很多种,基于业务的认知,简单的确定某个指标的阈值,进行判断,也可以基于统计学方法,同时还有基于机器学习的离群点检测方法,今天主要介绍统计学方法和机器学习的方法。
    1.1 3∂原则
    在统计学中,如果一个数据分布近似正态,那么大约 68% 的数据值会在均值的一个标准差范围内,大约 95% 会在两个标准差范围内,大约 99.7% 会在三个标准差范围内。但是,当数据不服从正态分布,可以通过远离平均距离多少倍的标准差来判定,多少倍的取值需要根据经验和实际情况来决定。
    在这里插入图片描述

    ###正态分布标准差
    import numpy as np
    import matplotlib.pyplot as plt
    
    def find_outliter_std(random_data,c):
        anomalies = []
        random_data_std = np.std(random_data) 
        random_data_mean = np.mean(random_data) 
        anomaly_cut_off = random_data_std * c 
        lower_limit = random_data_mean - anomaly_cut_off 
        upper_limit = random_data_mean + anomaly_cut_off 
        #print(lower_limit)
        for outlier in random_data: 
            if outlier > upper_limit or outlier < lower_limit: 
                anomalies.append(1) 
            else:
                anomalies.append(0)
        res4=pd.merge(pd.DataFrame(random_data),pd.DataFrame(anomalies),left_index=True,right_index=True)
        res4.columns=['values','is_outliter']
        return res4
    

    1.2 箱线图
    箱线图是通过数据集的四分位数形成的图形化描述。这是一种非常简单但有效的可视化离群点的方法。考虑把上下触须作为数据分布的边界。任何高于上触须或低于下触须的数据点都可以认为是离群点或异常值。箱型图依据实际数据绘制,没有对数据作任何限制性要求(如服从某种特定的分布形式),它只是真实直观地表现数据分布的本来面貌;另一方面,箱型图判断异常值的标准以四分位数和四分位距为基础,四分位数具有一定的鲁棒性:多达25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值不能对这个标准施加影响。由此可见,箱型图识别异常值的结果比较客观,在识别异常值方面有一定的优越性
    在这里插入图片描述
    如下是绘制箱形图的代码:

    import numpy as np
    import pandas as pd
    import scipy
    def find_outliter_quantile(random_data,c):
        anomalies = []
        random_data_q1 = np.quantile(random_data,0.25)
        random_data_q3 = np.quantile(random_data,0.75) 
        anomaly_cut_off = (random_data_q3-random_data_q1) * c #c一般为1.5或者3,但是个人认为可以根据实际业务情况进行更改,比如涨幅超过1倍的情况就是极端异常的情况,那我们可以c取值为1
        lower_limit = random_data_q1 - anomaly_cut_off 
        upper_limit = random_data_q3 + anomaly_cut_off 
        for outlier in random_data: 
            if outlier > upper_limit or outlier < lower_limit: 
                anomalies.append(1) 
            else:
                anomalies.append(0)
        res5=pd.merge(pd.DataFrame(random_data),pd.DataFrame(anomalies),left_index=True,right_index=True)
        res5.columns=['values','is_outliter']
        return res5
    
    if __name__=='__main__':
    	data=np.array([1338,1338,2,1047,688,520,1408,225,206,280])
    	outliers=find_outliter_quantile(random_data,c)
    

    1.3 DBSCAN
    从基于密度的观点来说,离群点是在低密度区域中的对象。基于密度的离群点检测与基于邻近度的离群点检测密切相关,因为密度通常用邻近度定义,DBSCAN就是一种使用密度的聚类算法,具体算法原理可以查阅:https://baike.baidu.com/item/DBSCAN/4864716?fr=aladdin

    from sklearn.cluster import DBSCAN
    import numpy as np
    def dbscan(random_data):
    	outlier_detection = DBSCAN(min_samples = 2, eps = 3)
    	clusters = outlier_detection.fit_predict(random_data)
    	print (list(clusters).count(-1))
    	res2=pd.DataFrame(random_data,list(clusters)).reset_index()
    	res2.columns=['is_outliter','values']
    	return res2
    

    1.4 k-means
    k-means方法是基于聚类的离群点识别方法,k-means的主要思想是一个对象是基于聚类的离群点,如果该对象不强属于任何簇,那么该对象属于离群点。
    离群点对初始聚类的影响:如果通过聚类检测离群点,则由于离群点影响聚类,存在一个问题:结构是否有效。这也是k-means算法的缺点,对离群点敏感。为了处理该问题,可以使用如下方法:对象聚类,删除离群点,对象再次聚类(这个不能保证产生最优结果)。
    优缺点:(1)基于线性和接近线性复杂度(k均值)的聚类技术来发现离群点可能是高度有效的;(2)簇的定义通常是离群点的补,因此可能同时发现簇和离群点;(3)产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性;(4)聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大。

    ####k-means方法异常点检测#####
    from sklearn import preprocessing
    from sklearn.cluster import KMeans
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    def kmeans(data):
    	data_scale = preprocessing.scale(data)#处理后需要转为dataframe,或者直接手动求均值、方差转换
    	model = KMeans(n_clusters = 2,max_iter = 1000) # k=2,一类认为是异常的,一类是不异常的,最大迭代次数可以根据实际情况进行修改
    	model.fit(data_scale)
    	data_scale = pd.DataFrame(data_scale)
    	#data_scale = pd.DataFrame(data_scale,index = data.index)
    	data_scale['labels'] = model.labels_
    	res3=pd.merge(data_scale,pd.DataFrame(data),left_index=True,right_index=True) 
    	res3.columns=['distance','labels','values']
    	#print (res3)
    	return res3
    

    1.5 孤立森林
    孤立森林是一种无监督学习算法,属于组合决策树家族。这种方法和以上所有方法都不同。之前的所有方法都在试图寻找数据的常规区域,然后将任何在此定义区域之外的点都视为离群点或异常值。
    这种方法的工作方式不同。它明确地隔离异常值, 而不是通过给每个数据点分配一个分数来分析和构造正常的点和区域。它利用了这样一个事实:异常值只是少数,并且它们具有与正常实例非常不同的属性值。该算法适用于高维数据集,并且被证明是一种非常有效的异常检测方法。

    #孤立森林
    #最好对数据集去重,在确定孤立点,因为如果多个异常点聚集,那么就不孤立了
    from sklearn.ensemble import IsolationForest
    import numpy as np
    def  isolationforest(random_data):
    	clf = IsolationForest(behaviour = 'new',max_samples='auto', random_state = 1, contamination= 'auto')
    	preds = clf.fit_predict(random_data)
    	print (list(preds).count(-1))
    	res1=pd.DataFrame(random_data,list(preds)).reset_index()
    	res1.columns=['is_outliter','values']
    	return res1
    

    2. 异常值如何处理?

    检测到了异常值,我们需要对其进行一定的处理。而一般异常值的处理方法可大致分为以下几种:
    首先、如果模型或者分析对异常值比较敏感,如果不处理会极大的影响模型效果或者业务分析结果,那么则需要进行如下几种方式的处理:
    (1)删除含有异常值的记录:直接将含有异常值的记录删除;

    (2)视为缺失值:将异常值视为缺失值,利用缺失值处理的方法进行处理;

    (3)平均值修正:可用前后两个观测值的平均值修正该异常值;

    其次、如果使用的模型对异常值不是很敏感,那么建议直接在具有异常值的数据集上进行数据挖掘;

    参考文献:

    【1】python-异常值分析
    【2】数据预处理之异常值处理
    【3】机器学习中的异常值检测和处理

    展开全文
  • Python异常值/离群值的处理

    千次阅读 2020-06-22 12:09:06
    离群值 离群值是指与集合中其他观测值差异较大的任何数据点。 ...异常值存在的原因有很多。有可能是分析人员在输入数据时出错,也有可能是设备产生了测量误差,甚至有可能是故意离群。 如果有

    离群值

    离群值是指与集合中其他观测值差异较大的任何数据点。

    例如:

    当一个学生的平均成绩在90%以上,而其他小组的成绩在70%,就会出现明显的离群现象。
    通过分析某个客户的购买模式,突然出现了一个非常高价值的购买(如10万)。虽然某客户的交易额大多在1万左右波动。不管是什么原因,10万的购买量在整体数据中都是一个异数。
    乌塞恩-博尔特--记录短跑绝对是排放当大多数运动员被考虑。
    异常值存在的原因有很多。有可能是分析人员在输入数据时出错,也有可能是设备产生了测量误差,甚至有可能是故意离群。

    如果有离群值/异常值,数据分布会有重尾。

    离群有两种类型:一维和多维。

    一维离群是指仅由一个变量的极端值组成的数据点,而多维离群/异常是指至少两个变量的综合异常值。假设我们有三个不同的变量--X,Y,Z。如果我们将这些变量绘制在三维空间中,就会形成一种云。所有位于在这之外的数据点都将是多维度的排放。

    异常/离群值会严重影响分析和统计建模的结果。

    大多数参数统计,如平均数、标准差和相关性,以及基于这些参数的任何统计,对离群值都非常敏感。

    单纯地消除离群并不总是一个好主意。离群/异常值可以是相当合理的观察,有时也是最有趣的观察。在作出决定之前,必须研究离群值的性质。

    如果某项异常值显然是由于输入或测量的数据不正确造成的,则应将其删除。
    如果离群/异常值不改变结果,但影响假设,则可删除离群/异常值。不过,报告中值得注意的是这一点。你也可以建立一个有这个版本和没有这个版本的模型,看看结果。

    如何查找离群/异常值情况?
    1.通过可视化 

    2.通过数学计算

    import pandas as pd
    
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    from sklearn.datasets import load_boston
    boston = load_boston()
    x = boston.data
    y = boston.target
    columns = boston.feature_names
    
    #create the dataframe
    boston_df = pd.DataFrame(x)
    boston_df.columns = columns
    boston_df.head()

     

     Box-plot

    import seaborn as sns
    sns.boxplot(x=boston_df['INDUS']);

    剖析框图

    sns.boxplot(x=boston_df['PTRATIO']);

    sns.boxplot(x=boston_df['DIS']);

    最后一张图显示的是10和12之间的三个辍学点,不包括在方框内的其他观察点,即公寓之间。

    Scatter-plot

    fig, ax = plt.subplots(figsize=(16,8))
    ax.scatter(boston_df['INDUS'], boston_df['TAX'])
    ax.set_xlabel('Proportion of non-retail business acres per town')
    ax.set_ylabel('Full-value property-tax rate per $10,000')
    plt.show();

    你可以清晰地看到云外的点。

    Z-Score

    Z-Score是指观测点或数据的值超过观测值或测量值平均值的标准差的符号数。

    from scipy import stats
    import numpy as np
    z = np.abs(stats.zscore(boston_df))
    print(z)

    threshold = 3
    print(np.where(z > 3))

    print(z[55][1])
    3.375038763517309

    例如,ZN中的第55个观测值(划为25,000平方英尺以上地段的住宅用地比例)就是一种离群。

    IQR score

    四分位数范围(IQR),又称平均数或50%平均数,或技术上称为H-spread,是衡量统计学分散度的指标,等于75%和25%之间的差值,或上四分位数和下四分位数之间的差值,IQR=Q3 - Q1。百度百科解释

    Q1 = boston_df.quantile(0.25)
    Q3 = boston_df.quantile(0.75)
    IQR = Q3 - Q1
    print(IQR)
    CRIM         3.565378
    ZN          12.500000
    INDUS       12.910000
    CHAS         0.000000
    NOX          0.175000
    RM           0.738000
    AGE         49.050000
    DIS          3.088250
    RAD         20.000000
    TAX        387.000000
    PTRATIO      2.800000
    B           20.847500
    LSTAT       10.005000
    dtype: float64

    既然我们现在有了IQR估计,那么我们就选择离群值。下面的代码将产生带有真值和假值的结果。带有False的数据点表示这些值是有效的,而True则表示有释放。

    print((boston_df < (Q1 - 1.5 * IQR)) | (boston_df > (Q3 + 1.5 * IQR)))
          CRIM     ZN  INDUS   CHAS    NOX     RM    AGE    DIS    RAD    TAX  \
    0    False  False  False  False  False  False  False  False  False  False   
    1    False  False  False  False  False  False  False  False  False  False   
    2    False  False  False  False  False  False  False  False  False  False   
    3    False  False  False  False  False  False  False  False  False  False   
    4    False  False  False  False  False  False  False  False  False  False   
    5    False  False  False  False  False  False  False  False  False  False   
    6    False  False  False  False  False  False  False  False  False  False   
    7    False  False  False  False  False  False  False  False  False  False   
    8    False  False  False  False  False  False  False  False  False  False   
    9    False  False  False  False  False  False  False  False  False  False   
    10   False  False  False  False  False  False  False  False  False  False   
    11   False  False  False  False  False  False  False  False  False  False   
    12   False  False  False  False  False  False  False  False  False  False   
    13   False  False  False  False  False  False  False  False  False  False   
    14   False  False  False  False  False  False  False  False  False  False   
    15   False  False  False  False  False  False  False  False  False  False   
    16   False  False  False  False  False  False  False  False  False  False   
    17   False  False  False  False  False  False  False  False  False  False   
    18   False  False  False  False  False  False  False  False  False  False   
    19   False  False  False  False  False  False  False  False  False  False   
    20   False  False  False  False  False  False  False  False  False  False   
    21   False  False  False  False  False  False  False  False  False  False   
    22   False  False  False  False  False  False  False  False  False  False   
    23   False  False  False  False  False  False  False  False  False  False   
    24   False  False  False  False  False  False  False  False  False  False   
    25   False  False  False  False  False  False  False  False  False  False   
    26   False  False  False  False  False  False  False  False  False  False   
    27   False  False  False  False  False  False  False  False  False  False   
    28   False  False  False  False  False  False  False  False  False  False   
    29   False  False  False  False  False  False  False  False  False  False   
    ..     ...    ...    ...    ...    ...    ...    ...    ...    ...    ...   
    476  False  False  False  False  False  False  False  False  False  False   
    477   True  False  False  False  False  False  False  False  False  False   
    478   True  False  False  False  False  False  False  False  False  False   
    479   True  False  False  False  False  False  False  False  False  False   
    480  False  False  False  False  False  False  False  False  False  False   
    481  False  False  False  False  False  False  False  False  False  False   
    482  False  False  False  False  False  False  False  False  False  False   
    483  False  False  False  False  False  False  False  False  False  False   
    484  False  False  False  False  False  False  False  False  False  False   
    485  False  False  False  False  False  False  False  False  False  False   
    486  False  False  False  False  False  False  False  False  False  False   
    487  False  False  False  False  False  False  False  False  False  False   
    488  False  False  False  False  False  False  False  False  False  False   
    489  False  False  False  False  False  False  False  False  False  False   
    490  False  False  False  False  False  False  False  False  False  False   
    491  False  False  False  False  False  False  False  False  False  False   
    492  False  False  False  False  False  False  False  False  False  False   
    493  False  False  False  False  False  False  False  False  False  False   
    494  False  False  False  False  False  False  False  False  False  False   
    495  False  False  False  False  False  False  False  False  False  False   
    496  False  False  False  False  False  False  False  False  False  False   
    497  False  False  False  False  False  False  False  False  False  False   
    498  False  False  False  False  False  False  False  False  False  False   
    499  False  False  False  False  False  False  False  False  False  False   
    500  False  False  False  False  False  False  False  False  False  False   
    501  False  False  False  False  False  False  False  False  False  False   
    502  False  False  False  False  False  False  False  False  False  False   
    503  False  False  False  False  False  False  False  False  False  False   
    504  False  False  False  False  False  False  False  False  False  False   
    505  False  False  False  False  False  False  False  False  False  False   
    
         PTRATIO      B  LSTAT  
    0      False  False  False  
    1      False  False  False  
    2      False  False  False  
    3      False  False  False  
    4      False  False  False  
    5      False  False  False  
    6      False  False  False  
    7      False  False  False  
    8      False  False  False  
    9      False  False  False  
    10     False  False  False  
    11     False  False  False  
    12     False  False  False  
    13     False  False  False  
    14     False  False  False  
    15     False  False  False  
    16     False  False  False  
    17     False  False  False  
    18     False   True  False  
    19     False  False  False  
    20     False  False  False  
    21     False  False  False  
    22     False  False  False  
    23     False  False  False  
    24     False  False  False  
    25     False   True  False  
    26     False  False  False  
    27     False   True  False  
    28     False  False  False  
    29     False  False  False  
    ..       ...    ...    ...  
    476    False  False  False  
    477    False  False  False  
    478    False  False  False  
    479    False  False  False  
    480    False  False  False  
    481    False  False  False  
    482    False  False  False  
    483    False  False  False  
    484    False  False  False  
    485    False  False  False  
    486    False  False  False  
    487    False  False  False  
    488    False  False  False  
    489    False   True  False  
    490    False   True  False  
    491    False  False  False  
    492    False  False  False  
    493    False  False  False  
    494    False  False  False  
    495    False  False  False  
    496    False  False  False  
    497    False  False  False  
    498    False  False  False  
    499    False  False  False  
    500    False  False  False  
    501    False  False  False  
    502    False  False  False  
    503    False  False  False  
    504    False  False  False  
    505    False  False  False  
    
    [506 rows x 13 columns]
    

    在ModelTestingTemplate中的影响措施。

    聚类/分类。
    1.K-means
    2.隔离林

     


    离群值/异常值怎么办?
    识别异常值--分析有无异常值的结果模型--做出结论。
    如果你确定数值是错误的,就修正它。
    如果离群值不在利益分配范围内,则删除。
    考虑到数据的差距。
    使用抗离群值的统计工具,例如,稳健回归(用另一种参数估计方法)Robust_regression
    离群值的常见原因是两种分布的混合,可能是两个不同的子人群,也可能表明 "测量正确 "和 "测量误差";这通常是由混合模型来建模。 (Mixture model).

     

    展开全文
  • python异常值检测

    千次阅读 2020-04-01 12:56:55
    Anomaly Detection异常检测 What are Outliers ? Statistical Methods for Univariate Data Using Gaussian Mixture Models Fitting an elliptic envelope Isolation Forest Local Outlier Factor Using clustering...

    Anomaly Detection异常检测

    • What are Outliers ?
    • Statistical Methods for Univariate Data
    • Using Gaussian Mixture Models
    • Fitting an elliptic envelope
    • Isolation Forest
    • Local Outlier Factor
    • Using clustering method like DBSCAN
    • 什么是离群值?
    • 单变量数据的统计方法
    • 使用高斯混合模型
    • 安装椭圆形信封
    • 隔离森林
    • 局部离群因子
    • 使用DBSCAN之类的聚类方法

    Outliers离群值

    • New data which doesn’t belong to general trend (or distribution) of entire data are known as outliers.
    • Data belonging to general trend are known as inliners.
    • Learning models are impacted by presence of outliers.
    • Anomaly detection is another use of outlier detection in which we find out unusual behaviour.
    • Data which were detected outliers can be deleted from complete dataset.
    • Outliers can also be marked before using them in learning methods
    • 不属于整个数据的总体趋势(或分布)的新数据称为异常值。
    • 属于大趋势的数据称为线性。
    • 学习模型会受到异常值的影响。
    • 异常检测是异常检测的另一种用途,在异常检测中我们可以发现异常行为。
    • 可以从完整数据集中删除检测到的异常值的数据。
    • 在学习方法中使用异常值之前,也可以对其进行标记

    Statistical Methods for Univariate Data单变量数据的统计方法

    • Using Standard Deviation Method - zscore
    • Using Interquartile Range Method - IRQ
    • 使用标准偏差方法-zscore
    • 使用四分位间距法-IRQ

    Using Standard Deviation Method使用标准偏差法

    • If univariate data follows Gaussian Distribution, we can use standard deviation to figure out where our data lies
    • 如果单变量数据遵循高斯分布,我们可以使用标准差来找出数据所在的位置
    import numpy as np
    data = np.random.normal(size=1000)
    
    • Adding More Outliers
    data[-5:] = [3.5,3.6,4,3.56,4.2]
    
    from scipy.stats import zscore
    
    • Detecting Outliers
    data[np.abs(zscore(data)) > 3]
    
    array([3.05605991, 3.5       , 3.6       , 4.        , 3.56      ,
           4.2       ])
    

    Using Interquartile Range使用四分位间距

    • For univariate data not following Gaussian Distribution IQR is a way to detect outliers
    • 对于不遵循高斯分布的单变量数据,IQR是检测异常值的一种方法
    from scipy.stats import iqr
    
    data = np.random.normal(size=1000)
    data[-5:]=[-2,9,11,-3,-21]
    iqr_value = iqr(data)
    lower_threshold = np.percentile(data,25) - iqr_value*1.5
    upper_threshold = np.percentile(data,75) + iqr_value*1.5
    
    print(upper_threshold)
    print(lower_threshold)
    
    2.743958884560146
    -2.7240836639852306
    
    data[np.where(data < lower_threshold)]
    
    array([ -3.15722416,  -2.72563369,  -2.84349424,  -3.        ,
           -21.        ])
    
    data[np.where(data > upper_threshold)]
    
    array([ 2.83383323,  2.7536317 ,  2.98728378,  2.7889204 ,  9.        ,
           11.        ])
    

    Using Gaussian Mixture Models使用高斯混合模型

    • Data might contain more than one peaks in the distribution of data.
    • Trying to fit such multi-model data with unimodel won’t give a good fit.
    • GMM allows to fit such multi-model data.
    • Configuration involves number of components in data, n_components.
    • covariance_type controls the shape of cluster
      • full : cluster will be modeled to eclipse in arbitrary dir
      • sperical : cluster will be spherical like kmeans
      • diag : cluster will be aligned to axis
    • We will see how GMM can be used to find outliers
    • 数据分布中可能包含多个峰。
    • 试图用unimodel拟合这样的多模型数据不会很合适。
    • GMM允许拟合此类多模型数据。
    • 配置涉及数据中的组件数n_components。
    • covariance_type控制簇的形状
      • full:集群将被建模为在任意目录中蚀
      • sperical:簇将像kmeans一样呈球形
      • diag:群集将与轴对齐
    • 我们将了解如何使用GMM查找异常值
    # Number of samples per component
    n_samples = 500
    
    # Generate random sample, two components
    np.random.seed(0)
    C = np.array([[0., -0.1], [1.7, .4]])
    C2 = np.array([[1., -0.1], [2.7, .2]])
    #X = np.r_[np.dot(np.random.randn(n_samples, 2), C)]
              #.7 * np.random.randn(n_samples, 2) + np.array([-6, 3])]
    X = np.r_[np.dot(np.random.randn(n_samples, 2), C),np.dot(np.random.randn(n_samples, 2), C2)]
    
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    X[-5:] = [[4,-1],[4.1,-1.1],[3.9,-1],[4.0,-1.2],[4.0,-1.3]]
    plt.scatter(X[:,0], X[:,1],s=5)
    

    在这里插入图片描述

    from sklearn.mixture import GaussianMixture
    gmm = GaussianMixture(n_components=3)
    gmm.fit(X)
    pred = gmm.predict(X)
    pred[:50]
    plt.scatter(X[:,0], X[:,1],s=10,c=pred)
    

    在这里插入图片描述

    Fitting Elliptical Envelope拟合椭圆形信封

    • The assumption here is, regular data comes from known distribution ( Gaussion distribution )
    • Inliner location & variance will be calculated using Mahalanobis distances which is less impacted by outliers.
    • Calculate robust covariance fit of the data.
    • 这里的假设是,常规数据来自已知分布(高斯分布)
    • 内衬位置和方差将使用“马哈拉诺比斯距离”来计算,该值不受异常值的影响较小。
    • 计算数据的鲁棒协方差拟合。
    from sklearn.datasets import make_blobs
    X,_ = make_blobs(n_features=2, centers=2, cluster_std=2.5, n_samples=1000)
    plt.scatter(X[:,0], X[:,1],s=10)
    

    在这里插入图片描述

    from sklearn.covariance import EllipticEnvelope
    ev = EllipticEnvelope(contamination=.1)
    ev.fit(X)
    cluster = ev.predict(X)
    plt.scatter(X[:,0], X[:,1],s=10,c=cluster)
    

    在这里插入图片描述

    Isolation Forest隔离森林

    • Based on RandomForest
    • Useful in detecting outliers in high dimension datasets.
    • This algorithm randomly selects a feature & splits further.
    • Random partitioning produces shorter part for anomolies.
    • When a forest of random trees collectively produce shorter path lengths for particular samples, they are highly likely to be anomalies.
    • 基于RandomForest
    • 在检测高维数据集中的异常值时很有用。
    • 此算法随机选择一个特征并进一步分割。
    • 随机分区产生的部分更短。
    • 当随机树木的森林为特定样本共同产生较短的路径长度时,很可能是异常情况。
    rng = np.random.RandomState(42)
    
    # Generate train data
    X = 0.3 * rng.randn(100, 2)
    X_train = np.r_[X + 2, X - 2]
    # Generate some regular novel observations
    X = 0.3 * rng.randn(20, 2)
    X_test = np.r_[X + 2, X - 2]
    # Generate some abnormal novel observations
    X_outliers = rng.uniform(low=-4, high=4, size=(20, 2))
    
    from sklearn.ensemble import IsolationForest
    data = np.r_[X_train,X_test,X_outliers]
    iso = IsolationForest(behaviour='new', contamination='auto')
    iso.fit(data)
    pred = iso.predict(data)
    
    plt.scatter(data[:,0], data[:,1],s=10,c=pred)
    

    在这里插入图片描述

    Local Outlier Factor局部离群因子

    • Based on nearest neighbours
    • Suited for moderately high dimension datasets
    • LOF computes a score reflecting degree of abnormility of a data.
    • LOF Calculation
      • Local density is calculated from k-nearest neighbors.
      • LOF of each data is equal to the ratio of the average local density of his k-nearest neighbors, and its own local density.
      • An abnormal data is expected to have smaller local density.
    • LOF tells you not only how outlier the data is but how outlier is it with respect to all data
    • 基于最近的邻居
    • 适用于中等高维数据集
    • LOF计算反映数据异常程度的分数。
    • LOF计算
      -从k最近邻居计算局部密度。
      -每个数据的LOF等于他的k个最近邻居的平均局部密度与其自身局部密度之比。
      -异常数据的局部密度较小。
    • LOF不仅告诉您数据的异常值,而且还告诉您所有数据的异常值
    from sklearn.neighbors import LocalOutlierFactor
    lof = LocalOutlierFactor(n_neighbors=25,contamination=.1)
    pred = lof.fit_predict(data)
    s = np.abs(lof.negative_outlier_factor_)
    
    plt.scatter(data[:,0], data[:,1],s=s*10,c=pred)
    

    在这里插入图片描述

    Outlier Detection using DBSCAN使用DBSCAN进行异常值检测

    • DBSCAN is a clustering method based on density
    • Groups data which are closer to each other.
    • Doesn’t use distance vector calculation method
    • Data not close enough to any cluster is not assigned any cluster & these can be anomalies
    • eps controls the degree of considering a data part of cluster
    • DBSCAN是基于密度的聚类方法
    • 将彼此接近的数据分组。
    • 不使用距离矢量计算方法
    • 没有足够接近任何集群的数据没有被分配任何集群,这些可能是异常的
    • eps控制考虑集群数据部分的程度
    from sklearn.cluster import DBSCAN
    dbscan = DBSCAN(eps=.3)
    dbscan.fit(data)
    plt.scatter(data[:,0], data[:,1],s=s*10,c=dbscan.labels_)
    

    在这里插入图片描述

    展开全文
  • python数据处理之异常值删除(3的塔准则) # 导入库 import numpy as np import pandas as pd from matplotlib import pyplot from pandas.core.frame import DataFrame import os from pandas.plotting import ...
  • 数据预处理之识别异常值删除Python) 首先导入数据集: import pandas as pd data=pd.read_csv('path') 这里用箱型图识别异常值,一般取scale(尺度)=3,Q1为上四分位数,Q2为四分位数。则上边缘数和下边缘数...
  • 异常值检测(outlier)是一种数据挖掘过程,用于确定数据集中发现的异常值并确定其出现的详细信息。当前自动异常检测至关重要,因为大量数据无法手动标记异常值。 自动异常检测具有广泛的应用,...
  • # 这里我包装了一个异常值处理的代码,可以随便调用。 def outliers_proc(data, col_name, scale=3): """ 用于清洗异常值,默认用 box_plot(scale=3)进行清洗 :param data: 接收 pandas 数据格式 :param col_...
  • python数据预处理之异常值、缺失值处理方法

    千次阅读 多人点赞 2020-05-03 20:23:27
    除了互联网埋点的数据或企业内部的业务数据之外,往往我们拿到的,比如说网上采集的数据并不是那样规整,这类数据经常出现错误值、缺失值和异常值。 一、异常值 异常值是指样本中的个别值,其数值明显偏离其余的...
  • 本篇继续分享数据清洗中的另一个常见问题:异常值检测和处理。 1 什么是异常值? 在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本...
  • Python数据预处理--异常值处理

    千次阅读 2020-05-15 07:43:04
    异常值处理异常值分析3σ原则创建数据、计算均值和标准...异常值处理方法 → 删除 / 修正填补 异常值分析 3σ原则 介绍:3σ原则:如果数据服从正态分布,异常值被定义为一组测定值中与平均值的偏差超过3倍的值 → p(|
  • #随机插入两个异常值进去,此时num.shape[0]==102 np.apend(num,[10,20]) #设定法则的左右边界 left=num.mean()-3*num.std() right=num.mean()+3*num.std() #获取在范围内的数据 new_num=num[(left<num)&...
  • 过滤掉'orderid'列中开头不是GPA的行,只留开头是GPA的行 ![图片说明](https://img-ask.csdn.net/upload/201904/05/1554395517_627750.jpg) ![图片说明]...
  • Python实现基于3σ原则的异常值检测

    千次阅读 2021-01-24 15:49:41
    异常值的存在会对数据分析、建模产生干扰,因此需要对数据集进行异常值检测并进行异常值删除或修正,以便后续更好地进行数据分析和挖掘。对于异常值检测,有描述性统计、3σ原则方法、箱线图、基于聚类的方法等,而3...
  • Python数据清洗之缺失处理(五) 删除缺失填充默认值数据插补 处理缺失方法有三类: 删除缺失 填充默认值 数据插补 原始数据: 删除缺失 使用dropna()删除数据中的空值。 import pandas as ...
  • 通俗来讲,就是将所有的数据都分布在这张图上,矩形上下限用四分为值,又用四分位值算出一个上界和下界,大于上界或者小于下界的值就是异常值。这里四分位距(IQR)就是上四分位与下四分位的差值。我们通过四分位距的...
  • python用箱型图进行异常值检测

    万次阅读 多人点赞 2016-05-16 20:52:01
    异常值检测:数据挖掘工作中的第一步就是异常值检测,异常值的存在会影响实验结果。异常值是指样本中的个别值,也称为离群点,其数值明显偏离其余的观测值。常用检测方法3σ\sigma原则和箱型图。其中,3σ\sigma原则...
  • python数据分析:异常值处理

    千次阅读 2018-11-07 09:22:14
    import pandas as pd df = pd.DataFrame({'col1':[2,4,1,7,8,77],'col2':[12,34,32,76,55,66]}) df_zscore = df.copy() cols = df.columns for col in cols: df_col = df[col] z_score = (df_col - df_co...
  • 学习《Python3爬虫、数据清洗与可视化实战》时自己的一些实践。 缺失处理 Pandas数据对象中的缺失表示为NaN。 import pandas as pd # 读取杭州天气文件 df = pd.read_csv("E:/Data/practice/hz_weather....
  • 一、异常值 处理异常值之前,需要明确哪些是异常值。有很多种规则和方法来筛选异常值,这里我们以Z标准化得到的阈值作为判断标准。 利用正态分布定位异常值 Z标准化会将数据转换为标准差为1,均值为0且符合正态...
  • 实例:异常值直接剔除 import numpy as np data_list = [1,2,3,4,5,5,4,3,2,1,1,2,3,4,5,5,4,3,2,1,10000,-10000] data_array = np.asarray(data_list) mean = np.mean(data_array , axis=0) std = np.std(data_...
  • 本文写入的是python数据库的taob表 source [本地文件] 其中总数据为9616行,列分别为title,link,price,comment 2。使用python链接并读取数据 查看数据概括 #-*- coding:utf-8 -*- #author:M10 import numpy ...
  • Python数据清洗--异常值识别与处理01

    千次阅读 2019-04-24 09:00:00
    前言在《Python数据清洗--类型转换和冗余数据删除》和《Python数据清洗--缺失识别与处理》文中已经讲解了有关数据中重复观测和缺失的识别与处理,在本节中将分享...
  • python标准异常和自定义异常

    千次阅读 2018-06-09 17:18:23
    python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误。你可以使用该功能来调试python程序。 1.异常处理: 本站Python教程会具体介绍。 2.断言(Assertions):本站Python教程会具体介绍。 python...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 72,443
精华内容 28,977
关键字:

python删除异常值

python 订阅