基于分位数的异常值识别

>>> df_outlier = pd.DataFrame({'age':[1,2,30,33,34,35,40,41,42,43,100,200],

'height':[10,20,30,40,150,155,160,165,170,175,300,400],

'weight':[10,20,22,25,100,110,120,130,140,150,133,141]})
>>> df_outlier
    age  height  weight
0     1      10      10
1     2      20      20
2    30      30      22
3    33      40      25
4    34     150     100
5    35     155     110
6    40     160     120
7    41     165     130
8    42     170     140
9    43     175     150
10  100     300     133
11  200     400     141

>>> for col in df_outlier.columns:
    percentile = np.percentile(df_outlier[col],[0,25,50,75,100])
    irq = percentile[3]-percentile[1]
    up_limit = percentile[3]+irq*1.5
    down_limit = percentile[1]-irq*1.5
    df_outlier.loc[(df_outlier[col]>up_limit) | (df_outlier[col]<down_limit),col] = np.nan

    
>>> df_outlier
     age  height  weight
0    NaN    10.0    10.0
1    NaN    20.0    20.0
2   30.0    30.0    22.0
3   33.0    40.0    25.0
4   34.0   150.0   100.0
5   35.0   155.0   110.0
6   40.0   160.0   120.0
7   41.0   165.0   130.0
8   42.0   170.0   140.0
9   43.0   175.0   150.0
10   NaN   300.0   133.0
11   NaN     NaN   141.0

=======================

这种方法是利用箱型图的四分位距(IQR)对异常值进行检测,也叫Tukey‘s test。箱型图的定义如下:

(图片来源:https://blog.csdn.net/weixin_39501270/article/details/77369597,侵删。) 

四分位距(IQR)就是上四分位与下四分位的差值。而我们通过IQR的1.5倍为标准,规定:超过(上四分位+1.5倍IQR距离,或者下四分位-1.5倍IQR距离)的点为异常值。下面是Python中的代码实现,主要使用了numpy的percentile方法。

 
  1. Percentile = np.percentile(df['length'],[0,25,50,75,100])

  2. IQR = Percentile[3] - Percentile[1]

  3. UpLimit = Percentile[3] + IQR*1.5

  4. DownLimit = Percentile[1] - IQR*1.5

也可以使用seaborn的可视化方法boxplot来实现:

 
  1. f,ax=plt.subplots(figsize=(10,8))

  2. sns.boxplot(y='length',data=df,ax=ax)

  3. plt.show()

上图中的菱形点就是异常值。

3 异常值的处理方法

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

  • 删除含有异常值的记录:直接将含有异常值的记录删除;

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

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

  • 不处理:直接在具有异常值的数据集上进行数据挖掘;

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值