【特征工程】一种异常值检测方法、原理、代码实现 (基于箱线图)

先介绍使用到的方法原理,也就是一种异常检测的方法。
首先要先了解箱线图。

箱线图

箱线图(Boxplot)也称箱须图(Box-whisker Plot),是利用数据中的五个统计量:最小值、第一四分位数、中位数、第三四分位数与最大值来描述数据的一种方法,它也可以粗略地看出数据是否具有有对称性,分布的分散程度等信息,特别可以用于对几个样本的比较。 ——MBAlib 箱线图

先看一下什么是箱线图,下面这个是常见的箱线图样子。

箱线图1

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

I Q R = Q 3 − Q 1 IQR=Q3-Q1 IQR=Q3Q1 ,那么 Q 3 + 1.5 ( I Q R ) Q3+1.5(IQR) Q3+1.5(IQR) Q 1 − 1.5 ( I Q R ) Q1-1.5(IQR) Q11.5(IQR) 之间的值就是可接受范围内的数值,这两个值之外的数认为是异常值。

Q 3 + 1.5 I Q R Q3+1.5IQR Q31.5IQR(四分位距)和 Q 1 − 1.5 I Q R Q1-1.5IQR Q11.5IQR 处画两条与中位线一样的线段,这两条线段为异常值截断点,称其为内限;在 Q 3 + 3 I Q R Q3+3IQR Q33IQR Q 1 - 3 I Q R Q1-3IQR Q13IQR 处画两条线段,称其为外限
处于内限以外位置的点表示的数据都是异常值,其中在内限与外限之间的异常值为温和的异常值(mild outliers),在外限以外的为极端的异常值(li)的异常值extreme outliers。这种异常值的检测方法叫做Tukey’s method

从矩形盒两端边向外各画一条线段直到不是异常值的最远点 表示该批数据正常值的分布区间点,示该批数据正常值的分布区间。
一般用“〇”标出温和的异常值,用“*”标出极端的异常值。

箱线图含义

python 代码分享

这段检测异常值的代码是从kaggle上看到的,很简单也很有用。
代码原地址:https://www.kaggle.com/yassineghouzam/titanic-top-4-with-ensemble-modeling/notebook

通过上面对箱线图的介绍,相信同时也清楚了异常值检测的方法。
假设我们现在已经有了一份pandas.DataFrame读取后的数据df,其中需要进行检测的列保存在features列表中,每个样本能忍受的最大异常值数量为n。

# Outlier detection 
import pandas as pd
import numpy as np
from collections import Counter

def detect_outliers(df,n,features):

    outlier_indices = []
    
    # iterate over features(columns)
    for col in features:
        # 1st quartile (25%)
        Q1 = np.percentile(df[col], 25)
        # 3rd quartile (75%)
        Q3 = np.percentile(df[col],75)
        # Interquartile range (IQR)
        IQR = Q3 - Q1
        
        # outlier step
        outlier_step = 1.5 * IQR
        
        # Determine a list of indices of outliers for feature col
        outlier_list_col = df[(df[col] < Q1 - outlier_step) | (df[col] > Q3 + outlier_step )].index
        
        # append the found outlier indices for col to the list of outlier indices 
        outlier_indices.extend(outlier_list_col)
        
    # select observations containing more than 2 outliers
    outlier_indices = Counter(outlier_indices)        
    multiple_outliers = list( k for k, v in outlier_indices.items() if v > n )
    
    return multiple_outliers   
# detect outliers from "Col1","Col2","Col3","Col4"
df = pd.read_csv("data.csv")
Outliers_to_drop = detect_outliers(df,2,["Col1","Col2","Col3","Col4"])
# Drop outliers
df = df.drop(Outliers_to_drop, axis = 0).reset_index(drop=True)
  • 13
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值