python 等频分箱_数据分箱:等频分箱,等距分箱,卡方分箱,计算WOE、IV

1.离散的优势:

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

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

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

(4)可以将缺失作为独立的一类带入模型;

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

WOE:

WOE的全称是“Weight of Evidence”,即证据权重,WOE是对原始自变量的一种编码形式。要对一个变量进行WOE编码,需要首先把这个变量进行分箱。分箱后,对于第i组,WOE的计算公式如下:

yi是这个分组中响应客户(即取值为1)的数量,yT是全部样本中所有响应客户(即取值为1)的数量

ni是这个分组中未响应客户(即取值为0)的数量,nT是全部样本中所有未响应客户(即取值为0)的数量

IV值:

IV的全称是Information Value,用来衡量自变量的预测能力

对于分组i的IV值:

计算整个变量的IV值,n为变量分组个数:

过高的IV,可能有潜在的风险

特征分箱越细,IV越高

defcompute_WOE_IV(df,col,target):"""param df:DataFrame|包含feature和label

param col:str|feature名称,col这列已经经过分箱

param taget:str|label名称,0,1

return 每箱的WOE(字典类型)和总的IV之和,注意考虑计算时候分子分母为零的溢出情况"""

importnumpy as np

total= df.groupby([col])[target].count() #计算col每个分组中的样本总数

total = pd.DataFrame({'total': total})

bad= df.groupby([col])[target].sum() #计算col每个分组中的目标取值为1的总数,关注的正样本

bad = pd.DataFrame({'bad': bad})

regroup= total.merge(bad,left_index=True,right_index=True,how='left')

regroup.reset_index(level=0,inplace=True)

N= sum(regroup['total']) #样本总数

B = sum(regroup['bad']) #正样本总数

regroup['good'] = regroup['total'] - regroup['bad'] #计算col每个分组中的目标取值为0的总数,关注的负样本

G = N - B #负样本总数

regroup['bad_pcnt'] = regroup['bad'].map(lambda x: x*1.0/B)

regroup['good_pcnt'] = regroup['good'].map(lambda x: x * 1.0 /G)

regroup["WOE"] = regroup.apply(lambda x:np.log(x.good_pcnt*1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值