原理很简单,初始分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:datavar:variabletarget:target / labelbinnum: the number of bins outputmaxcut: initial bins number '''data=DF[[var,target]]#equifrequent cut the var into maxcut binsdata["cut"],breaks=pd.qcut(data[var],q=maxcut,duplicates="drop",retbins=True)#count 1,0 in each bincount_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 1bins_value=[*zip(breaks[:maxcut-1],breaks[1:],count_0,count_1)]#define woedef 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_0df_woe["bad_rate"]=df_woe.count_1/df_woe.totaldf_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 ivdef 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 backwardsfor 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 forwardsif 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])]breakelse: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 backwardsi = 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 ivprint("箱数:{},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 基于卡方值分箱算法相关推荐

  1. python 卡方分箱算法_python实现二分类的卡方分箱示例

    解决的问题: 1.实现了二分类的卡方分箱: 2.实现了最大分组限定停止条件,和最小阈值限定停止条件: 问题,还不太清楚,后续补充. 1.自由度k,如何来确定,卡方阈值的自由度为 分箱数-1,显著性水平 ...

  2. python 卡方分箱算法_特征工程 - 分箱

    卡方分箱 python自帶分箱函數  --  無法實現對分類型數據的分箱,可借助卡方分箱算法實現 import numpy as np import pandas as pd data = np.ra ...

  3. python实现连续变量最优分箱详解--CART算法

    今天小编就为大家分享一篇python实现连续变量最优分箱详解–CART算法,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 关于变量分箱主要分为两大类:有监督型和无监督型 对应的分箱方 ...

  4. pandas使用cut函数基于分位数进行连续值分箱(手动计算分位数)处理后出现NaN值原因及解决

    pandas使用cut函数基于分位数进行连续值分箱(手动计算分位数)处理后出现NaN值原因及解决 目录 pandas使用cut函数基于分位数进行连续值分箱(手动计算分位数)处理后出现NaN值原因及解决 ...

  5. r k-means 分类结果_R语言信用评分卡:数据分箱(binning)

    作者:黄天元,复旦大学博士在读,热爱数据科学与R,热衷推广R在工业界与学术界的应用.邮箱:huang.tian-yuan@qq.com.欢迎合作交流 library(knitr) opts_chunk ...

  6. 从0到1建立一张评分卡之变量分箱

      变量分箱是评分卡建模流程中的关键环节,可以说是评分卡的核心环节.合理的分箱可以消除变量的量纲影响,而且能减少异常值等噪声数据的影响,有效避免模型过拟合.此外,分箱可以给模型实现业务上的可解释性,可 ...

  7. python 特征选择卡方_特征选择

    2020-01-10 皮尔逊相关系数 image.png 衡量线性相关性,检查数据集里目标和数值特征之间皮尔逊相关系数的绝对值.根据这个准则保留前n个特征.def cor_selector(X, y, ...

  8. python实现卡方(Chi-Squared Test)相关性检验

    python实现卡方(Chi-Squared Test)相关性检验 独立性检验是统计学的一种检验方式,与适合性检验同属于X2检验,即卡方检验(英文名:chi square test),它是根据次数资料 ...

  9. python分箱统计个数_使用python 计算百分位数实现数据分箱代码

    对于百分位数,相信大家都比较熟悉,以下解释源引自百度百科. 百分位数,如果将一组数据从小到大排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数.可表示为:一组n个观测值 ...

  10. Python基于OpenCV的图像去雾算法[完整源码&部署教程]

    1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...

最新文章

  1. 散列算法 SHA-1,SHA-2和SHA-256之间的区别
  2. 树莓派python教程_两个简易的树莓派初学者Python程序
  3. 【Tiny4412】烧写Qt文件系统到SD卡
  4. 卷积神经网络——各种网络的简洁介绍和实现
  5. charles 简单使用
  6. nginx只能访问80端口_nginx 访问不了非80端口
  7. ThreadLocal T类的说明 转载 原作者 lujh99
  8. hadoop框架详细分析
  9. WORD 如何在方框里打勾?
  10. C++超详细STL常用算法总结
  11. C# dataTable实用例
  12. 思科被发现使用华为代码,解释:忘了删
  13. 基础集合论 第一章 3 集合论的公式和条件
  14. 前端的学习之路:初级HTML---图片标签
  15. 人工智能是从什么时候开始发展的?AI的起源
  16. 征集国内操作系统项目列表
  17. Linux安装MySQL遇到的问题及其解决方式
  18. 多人的证件照放在一张纸上怎么排版
  19. AndroidStudio_自定义AndroidStudio Locat的输出颜色
  20. 微信小程序 拍照/从相册中选择图片

热门文章

  1. Google Docs 简介
  2. Invalid bound statement (not found): com.xingyu.demo.mapper.UserMapper.update错误
  3. Redis复习记录(二):数据类型与基本操作
  4. shiro学习详解(开篇)
  5. 微信小程序自定义省市县联动组件
  6. 海思Hi3518E MPP学习_02视频输入(VI模块)
  7. 12代酷睿不再“挤牙膏”,能为英特尔vPro远程办公带来什么?
  8. 平板电脑触摸屏市场现状及未来发展趋势
  9. Python 实现三维建模工具(上)
  10. Apollo选型及优势介绍