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

原文地址:https://www.cnblogs.com/HuZihu/p/9643050.html