【有监督分箱】方法一:卡方分箱

本文介绍了有监督分箱中的卡方分箱方法,详细讲解了卡方分箱的原理、步骤、分箱的用处以及评估指标。通过卡方检验判断相邻区间的相似性,实现数据离散化,适用于金融行业的评分卡建模。同时讨论了分箱过程中的注意事项,如避免因分箱过细导致的WOE计算问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

评分卡建模在金融行业应用得比较广泛,比如对客户的信贷诚信度进行评分。在建模过程中,对连续变量的分箱是一个必不可少的过程。正好我最近的项目也是要做一个积分卡,因此想对分箱做一个较全面的总结。

2.定义

何谓分箱,简单地说,分箱就是将连续变量离散化,将多状态的离散变量合并成少状态。

3.分箱的用处

  1. 离散特征的增加和减少都很容易,易于模型的快速迭代;
  2. 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  3. 列表内容离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
  4. 列表内容逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
  5. 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  6. 列表内容特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
  7. 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。 可以将缺失作为独立的一类带入模型。
  8. 将所有变量变换到相似的尺度上。

4.分箱方法

分箱方法分为无监督分箱和有监督分箱。常用的无监督分箱方法有等频分箱,等距分箱和聚类分箱。有监督分箱主要有best-ks分箱和卡方分箱。基于我的项目中重点应用了卡方分箱,所以这里重点对卡方分箱做些总结。

5.卡方分箱的原理

卡方分箱是自底向上的(即基于合并的)数据离散化方法。它依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。
基本思想:对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。
分箱步骤:
这里写图片描述
这里需要注意初始化时需要对实例进行排序,在排序的基础上进行合并。

卡方阈值的确定:
  根据显著性水平和自由度得到卡方值
  自由度比类别数量小1。例如:有3类,自由度为2,则90%置信度(10%显著性水平)下,卡方的值为4.6。

阈值的意义
  类别和属性独立时,有90%的可能性,计算得到的卡方值会小于4.6。
  大于阈值4.6的卡方值就说明属性和类不是相互独立的,不能合并。如果阈值选的大,区间合并就会进行很多次,离散后的区间数量少、区间大。

6.分完箱之后评估指标

分为箱之后,需要评估。在积分卡模型中,最常用的评估手段是计算出WOE和IV值。对于WOE和IV值的含义,我推荐博客:
https://blog.youkuaiyun.com/kevin7658/article/details/50780391
对于其计算方式,我后面代码会直接给出。

7.直接代码

def Chi2(df, total_col, bad_col,overallRate):
    '''
     #此函数计算卡方值
     :df dataFrame
     :total_col 每个值得总数量
     :bad_col 每个值的坏数据数量
     :overallRate 坏数据的占比
     : return 卡方值
    '''
    df2=df.copy()
    df2['expected']=df[total_col].apply(lambda x: x*overallRate)
    combined=zip(df2['expected'], df2[bad_col])
    chi=[(i[0]-i[1])**2/i[0] for i in combined]
    chi2=sum(chi)
    return chi2

#基于卡方阈值卡方分箱,有个缺点,不好控制分箱个数。
def ChiMerge_MinChisq(df, col, target, confidenceVal=3.841):
    '''
    #此函数是以卡方阈值作为终止条件进行分箱
    : df dataFrame
    : col 被分箱的特征
    : target 目标值,是0,1格式
    : confidenceVal  阈值,自由度为1, 自信度为0.95时,卡方阈值为3.841
    : return 分箱。
    这里有个问题,卡方分箱对分箱的数量没有限制,这样子会导致最后分箱的结果是分箱太细。
    '''
    #对待分箱特征值进行去重
    colLevels=set(df[col])
    
    #count是求得数据条数
    total=df.groupby([col])[target].count()
   
    total=pd.DataFrame({
   'total':total})
 
    #sum是求得特征值的和
    #注意这里的target必须是0,1。要不然这样求bad的数据条数,就没有意义,并且bad是1,good是0。
    bad=df.groupby([col])[target].sum()
    bad=pd.DataFrame({
   'bad':bad})
    #对数据进行合并,求出col,每个值的出现次数(total,bad)
    regroup=total.merge(bad, left_index=True, right_index=True, how='left')
    regroup.reset_index(level=0, inplace=True)
  
    #求出整的数据条数
    N=sum(regroup['total'])
    #求出黑名单的数据条数
    B=sum(regroup['bad'])
    overallRate=B*1.0/N
    
    #对待分箱的特征值进行排序
    colLevels=sorted(list(colLevels))
    groupIntervals=[[i] for i in colLevels]
   
    groupNum=len(groupIntervals)
    while(1):
        if len(groupIntervals) == 1:
            break
        chisqList=[]
        for interval in groupIntervals:
            df2=regroup.loc[regroup[col].isin(interval)]
            chisq=Chi2(df2, 'total', 'bad', overallRate)
            chisqList.append(chisq)

        min_position=chisqList.index(min(chisqList))
    
        if min(chisqList) >= confidenceVal:
            break
        
        if min_position==0:
            combinedPosition=1
        elif min_position== groupNum-1:
            combinedPosition=min_position-1
        else:
            if chisqList[min_position-1]<=chisqList[min_position + 1]:
                combinedPosition=min_position-1
            else:
                combinedPosition=min_position+1
        groupIntervals[min_position]=groupIntervals[min_position]+groupIntervals[c
<think>好的,我现在需要帮用户解答关于“分箱”的问题。首先,回顾之前的对话历史,用户之前询问了数据预处理中的列筛选,也就是特征选择,现在进步问到了分箱。看起来用户可能是在学习数据预处理或特征工程的相关知识,尤其是涉及分箱方法分箱(Chi-Square Binning)我之前了解过,它是种基于统计学的分箱方法,主要用于将连续变量离散化,同时保持类别之间的统计显著性。用户可能需要知道它的基本原理、步骤、优缺点以及应用场景,可能还想了解如何在实际中使用它,比如在Python中的实现。 首先,我需要明确分箱的定义,它是基于检验的有监督分箱方法,目的是将连续变量分成多个区间(箱),使得每个箱内的样本在目标变量上的分布具有统计显著性差异。这有助于提高模型的稳定性和可解释性,特别是对于分类问题,比如信用评分中的好坏客户划分。 接下来,我需要解释分箱的步骤。通常包括初始化、合并相邻箱、计算值、循环合并直到满足停止条件。这里需要注意检验的具体计算方法,比如列联表的构建,统计量的公式,以及如何根据显著性水平或箱的数量来决定停止合并的条件。 然后,要提到分箱的优缺点。优点包括保持统计显著性、自动化分箱、适用于分类问题,缺点可能有对数据分布敏感、需要足够样本量、无法处理单调关系等。用户可能关心这些优缺点在实际应用中的影响,比如样本量不足时是否适用,或者如何处理单调递增的情况。 应用场景面,信用评分、客户分层、特征工程中的离散化处理都是常见的例子。用户可能是在处理这类问题,需要具体的例子来理解何时使用分箱。 此外,用户之前的问题涉及特征选择,而分箱可能用于特征离散化后的进步处理,比如在特征工程阶段。可能需要说明分箱与其他分箱方法(如等宽分箱、等频分箱)的区别,特别是它是有监督方法,依赖于目标变量,而其他方法可能是无监督的。 最后,可能需要提供Python的实现示例,比如使用pandas和scipy中的chi2_contingency函数,或者介绍相关的库如toad,这样用户可以直接应用。但要注意代码的准确性和兼容性,确保示例能运行。 用户可能的深层需求是希望理解分箱的原理和实际应用,以便在项目中正确使用,优化特征处理步骤。他们可能需要知道如何选择合适的参数,比如最小箱数、阈值,以及如何处理分箱后的变量,比如WOE编码等。 需要确保回答结构清晰,分点说明,使用例子帮助理解,并对比其他方法,突出分箱的特点。同时,避免过于技术化的术语,保持解释的易懂性,符合用户的学习需求。</think>### **分箱(Chi-Square Binning)** 分箱种基于统计检验的**有监督分箱方法**,主要用于将连续变量或高基数离散变量(如年龄、收入)**离散化**为若干区间(称为“箱”),同时确保每个箱内的样本在目标变量(如分类标签)上的分布具有统计显著性差异。其核心思想是通过检验(Chi-Square Test)判断相邻区间的分布是否独立,若独立则合并,否则保留。 --- ### **、核心原理** 1. **检验**:通过列联表(Contingency Table)计算相邻两个区间的统计量,判断其分布是否独立。 - **假设检验**: - 原假设(H₀):相邻两箱的样本在目标变量上分布致(独立)。 - 备择假设(H₁):分布不致(依赖)。 - **值计算公式**: $$ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} $$ 其中,$O_{ij}$为实际频数,$E_{ij}$为期望频数(假设独立时的理论频数)。 2. **合并策略**: - 若相邻两箱的值低于阈值(或p值高于显著性水平,如0.05),则认为分布致,合并两箱。 - 重复合并过程,直到所有相邻箱均不满足合并条件。 --- ### **二、操作步骤** 1. **初始化分箱**: - 将连续变量按等频、等宽或单值(离散变量)划分为初始小箱。 2. **迭代合并**: - 计算每对相邻箱的值。 - 合并值最小的相邻箱(即分布最相似的箱)。 3. **终止条件**: - 达到预设的箱数(如最少3箱)。 - 所有相邻箱的值均高于阈值(如p值 < 0.05)。 --- ### **三、核心优势** 1. **保留统计显著性**:分箱后变量与目标变量的关联性更强。 2. **自动化分箱**:无需人工设定分界点。 3. **适应分类问题**:尤其适合二分类(如风控中的好坏客户划分)。 --- ### **四、局限性** 1. **依赖数据分布**:对稀疏数据敏感,小样本区间可能合并不合理。 2. **忽略单调性**:分箱结果可能破坏变量与目标的单调关系(如年龄与风险)。 3. **需预设参数**:如最小箱数、显著性水平等。 --- ### **五、应用场景** 1. **信用评分模型**:将收入、负债率等连续变量分箱,提升逻辑回归效果。 2. **客户分层**:对年龄、消费频次分箱,便于业务解释。 3. **特征工程**:降低高基数离散变量(如城市)的维度。 --- ### **六、Python实现示例** ```python import pandas as pd from scipy.stats import chi2
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值