python分箱处理_python数据处理--WOE分箱

本文介绍了Python中数据分箱的重要性和多种分箱方法,包括等距分箱、等频分箱、自定义分箱、有监督分箱(决策树分箱)和无监督分箱(卡方分箱)。通过分箱可以增强模型的表达能力、提高鲁棒性、简化逻辑回归模型,同时减少异常数据的影响。文章还提供了具体的Python实现代码示例,如WOE分箱用于信用评分场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据分箱的重要性离散特征的增加和减少都很容易,易于模型的快速迭代;

稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;

离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;

逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;

离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;

特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;

特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。

可以将缺失作为独立的一类带入模型。

将所有变量变换到相似的尺度上。

数据分箱的方法有:

1.等距分箱

def bin_frequency(x,y,n=10):

total=y.count()

bad=y.sum()

good=total-bad

d1=pd.DataFrame({"x":x,"y":y,'bin':pd.qcut(x,n)})

d2=d1.groupby('bin',as_index=True)

d3=pd.DataFrame()

d3['total']=d2.y.count() ##每个箱中的总样本数

d3['bad']=d2.y.sum() ##每个箱中的坏样本数

d3['good']=d3['total']-d3['bad'] ##每个箱中的好样本数

d3['bad_rate']=d3['bad']/d3['total']*100 ##每个箱中的坏样本率

d3['%bad']=d3['bad']/bad*100 ##每个箱中的坏样本占总坏样本的比重

d3['%good']=d3['good']/good*100 ##每个箱中的好样本占总好样本的比重

d3['woe']=np.log(d3['%bad']/d3['%good'])

iv=((d3['%bad']-d3['%good'])*d3['woe']).sum()

d3.reset_index(inplace=True)

print(d3,iv)

2.等频分箱

def bin_distance(x,y,n=10): ##主要woe有可能为-inf

total=y.count()

bad=y.sum()

good=total-bad

d1=pd.DataFrame({"x":x,"y":y,'bin':pd.cut(x,n)}) ##等距分箱

d2=d1.groupby('bin',as_index=True)

d3=pd.DataFrame()

d3['total']=d2.y.count() ##每个箱中的总样本数

d3['bad']=d2.y.sum() ##每个箱中的坏样本数

d3['good']=d3['total']-d3['bad'] ##每个箱中的好样本数

d3['bad_rate']=d3['bad']/d3['total']*100 ##每个箱中的坏样本率

d3['%bad']=d3['bad']/bad*100 ##每个箱中的坏样本占总坏样本的比重

d3['%good']=d3['good']/good*100 ##每个箱中的好样本占总好样本的比重

d3['woe']=np.log(d3['%bad']/d3['%good'])

iv=((d3['%bad']-d3['%good'])*d3['woe']).sum()

d3.reset_index(inplace=True)

print(d3,iv)

3.自定义分箱

def bin_self(x,y,cut): ##cut:自定义分箱(list)

total=y.count()

bad=y.sum()

good=total-bad

d1=pd.DataFrame({"x":x,"y":y,'bin':pd.cut(x,cut)}) ##等距分箱

d2=d1.groupby('bin',as_index=True)

d3=pd.DataFrame()

d3['total']=d2.y.count() ##每个箱中的总样本数

d3['bad']=d2.y.sum() ##每个箱中的坏样本数

d3[&

WOE(Weight of Evidence), 或称为信息增益比率,是用于离散特征编码的一种统计方法,在数据建模中特别适用于分类问题。在Python中,特别是在处理缺失值或进行数据预处理时,WOE被用来对连续变量进行分箱(Binning),将其转换为类别形式以便更好地融入到模型中。 WOE的主要目的是衡量一个特征对于预测目标的影响程度,特别是当这个特征具有非线性关系时。计算过程通常是这样的: 1. **计算基尼指数**(Gini Index):这是一个度量不平等程度的指标,用于衡量某个变量取不同值时,整个样本随机划分后的不确定性。 2. **计算WOE值**:WOE是针对每个特征值,使得基尼系数变化的最大负对数,表示该特征值改变后不确定性下降了多少。 3. **累计WOE**:将所有特征值按照从小到大排序,计算累计的WOE值,通常用作新特征的创建,例如将原始数值映射到一个连续的范围。 Python中没有直接内置的WOE分箱工具,但你可以使用第三方库如`sklearn-preprocessing`中的`WOEEncoder`或者自定义实现。以下是一个简单的例子展示了如何使用`WOEEncoder`: ```python from sklearn.preprocessing import WOEEncoder # 假设你有一个DataFrame df,其中包含要进行WOE编码的列'feature' encoder = WOEEncoder() encoded_df = encoder.fit_transform(df[['feature']]) # 新的DataFrame 'encoded_df'将会有一个新的列'encoded_feature',这是基于'feature'的WOE编码 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值