在上篇文章中,介绍了卡方分箱的基本思想和方法,都是概念性的东西,也没有给出具体的代码实现。这篇文章就来介绍下小编写的ChiMerge算法的实现。
卡方值计算
计算卡方值的函数需要输入numpy格式的频数表。对于pandas数据集,只需使用pd.crosstab计算即可,例如变量“总账户数” 与 目标变量 “是否坏客户” 的频数表,如下图:
每一行代表一个区间(组)的频数,如上图中第一行表示 总账户数在[2,3) 这个组内对应的好客户3个, 坏客户1个。
将频数表转成numpy数组,然后调用函数计算卡方值,计算逻辑如下:
1) 计算第 i 行的总数。
2) 计算第 j 列的总数。
3) 计算总频数 N。
4) 计算 第 i,j 格的期望频数。
5)求的每个格中的卡方:
6) 由于期望频数 Ei,j有可能是0,此时上一步计算出来的结果无意义,需要清除,不计入最终结果。
7) 把所有格的卡方相加得到卡方值。
代码如下
'author:xiaodongxu&monica'
ChiMerge分箱算法
卡方分箱函数可以根据最大分组数目和卡方阈值来控制最终的分箱数。
如果调用时既没有设置最大分组数,也没有指定阈值,那么函数会自动使用95%的置信度设置阈值。
分箱逻辑是:
1)初始时,所有变量值都自成一组,统计频数。
2)然后按照各组起始值从小到大,依次扫描,取出两组拼成计算卡方值。
如果当前计算出的卡方值小于已观察到的最小卡方值,则标记当前坐标,并更新已观察最小卡方值为当前值。
3)扫描一遍后,如果当前分组数大于最大分组数,或者最小卡方值小于阈值,就将最小卡方值对应的两组频数合并,区间也合并。并回第2步执行。否则,停止合并。输出当前各组的区间切分点。
代码如下
'author:xiaodongxu&monica'
变量值转分组
卡方分箱完成后,得到了各个分组的区间起始值。对于任给的一个变量值x,可以使用如下的函数获得分组值。
代码如下
'author:xiaodongxu&monica'
需要注意的是,如果需要转换的值x不在分箱区间之内,很有可能是异常值,不应该期望上面的函数来处理这种情况,而应采用专门的异常值处理程序。
评分卡建模中的使用实例
下面介绍一下评分卡建模中的卡方分箱的使用。先来看看数据集。
除了y变量外,还有3个变量:贷款额度(loan_amnt,数值型),总账户数(total_acc,数值型),地址州(addr_state,类别型)。
对总账户数total_acc进行分箱:
根据分箱结果进行转换,衍生新的分组变量:
现在已经将 total_acc衍生成为新的类别型变量 total_acc_chi2_group ,接下来可以用WOE编码继续加工,然后进入模型啦。
本篇文章就到这了,小编学识浅薄,如有不当之处,请多多指教。
谢谢支持~
领取专属 10元无门槛券
私享最新 技术干货