zoukankan      html  css  js  c++  java
  • 异常值检测(Outlier Detection)

    什么是异常值?

    对于定性变量来说,异常值是出现次数非常少的类别;对于定量变量来说,异常值是明显大于或小于其他观测值的数值。

    异常值产生的原因: a. 人为错误:在数据收集,记录或输入过程中导致的错误。

                                     b. 测量误差: 当使用的测量仪器出现故障时,会引起这种情况,这是异常值最常见的来源。

                                     c. 实验误差 

                                     d. 数据处理错误:某些操作或提取错误。

                                     e. 抽样错误

                                     f. 自然异常值:不是人为的(由于错误)导致的。

    异常值的类型:

    单变量(Univariate)

    多变量(Multivariate)

    异常值检测:

    单变量:

    1. 使用pandas的 describe() 方法来查看数据的描述统计量。

    2. 使用各种可视化方法,如Box plot。

    3. 用四分位数检测。任何超出Q1-1.5 x IQR~Q3+1.5 x IQR范围的数值都可以被认为是异常值。可以使用 numpy 的 percentile() 方法。

    4. 用z值(标准差)检测。如果数据服从正态分布,那么距离平均数3个标准差及以上的数值被认为是异常值。

    多变量:

    1,基于模型的检测

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

    2,基于近邻的检测

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

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

    3,基于密度的检测

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

    4,基于距离的检测

    原理:计算每个点与中心点的距离,距离较远的可判断为异常点。

    计算距离的公式有很多,我们这里采用马氏距离。

    Python实现:

    from scipy.spatial import distance
    def func_mahalanobis(df,n_outliers):
        #n_outliers:异常值的个数,df:Dataframe
        
        #计算出异常值所对应的索引,越靠前的越异常
        m_dist_order = pd.Series([float(distance.mahalanobis(df.iloc[i], df.mean(), np.mat(df.cov().as_matrix()).I) ** 2)
        for i in range(len(df))]).sort_values(ascending=False).index.tolist()
        
        #假设n_outliers =2,说明你认为有2个异常,然后筛选出来
        error_index = m_dist_order[:n_outliers]
        error = df.iloc[error_index]
        return error

    5. 专门的异常点检测

    有两个专门用于检测异常点的方法: One Class SVM 和 Isolation Forest 。

    异常值的处理:

    1,删除含有异常值的记录:适用于数据输入错误,异常值数据非常少的情况。

    2,变量转换:比如取自然对数,进行分箱。

    3,插值:用平均值,中位数或众数替换。

    4,封顶:对于那些取值超过1.5倍四分位距的数值,可以分别用该变量5%和95%的分位数替代原数据。

    5,预测:将异常值先替换为缺失值,再将其视作被解释变量进行预测。

    6,不处理。异常值可能是欺诈检测中有价值的信息来源,某天某产品的销售额异常高,这时通常需要把会把离群值拿出来,单独做文字说明。用估值代替或删除不是一个好主意。

  • 相关阅读:
    EasyUI-datagrid-自动合并单元格(转)
    js中格式化时间字符串
    ext 3.2 tree 在IE10中点击事件失效的bug
    C#中修改Dll文件 (反编译后重新编译)
    GridView内容<br />换行
    使用Aspose.Words把 word转成图片
    判断移动设备访问自动跳转到移动版页面
    jquery mobile界面数据刷新
    Ubuntu16.04下安装Visual Studio Code
    npm 安装vue 报错Failed at the chromedriver@2.46.0 install script 'node install.js'
  • 原文地址:https://www.cnblogs.com/HuZihu/p/9643050.html
Copyright © 2011-2022 走看看