python 基于卡方值分箱算法的实现示例


Posted in Python onJuly 17, 2020

原理很简单,初始分20箱或更多,先确保每箱中都含有0,1标签,对不包含0,1标签的箱向前合并,计算各箱卡方值,对卡方值最小的箱向后合并,代码如下

import pandas as pd
import numpy as np
import scipy
from scipy import stats
def chi_bin(DF,var,target,binnum=5,maxcut=20):
  '''
  DF:data
  var:variable
  target:target / label
  binnum: the number of bins output
  maxcut: initial bins number 
  '''
  
  data=DF[[var,target]]
  #equifrequent cut the var into maxcut bins
  data["cut"],breaks=pd.qcut(data[var],q=maxcut,duplicates="drop",retbins=True)
  #count 1,0 in each bin
  count_1=data.loc[data[target]==1].groupby("cut")[target].count()
  count_0=data.loc[data[target]==0].groupby("cut")[target].count()
  #get bins value: min,max,count 0,count 1
  bins_value=[*zip(breaks[:maxcut-1],breaks[1:],count_0,count_1)]
  #define woe
  def woe_value(bins_value):
    df_woe=pd.DataFrame(bins_value)
    df_woe.columns=["min","max","count_0","count_1"]
    df_woe["total"]=df_woe.count_1+df_woe.count_0
    df_woe["bad_rate"]=df_woe.count_1/df_woe.total
    df_woe["woe"]=np.log((df_woe.count_0/df_woe.count_0.sum())/(df_woe.count_1/df_woe.count_1.sum()))
    return df_woe
  #define iv
  def iv_value(df_woe):
    rate=(df_woe.count_0/df_woe.count_0.sum())-(df_woe.count_1/df_woe.count_1.sum())
    iv=np.sum(rate * df_woe.woe)
    return iv
  #make sure every bin contain 1 and 0
  ##first bin merge backwards
  for i in range(len(bins_value)):
    if 0 in bins_value[0][2:]:
      bins_value[0:2]=[(
        bins_value[0][0],
        bins_value[1][1],
        bins_value[0][2]+bins_value[1][2],
        bins_value[0][3]+bins_value[1][3])]
      continue
  ##bins merge forwards
    if 0 in bins_value[i][2:]:
      bins_value[i-1:i+1]=[(
        bins_value[i-1][0],
        bins_value[i][1],
        bins_value[i-1][2]+bins_value[i][2],
        bins_value[i-1][3]+bins_value[i][3])]
      break
    else:
      break
  
  #calculate chi-square merge the minimum chisquare    
  while len(bins_value)>binnum:
    chi_squares=[]
    for i in range(len(bins_value)-1):
      a=bins_value[i][2:]
      b=bins_value[i+1][2:]
      chi_square=scipy.stats.chi2_contingency([a,b])[0]
      chi_squares.append(chi_square)
  #merge the minimum chisquare backwards
    i = chi_squares.index(min(chi_squares))
               
    bins_value[i:i+2]=[(
      bins_value[i][0],
      bins_value[i+1][1],
      bins_value[i][2]+bins_value[i+1][2],
      bins_value[i][3]+bins_value[i+1][3])]
    
    df_woe=woe_value(bins_value)
    
  #print bin number and iv
    print("箱数:{},iv:{:.6f}".format(len(bins_value),iv_value(df_woe)))
  #return bins and woe information 
  return woe_value(bins_value)

以下是效果:

初始分成10箱,目标为3箱

chi_bin(data,"age","SeriousDlqin2yrs",binnum=3,maxcut=10)

箱数:8,iv:0.184862
箱数:7,iv:0.184128
箱数:6,iv:0.179518
箱数:5,iv:0.176980
箱数:4,iv:0.172406
箱数:3,iv:0.160015
min max count_0 count_1 total bad_rate woe
0 0.0 52.0 70293 7077 77370 0.091470 -0.266233
1 52.0 61.0 29318 1774 31092 0.057056 0.242909
2 61.0 72.0 26332 865 27197 0.031805 0.853755

到此这篇关于python 基于卡方值分箱算法的实现示例的文章就介绍到这了,更多相关python 卡方值分箱算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python模块学习 re 正则表达式
May 19 Python
Python中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
Python列表生成器的循环技巧分享
Mar 06 Python
python中字符串前面加r的作用
Jun 04 Python
python数据类型_字符串常用操作(详解)
May 30 Python
python 利用栈和队列模拟递归的过程
May 29 Python
python的依赖管理的实现
May 14 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
Python使用OpenPyXL处理Excel表格
Jul 02 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
python实现双向链表原理
May 25 Python
Python DES加密实现原理及实例解析
Jul 17 #Python
python获取系统内存占用信息的实例方法
Jul 17 #Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 #Python
深入了解Python enumerate和zip
Jul 16 #Python
详细分析Python collections工具库
Jul 16 #Python
带你学习Python如何实现回归树模型
Jul 16 #Python
MATLAB数学建模之画图汇总
Jul 16 #Python
You might like
php学习 函数 课件
2008/06/15 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
2014/07/25 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
PHP编程实现csv文件导入mysql数据库的方法
2017/04/29 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
jquery 经典动画菜单效果代码
2010/01/26 Javascript
jquery.Jwin.js 基于jquery的弹出层插件代码
2012/05/23 Javascript
js获取ajax返回值代码
2014/04/30 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
Vue中Table组件Select的勾选和取消勾选事件详解
2019/03/19 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
Python argparse模块使用方法解析
2020/02/20 Python
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
提高EJB性能都有哪些技巧
2012/03/25 面试题
公司企业表扬信
2014/01/11 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技