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中的Matplotlib模块入门教程
Apr 15 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
Nov 07 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
Python tkinter事件高级用法实例
Jan 31 Python
详解Python3的TFTP文件传输
Jun 26 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
python实现LRU热点缓存及原理
Oct 29 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
python openpyxl模块的使用详解
Feb 25 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函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
PHP中set_include_path()函数相关用法分析
2016/07/18 PHP
php的常量和变量实例详解
2017/06/27 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
推荐20家国外的脚本下载网站
2011/04/28 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
基于JavaScript实现的快速排序算法分析
2017/04/14 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
vue.js编译时给生成的文件增加版本号
2018/09/17 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
js编写简易的计算器
2020/07/29 Javascript
使用python实现链表操作
2018/01/26 Python
Python实现购物车购物小程序
2018/04/18 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
世界闻名的衬衫制造商:Savile Row Company
2018/07/30 全球购物
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
搬家公司的创业计划书
2014/01/01 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
通信工程求职信
2014/07/16 职场文书
在校学生证明格式
2015/06/24 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL