前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一文弄懂卡方分箱的原理和应用

一文弄懂卡方分箱的原理和应用

作者头像
阿黎逸阳
发布2024-06-06 20:03:52
1300
发布2024-06-06 20:03:52
举报

风控建模中的分箱方法通常包含有监督分箱和无监督分箱。

其中有监督分箱主要包括:卡方分箱和决策树分箱。无监督分箱主要包括:等距分箱、等频分箱和聚类分箱等。

卡方分箱(ChiMerge)是一种基于统计学原理的特征离散化方法。

其原理在于通过合并具有相似类分布的相邻区间,来减少变量的取值情况并降低变量的复杂度。

具体来说,卡方分箱依赖于卡方检验,即具有最小卡方值的相邻区间会被合并在一起,直到满足确定的停止准则。

卡方分箱的原理和实现比较简单,本文接下来将进行详细阐述。

一、卡方分布

为了更好地理解卡方分箱,我们先来看下卡方分布。

卡方分布(Chi-square Distribution)是概率论与统计学中常用的一种概率分布,也是统计推断里应用最广泛的概率分布之一。

卡方分布的定义基于标准正态分布,其数学定义如下:

若k个独立的随机变量Z1、Z2、……、Zk满足标准正态分布N(0,1),则这k个随机变量的平方和:

为服从自由度为k的卡方分布,记作:

二、卡方检验

卡方检验是以卡方分布为基础的一种假设检验方法。主要用于比较观察值和期望值之间是否存在差异。

这种方法特别适用于分类数据,如性别、教育水平等。

其基本思想是根据样本数据推断总体的分布与期望分布是否有显著差异,或者推断两个分类变量是否相关或者独立。

一般可以设原假设为:观察频数和期望频数没有差异,或者两个变量相互独立不相关,即该因素不会影响到目标变量。

实际应用中,我们先假设原假设成立,计算出卡方值,卡方值的计算公式为:

其中,A为实际频数,E为期望频数。

该假设计算出卡方值,它表示观察值与理论值之间的偏离程度。根据卡方分布及自由度可以确定在原假设成立的情况下获得当前统计量及更极端情况的概率P。

不同自由度下卡方值对应的P值见下表:

其中n列对应自由度,红框中对应P值,不同自由度和P值对应的是卡方值。可以发现相同自由度下,卡方值越大,P值越小。

反过来,如果P值越小,则卡方值越大,说明观察值与理论值偏离程度太大,应当拒绝原假设。

卡方分箱的基本思想在于,对于精确的离散化,相对类频率在一个区间内应当完全一致。

因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并,否则,它们应当保持分开。

而低卡方值表明它们具有相似的类分布。

三、计算卡方值的案例

为了大家对卡方值计算有一个更清晰的理解,本节介绍一个计算卡方值的案例。

假设我们有一组数据,记录了某种病的患者使用了A和B两种不同方案的治疗结果,想弄清这两种疗法是否有明显差异。

具体治疗数据如下:

先设立原假设:A、B两种疗法没有区别。

根据上文介绍的卡方值计算公式:

其中,A为实际频数,E为期望频数。

计算出每个格子的期望频数:

其中A疗法有效类别的期望频数为:43*53/87=26.2,其余计算类似。

接着套卡方值计算公式可得:

总计两个方案,我们选择了其中一个方案,另一个方案也就确定了,所以自由度为1。

查表可得自由度为1,p=0.05的卡方值为3.841。之前也提到相同自由度下,卡方值越大,P值越小。

此例卡方值10.01>3.841,因此p<0.05,说明落在拒绝阈中,也就是原假设不成立,即两种治疗方案有区别。

四、卡方分箱实现步骤

代码语言:javascript
复制
接着介绍卡方分箱的实现步骤:step1:按照属性值的大小进行排序(对于非连续特征,需先做数值转换,如转换成对应响应率、坏样本率等,然后排序),然后每个属性值单独作为一组。step2:对每一对相邻的组,计算卡方值。step3:根据计算的卡方值,对其中最小的一对相邻组进行合并。step4:不断重复step2~step3,直到计算出的卡方值都不低于事先设定的阈值,或者分组数达到一定的条件,比如分为5组。

五、卡方分箱实现代码

最后介绍卡方分箱的实现代码,由于toad包中变量分箱自带卡方分箱,我们直接调用即可。 1 读取数据 首先导入挑选完入模变量后的建模数据,包括12个自变量,1个因变量。具体代码如下: import os import pandas as pd os.chdir(r'E:\date') train_f = pd.read_csv('train_date_f.csv', encoding='gbk') test_f = pd.read_csv('test_date_f.csv', encoding='gbk') train_f = train_f.drop(columns='Unnamed: 0') test_f = test_f.drop(columns='Unnamed: 0') train_f.head(10) 得到结果:可以发现此时的自变量还是原始数据。 2 变量分箱在做变量的WOE变换之前需要先做变量分箱,分箱的好坏直接影响WOE的结果,以及变换后的单调性。toad支持等频分箱、等距分箱、卡方分箱、决策树分箱、最优分箱等。 并且,toad的分箱功能支持数值型数据和离散型数据。 toad首先判断变量类型,如果为数值型就按数值型分箱处理,如果为非数值型,那么会判断变量唯一值的个数,如果大于10个或者超过变量总数的50%,那么也按照数值型处理。 具体代码如下: import toad c = toad.transform.Combiner() #初始化 c.fit(train_f, y = 'target', method = 'chi', min_samples = 0.05) #使用特征筛选后的数据进行训练,使用稳定的卡方分箱,规定每箱至少有5%数据,空值我已经转换成-999999 c.export() 参数详解: train_f:包含自变量和因变量的数据。 y:因变量列名。 method:分箱方法,包括chi(卡方), dt(决策树), kmean(k均值), quantile(等频), step(等距),默认chi。 min_samples: 每箱至少包含样本量,可以是数字或者占比。 c.export:查看分箱节点。 c.fit中还有两个参数,可根据需要进行设置,补充如下: n_bins: 箱数,若无法分出这么多箱,则会分出最多的箱数。 empty_separate: 是否将空值单独分箱,默认是False,即将空值自动归到最佳箱。 得到结果:

可以发现我们只要把method设置为chi,即选用了卡方分箱进行变量分箱。 同时r360_score变量的分割点是490,DXM_score变量的分割点分别是388、 417和 437。 至此,卡方分箱的原理和实现就分享完了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿黎逸阳的代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档