数据预处理 -----数据分箱

一、定义

数据分箱(Binning)作为数据预处理的一部分,也被称为离散分箱或数据分段。其实分箱的概念其实很好理解,它的本质上就是把数据进行分组

  • 分箱就是把数据按特定的规则进行分组,实现数据的离散化,增强数据稳定性,减少过拟合风险。逻辑回归中进行分箱是非常必要的,其他树模型可以不进行分箱。

二、分箱原因

在建立逻辑回归模型的过程中,基本都会对特征进行分箱的操作。有些树模型,虽然不是必须,也会对一些特征进行一些分箱,这里主要的原因是增强鲁棒性与避免过拟合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMLWURl7-1624412436437)(在这里插入图片描述
在实际建模中,分箱一般都是针对连续型数据(如价格、销量、年龄)进行的。但是从理论上,分箱也可以对进行。比如,有些分类型数据可取的值非常多,像中国的城市这种数据,这种情况下可以通过分箱,让已经是离散型的数据变得更加离散,比如,城市可以被划分为一级城市、二级城市、三级城市,或者把垃圾分为有害垃圾、可回收垃圾、湿垃圾、干垃圾等等。

所以经过分箱后的数据,有以下如下特点:

  • 数据可取值的范围变小了

  • 数据的可取值会更加确定与稳定

  • 数据中信息会变得模糊,不再那么精确

三、分箱方法与python实现

1、分箱方法

在这里插入图片描述

2、连续型特征的分箱

连续型特征的分箱分为无监督分箱与有监督分箱两类,分别各有2种应用的比较广的方法:

  • 无监督分箱:不需要提供Y,仅凭借特征就能实现分箱
    • 等宽分箱
    • 等频分箱
  • 有监督分箱:需要结合Y的值,通过算法实现分箱
    • 决策树分箱
    • 卡方分箱
  • python实现分箱

等距分箱:pd.cut()

等频分箱:pd.qcut()

import pandas as pd

# 导入一列数据
df = pd.DataFrame({'年龄':[29,7,49,12,50,34,36,75,61,20,3,11]})

df['等距分箱'] = pd.cut(df['年龄'],4)    # 实现等距分箱,分为4个箱
df['等频分箱'] = pd.qcut(df['年龄'],4)    # 实现等频分箱,分为4个箱

df

在这里插入图片描述

3、有监督分箱

有监督分箱相比无监督分箱要复杂一些,主要是因为有监督分箱会应用卡方检验与决策树算法来确定边界。当然,这种方法虽然复杂,但是实际分箱的效果一般会更好,也更加合理。

之所以这两种算法叫有监督分箱,就是因为分箱边界的切分是需要Y的值才能进行的。

  • 决策树分箱:用要进行分箱的这个特征与Y进行决策树的拟合,决策树训练后的结果会提供内部节点的阈值,这个阈值就会成为分箱的边界。

简单点讲,我们如果想对年龄这组数据进行决策树分箱,我们首先要拿到预测目标Y的值。

那么决策树分箱的方法,就是通过这两列数据训练决策树模型,并将结果中树的分支点作为分箱的边界。

一般来说,我们可以直接通过Python中的sklearn拟合决策树,并进行分箱结果提取。但是在Github中,有一个很好用的分箱包scorecardpy,可以直接实现决策树分箱。

示例如下,如图所示,我们不需要输入箱的个数,决策树分箱会自动计算并提供最合理的分箱逻辑。

import pandas as pd
import scorecardpy as sc
 
# 导入两列数据
df = pd.DataFrame({'年龄': [29,7,49,12,50,34,36,75,61,20,3,11],
                   'Y'   : [0,0,1,1,0,1,0,1,1,0,0,0]})

bins = sc.woebin(df, y='Y', method='tree')  # 决策树分箱
sc.woebin_plot(bins)

在这里插入图片描述

  • 卡方分箱:以卡方检验为基础衍生出来的,卡方检验原本是测试数据是否符合卡方分布的。在这里其实就是对两个相邻的区间进行卡方检验,检测它们是否存在分布上的差异。通过卡方分箱得到的箱数是通过预先设定的阈值决定,这个方法有点类似合并同类项,算法会将具有最小卡方值的区间与相邻的最小卡方区间进行合并,合并到分箱个数达到阈值为止。

在Python中,之前提到的scorecardpy包同样可以实现卡方分箱。

import pandas as pd
import scorecardpy as sc
 
# 导入两列数据
df = pd.DataFrame({'年龄': [29,7,49,12,50,34,36,75,61,20,3,11],
                   'Y'   : [0,0,1,1,0,1,0,1,1,0,0,0]})

bins = sc.woebin(df, y='Y', method='chimerge')  # 卡方分箱
sc.woebin_plot(bins)

在这里插入图片描述

四、分箱与算法应用
分箱操作一般只在分类问题中进行,在分类问题中,对逻辑回归算法,分箱是极为重要且必须的。而对于树模型,如lightGBM、XGBoost等模型,分箱不是一个必须操作,但是却能够预防模型的过拟合并使模型的稳定性更好。

就是分类问题中的逻辑回归(LR,Logistic Regression)算法。之所以它必须用分箱,原因是逻辑回归的本质是线性模型,如果不进行分箱,不只特征的鲁棒性会极差,而且会导致模型的倾斜,很可能无法产生很好的结果。

而树模型(lightGBM、XGBoost等)对所有的输入特征都当做数值型对待,如果是离散型的数据,是需要进行One-Hot编码的,即将特征转化为哑变量(Dummy Variables)。因此分箱不是必须的,但是分箱仍然可以帮助模型预防过拟合。需要注意的只是,分箱后,还是需要把数据进行哑变量处理的。

  • 6
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44322234

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值