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 相关文章推荐
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
python删除字符串中指定字符的方法
Aug 13 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
Linux下安装python3.6和第三方库的教程详解
Nov 09 Python
15行Python代码实现网易云热门歌单实例教程
Mar 10 Python
python Tkinter的图片刷新实例
Jun 14 Python
python实现屏保程序(适用于背单词)
Jul 30 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
pandas DataFrame.shift()函数的具体使用
May 24 Python
用python画城市轮播地图
May 28 Python
python脚本框架webpy的url映射详解
Nov 20 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
zf框架的registry(注册表)使用示例
2014/03/13 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
javascript结合fileReader 实现上传图片
2015/01/30 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
jQuery取消特定的click事件
2016/02/29 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
vue内置组件transition简单原理图文详解(小结)
2018/07/12 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
如何在JavaScript中等分数组的实现
2020/12/13 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
Python实现的RSS阅读器实例
2015/07/25 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
银行实习生自我鉴定范文
2013/09/19 职场文书
法人代表委托书
2014/04/04 职场文书
班干部演讲稿
2014/04/24 职场文书
机械操作工岗位职责
2014/08/08 职场文书
建筑横幅标语
2014/10/09 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
学前班学生评语
2014/12/29 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
社会实践心得体会范文
2016/01/14 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android