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 相关文章推荐
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
Jan 19 Python
python实现的jpg格式图片修复代码
Apr 21 Python
分享一个简单的python读写文件脚本
Nov 25 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
让Django支持Sql Server作后端数据库的方法
May 29 Python
Python错误处理操作示例
Jul 18 Python
python爬取淘宝商品销量信息
Nov 16 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
python实现滑雪者小游戏
Feb 22 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
Mar 06 Python
用Python进行websocket接口测试
Oct 16 Python
tensorflow2.0教程之Keras快速入门
Feb 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
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
详解前端构建工具gulpjs的使用介绍及技巧
2017/01/19 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
微信小程序实现录音时的麦克风动画效果实例
2019/05/18 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
Python 返回汉字的汉语拼音
2009/02/27 Python
python找出因数与质因数的方法
2019/07/25 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
英国最大的香水商店:The Fragrance Shop
2018/07/06 全球购物
药学专业学生的自我评价分享
2014/02/06 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
《故都的秋》教学反思
2014/04/15 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
公司员工违纪检讨书
2015/05/05 职场文书
运动会报道稿大全
2015/07/23 职场文书
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技