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中tell()方法的使用详解
May 24 Python
在Django的URLconf中进行函数导入的方法
Jul 18 Python
打包发布Python模块的方法详解
Sep 18 Python
Python实现Logger打印功能的方法详解
Sep 01 Python
python的socket编程入门
Jan 29 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 Python
Python数据库封装实现代码示例解析
Sep 05 Python
Python APScheduler执行使用方法详解
Dec 10 Python
Python 如何利用ffmpeg 处理视频素材
Nov 27 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
php adodb分页实现代码
2009/03/19 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
2019/10/12 PHP
JQuery 学习笔记 选择器之三
2009/07/23 Javascript
jquery 简单的进度条实现代码
2010/03/11 Javascript
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
2017/02/15 Javascript
JavaScript设计模式之策略模式详解
2017/06/09 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
node.js实现上传文件功能
2019/07/15 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
python生成指定长度的随机数密码
2014/01/23 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
Python中bisect的使用方法
2019/12/31 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
Python中的面向接口编程示例详解
2021/01/17 Python
Waterford加拿大官方网站:世界著名的水晶杯品牌
2016/11/01 全球购物
南京某公司笔试题
2013/01/27 面试题
品牌推广策划方案
2014/05/28 职场文书
会计工作能力自我评价
2015/03/05 职场文书
初中军训感言
2015/08/01 职场文书
家访教师心得体会
2016/01/23 职场文书
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android