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 相关文章推荐
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
Python 实现文件的全备份和差异备份详解
Dec 27 Python
深入理解Python中range和xrange的区别
Nov 26 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
Pandas过滤dataframe中包含特定字符串的数据方法
Nov 07 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
详解Python中is和==的区别
Mar 21 Python
详解如何用TensorFlow训练和识别/分类自定义图片
Aug 05 Python
python实现批量文件重命名
Oct 31 Python
Python+uiautomator2实现自动刷抖音视频功能
Apr 29 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
教你IIS6的PHP最佳配置方法
2006/09/05 PHP
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
PHP取进制余数函数代码
2012/01/19 PHP
php自定义session示例分享
2014/04/22 PHP
2款PHP无限级分类实例代码
2015/11/11 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
在html中引入外部js文件,并调用带参函数的方法
2016/10/31 Javascript
利用jquery获取select下拉框的值
2016/11/23 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
[01:46]新英雄登场
2019/09/10 DOTA
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
pandas 两列时间相减换算为秒的方法
2018/04/20 Python
python中subprocess批量执行linux命令
2018/04/27 Python
python射线法判断检测点是否位于区域外接矩形内
2019/06/28 Python
Django实现基于类的分页功能
2019/10/31 Python
HTML5印章绘制电子签章图片(中文英文椭圆章、中文英文椭圆印章)
2019/06/03 HTML / CSS
英国最大的电脑零售连锁店集团:PC World
2016/10/10 全球购物
J2EE是技术还是平台还是框架
2016/08/14 面试题
优秀的茶餐厅创业计划书
2014/01/03 职场文书
《口技》教学反思
2014/02/21 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
网站推广策划方案
2014/06/04 职场文书
2014年信访维稳工作总结
2014/12/08 职场文书
摩登时代观后感
2015/06/03 职场文书
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记