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中使用ConfigParser解析ini配置文件实例
Aug 30 Python
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
TensorFlow变量管理详解
Mar 10 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
Python 脚本获取ES 存储容量的实例
Dec 27 Python
完美解决python3.7 pip升级 拒绝访问问题
Jul 12 Python
Python matplotlib模块及柱状图用法解析
Aug 10 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
浅析python连接数据库的重要事项
Feb 22 Python
tensorboard 可视化之localhost:6006不显示的解决方案
May 22 Python
Python合并多张图片成PDF
Jun 09 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抽象工厂模式(Elgg)
2010/03/21 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
浅析PHP文件下载原理
2014/12/25 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
javascript hashtable 修正版 下载
2010/12/30 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
python 字符串转列表 list 出现\ufeff的解决方法
2017/06/22 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
Django REST framework内置路由用法
2019/07/26 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
python中return如何写
2020/06/18 Python
python实现canny边缘检测
2020/09/14 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
CSS3中的常用选择器使用示例整理
2016/06/13 HTML / CSS
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
希尔顿酒店官方网站:Hilton Hotels
2017/06/01 全球购物
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
思想品德课教学反思
2014/02/10 职场文书
应聘会计求职信
2014/06/11 职场文书
金融专业求职信
2014/08/05 职场文书
党员作风建设自查报告
2014/10/23 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python