4. 特征工程与分箱:连续变量分箱方法、WOE与IV值计算、特征筛选

在风控评分卡开发中,原始连续变量(如年龄、收入、负债比)不能直接进入逻辑回归模型。必须通过分箱(Binning)将连续变量离散化,再计算每个分箱的WOE(Weight of Evidence,证据权重)和IV(Information Value,信息量),最终筛选出预测能力最强的特征。本章将完整讲解这一核心流程。

4.1 连续变量分箱方法

分箱的目的是将连续变量转化为有序的类别变量,同时保持与目标变量(好坏客户)的单调关系。常用的分箱方法有三种:等距分箱、等频分箱和卡方分箱。

分箱方法 原理 优点 缺点 适用场景
等距分箱 将变量取值范围等分为k个区间,每个区间宽度相同 实现简单,计算速度快 容易导致样本分布不均,部分区间可能无样本或坏样本为0 变量分布均匀、无极端值时使用
等频分箱 将样本按变量值排序后等分为k份,每份样本量相同 保证每个区间样本量均衡,避免空箱 可能将相近数值强行分到不同区间,破坏单调性 样本量充足、变量分布偏态时常用
卡方分箱 基于卡方检验的合并算法,自底向上合并相邻区间,直到满足显著性阈值 自动寻找最优切分点,保证区间内好坏分布差异显著 计算复杂度高,对参数敏感 需要精细分箱、追求模型性能时首选
实践建议:在风控评分卡开发中,通常先用等频分箱做初始分箱(5~10箱),再结合业务经验手动调整边界,最后用卡方分箱做自动化合并。纯等距分箱在风控中较少单独使用。

4.2 WOE与IV值计算

分箱完成后,需要将每个分箱转化为WOE值,并计算整个变量的IV值来评估预测能力。

4.2.1 WOE计算公式

对于第i个分箱,WOE定义为:

WOE_i = ln( (坏样本占比_i) / (好样本占比_i) )
       = ln( (Bad_i / Bad_total) / (Good_i / Good_total) )
  • WOE > 0:该分箱中坏样本比例高于好样本比例,风险较高。
  • WOE < 0:该分箱中好样本比例高于坏样本比例,风险较低。
  • WOE = 0:该分箱无区分能力。

4.2.2 IV值计算公式与评估标准

IV值衡量变量整体预测能力:

IV = Σ ( (Bad_i / Bad_total) - (Good_i / Good_total) ) × WOE_i
IV值范围 预测能力 处理建议
< 0.02 无预测能力 直接剔除
0.02 ~ 0.10 弱预测能力 可保留,但需结合业务判断
0.10 ~ 0.30 中等预测能力 优先保留
0.30 ~ 0.50 强预测能力 核心特征,必须保留
> 0.50 可疑/过强 需检查是否过拟合或数据泄露
注意:IV值过高(>0.5)不一定好,可能意味着该变量与目标变量存在逻辑泄露(如“是否逾期”与“逾期天数”同时入模)。务必结合业务逻辑验证。

4.3 特征筛选流程

特征筛选是连接分箱与建模的桥梁,通常按以下步骤执行:

  1. 缺失率筛选:剔除缺失率 > 70% 的特征。
  2. IV值筛选:保留 IV > 0.02 的特征。
  3. 相关性筛选:对高度相关(|r| > 0.7)的特征对,保留IV值较高的一个。
  4. 单调性检查:检查分箱后WOE是否单调递增或递减,若不单调则调整分箱边界。
  5. 业务可解释性确认:与业务方确认特征逻辑是否合理。

4.4 分箱与WOE计算代码示例

以下代码演示使用Python对“年龄”变量进行等频分箱并计算WOE/IV:

import pandas as pd
import numpy as np

def woe_iv_calc(df, feature, target):
    """
    计算单变量的WOE和IV值
    :param df: DataFrame,包含特征和目标变量
    :param feature: 特征列名
    :param target: 目标列名(0=好客户,1=坏客户)
    :return: WOE DataFrame, IV值
    """
    total_bad = df[target].sum()
    total_good = len(df) - total_bad
    
    # 等频分箱(5箱)
    df['bin'] = pd.qcut(df[feature], q=5, duplicates='drop')
    
    grouped = df.groupby('bin', observed=False)[target].agg(
        bad_count='sum',
        total_count='count'
    ).reset_index()
    
    grouped['good_count'] = grouped['total_count'] - grouped['bad_count']
    grouped['bad_pct'] = grouped['bad_count'] / total_bad
    grouped['good_pct'] = grouped['good_count'] / total_good
    
    # 避免除零
    grouped['bad_pct'] = grouped['bad_pct'].replace(0, 0.0001)
    grouped['good_pct'] = grouped['good_pct'].replace(0, 0.0001)
    
    grouped['WOE'] = np.log(grouped['bad_pct'] / grouped['good_pct'])
    grouped['IV_contrib'] = (grouped['bad_pct'] - grouped['good_pct']) * grouped['WOE']
    
    iv = grouped['IV_contrib'].sum()
    return grouped[['bin', 'bad_count', 'good_count', 'bad_pct', 'good_pct', 'WOE', 'IV_contrib']], iv

# 示例调用
# woe_df, iv_value = woe_iv_calc(loan_data, 'age', 'is_default')
# print(f"IV = {iv_value:.4f}")
# print(woe_df)

4.5 分箱与特征筛选整体流程

下图展示了从原始连续变量到最终特征筛选的完整数据流:

连续变量分箱与特征筛选流程 原始连续变量 分箱方法:等距 / 等频 / 卡方 分箱结果(k个区间) WOE计算 + IV值评估 特征筛选:IV>0.02 + 单调性 + 相关性 输入数据要求 • 已清洗缺失值 • 已处理异常值 • 目标变量已定义 输出结果 • 保留特征列表 • 各分箱WOE映射表

4.6 分箱后单调性检查

WOE的单调性是评分卡可解释性的关键。以下是一个典型的单调WOE模式示例:

年龄分箱 样本数 坏样本数 坏样本占比 WOE 风险趋势
[18, 25) 1200 180 15.0% 0.42 高
[25, 35) 2500 250 10.0% 0.10 中高
[35, 45) 2800 196 7.0% -0.22 中低
[45, 55) 1800 90 5.0% -0.59 低
[55, 65] 700 28 4.0% -0.82 最低

上表中WOE随年龄增长单调递减,说明年龄越大风险越低,符合业务直觉。若出现WOE先升后降的“U型”或“倒U型”模式,需要重新调整分箱边界或考虑变量变换。

关键原则:分箱后的WOE必须保持单调性(单调递增或递减),这是评分卡可解释性的基石。如果无法通过调整分箱实现单调,应考虑剔除该变量或使用其他特征工程方法。

4.7 本章小结

  • 分箱方法:等距分箱简单但易失衡;等频分箱保证样本均衡;卡方分箱自动优化边界,是风控首选。
  • WOE/IV计算:WOE量化每个分箱的风险水平,IV评估变量整体预测能力,IV > 0.02为保留门槛。
  • 特征筛选:综合缺失率、IV值、相关性、单调性和业务逻辑,确保入模特征既有效又可解释。
  • 代码实现:使用pandas的qcut进行等频分箱,结合groupby计算WOE和IV,形成可复用的特征工程流水线。