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实现网页链接提取的方法分享
Feb 25 Python
Python中编写ORM框架的入门指引
Apr 29 Python
Python模块搜索路径代码详解
Jan 29 Python
Vue的el-scrollbar实现自定义滚动
May 29 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
Python调用.net动态库实现过程解析
Jun 05 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
Python numpy大矩阵运算内存不足如何解决
Nov 19 Python
python pyg2plot的原理知识点总结
Feb 28 Python
Django后端按照日期查询的方法教程
Feb 28 Python
宝塔更新Python及Flask项目的部署
Apr 11 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安全配置方法
2007/06/16 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
原生js制作日历控件实例分享
2016/04/06 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
require.js 加载过程与使用方法介绍
2018/10/30 Javascript
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
浅谈webpack和webpack-cli模块源码分析
2020/01/19 Javascript
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
Django 连接sql server数据库的方法
2018/06/30 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
用python对oracle进行简单性能测试
2020/12/05 Python
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
大学本科毕业生求职信范文
2013/12/18 职场文书
研究生毕业鉴定
2014/01/29 职场文书
《桥》教学反思
2014/04/09 职场文书
施工安全责任书
2014/04/14 职场文书
雷锋精神演讲稿
2014/05/13 职场文书
孩子教育的心得体会
2014/09/01 职场文书
农业项目合作意向书
2015/05/08 职场文书
开天辟地观后感
2015/06/09 职场文书
mysql分表之后如何平滑上线详解
2021/11/01 MySQL