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 相关文章推荐
Windows下用py2exe将Python程序打包成exe程序的教程
Apr 08 Python
Python实现Kmeans聚类算法
Jun 10 Python
python进行文件对比的方法
Dec 24 Python
对Python3 * 和 ** 运算符详解
Feb 16 Python
python取余运算符知识点详解
Jun 27 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
决策树剪枝算法的python实现方法详解
Sep 18 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
Python通过fnmatch模块实现文件名匹配
Sep 30 Python
PyQt QMainWindow的使用示例
Mar 24 Python
Python OpenCV实现图形检测示例详解
Apr 08 Python
python内置模块之上下文管理contextlib
Jun 14 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动态生成JavaScript代码
2009/03/09 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
JS控制表单提交的方法
2015/07/09 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
jquery判断复选框选中状态以及区分attr和prop
2015/12/18 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
vue Cli 环境删除与重装教程 - 版本文档
2020/09/11 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python中replace方法实例分析
2014/08/20 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
Python global全局变量函数详解
2018/09/18 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
python定时按日期备份MySQL数据并压缩
2019/04/19 Python
在pytorch中为Module和Tensor指定GPU的例子
2019/08/19 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
营业员演讲稿
2013/12/30 职场文书
情侣吵架检讨书
2014/02/05 职场文书
微笑面对生活演讲稿
2014/05/13 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers
python 实现两个变量值进行交换的n种操作
2021/06/02 Python
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL