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简单删除目录下文件以及文件夹的方法
May 27 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
Python中Threading用法详解
Dec 27 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
Python脚本修改阿里云的访问控制列表的方法
Mar 08 Python
选择Python写网络爬虫的优势和理由
Jul 07 Python
详解Django模版中加载静态文件配置方法
Jul 21 Python
python实现知乎高颜值图片爬取
Aug 12 Python
python实现坦克大战
Apr 24 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 Python
k-means & DBSCAN 总结
Apr 27 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
第六节 访问属性和方法 [6]
2006/10/09 PHP
构建简单的Webmail系统
2006/10/09 PHP
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
discuz的php防止sql注入函数
2011/01/17 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
php简单的上传类分享
2016/05/15 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
Javascript入门学习资料收集整理篇
2008/07/06 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
JavaScript组合模式学习要点
2016/08/26 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
2018/09/22 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
解决vue页面渲染但dom没渲染的操作
2020/07/27 Javascript
使用graphics.py实现2048小游戏
2015/03/10 Python
基于python的字节编译详解
2017/09/20 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
Python基于爬虫实现全网搜索并下载音乐
2021/02/14 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
女大学生个人求职信
2013/12/09 职场文书
企业厂长岗位职责
2013/12/17 职场文书
英语专业求职信
2014/07/08 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
地道战观后感300字
2015/06/04 职场文书
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL