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兔子毒药问题实例分析
Mar 05 Python
python的re正则表达式实例代码
Jan 24 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
python实现旋转和水平翻转的方法
Oct 25 Python
python判断完全平方数的方法
Nov 13 Python
django query模块
Apr 20 Python
Django中间件基础用法详解
Jul 18 Python
Python lxml模块的基本使用方法分析
Dec 21 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Nov 11 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
使用VisualStudio开发php的图文设置方法
2010/08/21 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
layui实现table加载的示例代码
2018/08/14 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
JS实现旋转木马轮播图
2020/01/01 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
python3中的eval和exec的区别与联系
2019/10/10 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
Python函数生成器原理及使用详解
2020/03/12 Python
python利用opencv保存、播放视频
2020/11/02 Python
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
给医务人员表扬信
2014/01/12 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
培训后的感想
2015/08/07 职场文书
辞职报告(范文三篇)
2019/08/27 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
python 模块重载的五种方法
2021/04/24 Python