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编程-将Python程序转化为可执行程序[整理]
Apr 09 Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
python 字符串转列表 list 出现\ufeff的解决方法
Jun 22 Python
numpy.random.seed()的使用实例解析
Feb 03 Python
Python应用库大全总结
May 30 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
python自动保存百度盘资源到百度盘中的实例代码
Aug 26 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
python判断字符串以什么结尾的实例方法
Sep 18 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php注销代码(session注销)
2012/05/31 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
JS控制按钮10秒钟后可用的方法
2015/12/22 Javascript
总结几道关于Node.js的面试问题
2017/01/11 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
详解webpack babel的配置
2018/01/09 Javascript
Vue实现点击时间获取时间段查询功能
2020/08/21 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
2019/04/13 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
vue中改变滚动条样式的方法
2020/03/03 Javascript
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
在Python中使用lambda高效操作列表的教程
2015/04/24 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
Django forms组件的使用教程
2018/10/08 Python
python导入模块交叉引用的方法
2019/01/19 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
2019/08/12 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
2020/09/28 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
写好自荐信要注意的问题
2013/11/10 职场文书
我的老师教学反思
2014/05/01 职场文书
个人课题方案
2014/05/08 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
综治目标管理责任书
2015/05/11 职场文书
公司的力量观后感
2015/06/05 职场文书
Python 语言实现六大查找算法
2021/06/30 Python