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基于Tkinter的HelloWorld入门实例
Jun 17 Python
一百多行python代码实现抢票助手
Sep 25 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
对python判断ip是否可达的实例详解
Jan 31 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
使用Python的turtle模块画国旗
Sep 24 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
Jun 17 Python
Python基于time模块表示时间常用方法
Jun 18 Python
Python drop方法删除列之inplace参数实例
Jun 27 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
Jul 14 Python
Python 利用OpenCV给照片换底色的示例代码
Aug 03 Python
Python极值整数的边界探讨分析
Sep 15 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
PHP4实际应用经验篇(2)
2006/10/09 PHP
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
2013/06/24 PHP
浅析php面向对象public private protected 访问修饰符
2013/06/30 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
YII视图整合kindeditor扩展的方法
2016/07/13 PHP
利用php + Laravel如何实现部署自动化详解
2017/10/11 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
Javascript 错误处理的几种方法
2009/06/13 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
2013/12/23 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
Python yield 小结和实例
2014/04/25 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
一个Python最简单的接口自动化框架
2018/01/02 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
tensorboard显示空白的解决
2020/02/15 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
python绘制雷达图实例讲解
2021/01/03 Python
WiFi云数码相框:Nixplay
2018/07/05 全球购物
《逃家小兔》教学反思
2014/02/23 职场文书
农业局学习党的群众路线教育实践活动心得体会
2014/03/07 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
2015出纳试用期工作总结
2014/12/12 职场文书
少年雷锋观后感
2015/06/10 职场文书
区域销售大会开幕词
2016/03/04 职场文书
导游词之张家口
2019/12/13 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL