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解释器相关安装方法
Oct 12 Python
python3 发送任意文件邮件的实例
Jan 23 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
May 08 Python
python3的输入方式及多组输入方法
Oct 17 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Linux 修改Python命令的方法示例
Dec 03 Python
在python 不同时区之间的差值与转换方法
Jan 14 Python
pycharm new project变成灰色的解决方法
Jun 27 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
Python逐行读取文件内容的方法总结
Feb 14 Python
python 可视化库PyG2Plot的使用
Jan 21 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
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
使用php实现截取指定长度
2013/08/06 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
js数据类型检测总结
2018/08/05 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
Python原始字符串(raw strings)用法实例
2014/10/13 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
python编程实现归并排序
2017/04/14 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
django实现将修改好的新模型写入数据库
2020/03/31 Python
python 弧度与角度互转实例
2020/04/15 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
自荐信不宜过于夸大
2013/11/06 职场文书
优秀班集体先进事迹材料
2014/05/28 职场文书
新闻学专业求职信
2014/07/28 职场文书
施工安全汇报材料
2014/08/17 职场文书
整改报告怎么写
2014/11/06 职场文书
2014年店长工作总结
2014/11/17 职场文书
高三复习计划
2015/01/19 职场文书
起诉书格式范文
2015/05/20 职场文书
2015年教师节新闻稿
2015/07/17 职场文书
家电创业计划书
2019/08/05 职场文书