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函数中定义参数的四种方式
Nov 30 Python
Python装饰器的函数式编程详解
Feb 27 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
利用pandas读取中文数据集的方法
Jul 25 Python
对python字典过滤条件的实例详解
Jan 22 Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
Pandas实现一列数据分隔为两列
May 18 Python
pytorch中的weight-initilzation用法
Jun 24 Python
python缩进长度是否统一
Aug 02 Python
解决pytorch下出现multi-target not supported at的一种可能原因
Feb 06 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网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
PHP判断网络文件是否存在的方法
2015/03/12 PHP
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
JavaScript 装逼指南(js另类写法)
2020/05/10 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
python获取元素在数组中索引号的方法
2015/07/15 Python
python学生信息管理系统
2018/03/13 Python
python range()函数取反序遍历sequence的方法
2018/06/25 Python
pygame实现简易飞机大战
2018/09/11 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
Django如何实现网站注册用户邮箱验证功能
2019/08/14 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
Elasticsearch py客户端库安装及使用方法解析
2020/09/14 Python
使用HTML5原生对话框元素并轻松创建模态框组件
2019/03/06 HTML / CSS
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
大学生村官心得体会范文
2014/01/04 职场文书
业务员的岗位职责
2014/03/15 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
入党转正申请报告
2015/05/15 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
深入浅析React中diff算法
2021/05/19 Javascript
win11如何查看端口是否被占用? Win11查看端口是否占用的技巧
2022/04/05 数码科技
python前后端自定义分页器
2022/04/13 Python