4. WOE与IV值计算:WOE编码原理、IV值计算与特征筛选、分箱策略

在信用评分卡建模中,原始特征(如年龄、收入、负债率)通常不能直接作为逻辑回归的输入。WOE(Weight of Evidence,证据权重)编码与IV(Information Value,信息量)值是连接原始数据与评分卡模型的核心桥梁。本章将深入讲解WOE的数学原理、IV值的筛选标准以及三种主流分箱策略的实现逻辑。

4.1 WOE编码原理

WOE衡量的是“某个分组中好客户与坏客户的分布差异”。对于二分类目标变量(1=坏客户,0=好客户),第i个分箱的WOE计算公式如下:

WOE_i = ln( (坏客户占比_i) / (好客户占比_i) )
       = ln( (Bad_i / Bad_total) / (Good_i / Good_total) )

WOE编码的核心性质:

  • 单调性:WOE值应随风险水平单调变化,若出现剧烈波动则说明分箱不合理。
  • 符号含义:WOE > 0 表示该箱坏客户占比高于好客户(高风险);WOE < 0 表示低风险。
  • 替代原始值:建模时用WOE值替换原始数值或类别,使逻辑回归系数具有业务可解释性。
实战要点:WOE编码天然处理了缺失值——将缺失单独作为一个分箱,计算其WOE值即可。这避免了传统缺失值填充带来的偏差。
WOE与逻辑回归的关系:WOE编码后的特征,其逻辑回归系数可以直接解读为“该特征每增加一个单位WOE,坏客户对数几率的变化量”。这是评分卡刻度转换的基础。
WOE编码原理与计算流程 原始特征分箱 统计好坏客户数 计算分布占比 WOE = ln( Bad% / Good% ) 证据权重:衡量分箱区分能力 WOE编码映射表(每个分箱→WOE值) WOE > 0 → 该箱坏客户占比高(风险高);WOE < 0 → 该箱好客户占比高(风险低) WOE绝对值越大,该分箱区分好坏客户的能力越强

4.2 IV值计算与特征筛选

IV(Information Value)是WOE的加权和,用于量化一个特征整体对目标变量的预测能力。计算公式如下:

IV = Σ [ (Bad%_i - Good%_i) × WOE_i ]

其中,i遍历所有分箱。IV值越大,特征区分能力越强。

IV值筛选标准

IV值范围 预测能力 处理建议
< 0.02 无预测力 直接剔除
0.02 ~ 0.10 弱预测力 可保留,但需结合业务判断
0.10 ~ 0.30 中等预测力 建议保留
0.30 ~ 0.50 强预测力 优先保留
> 0.50 异常高 需检查是否过拟合或数据泄露
IV值陷阱:IV > 0.50 并不总是好事。在信用评分场景中,过高的IV往往意味着特征与目标存在直接逻辑关联(如“是否逾期”预测“是否违约”),或分箱过细导致过拟合。务必结合业务逻辑进行人工审核。

4.3 分箱策略

分箱(Binning)是WOE/IV计算的前置步骤。好的分箱应满足:每个箱至少包含5%的样本、WOE值单调、箱数控制在3~8个。以下是三种主流分箱策略的对比:

策略 原理 优点 缺点 适用场景
等距分箱 将特征值范围等分为k段 实现简单,边界清晰 对长尾分布不友好,空箱多 均匀分布或已知业务阈值的特征
等频分箱 每个箱包含相同数量的样本 样本分布均匀,避免空箱 边界值可能不自然 大多数连续型特征的首选
决策树分箱 用单变量决策树寻找最优切分点 自动捕捉非线性关系,WOE单调性好 容易过拟合,需设置最小样本数 高基数特征或需要精细分箱时

4.3.1 等频分箱代码示例

import pandas as pd
import numpy as np

def equal_freq_binning(series, n_bins=5):
    """
    等频分箱:每个箱包含大致相同的样本数
    返回:分箱边界列表
    """
    # 使用分位数确定边界
    quantiles = np.linspace(0, 1, n_bins + 1)
    bins = series.quantile(quantiles).values
    # 去重并确保边界唯一
    bins = sorted(set(bins))
    # 处理边界重复的情况
    if len(bins) < n_bins + 1:
        bins = np.percentile(series, np.linspace(0, 100, n_bins + 1))
    return bins

# 示例使用
age = pd.Series([25, 30, 35, 40, 45, 50, 55, 60, 65, 70])
bins = equal_freq_binning(age, n_bins=4)
print("等频分箱边界:", bins)
# 输出: [25.  36.25 47.5  58.75 70. ]

4.3.2 决策树分箱原理

决策树分箱利用CART算法,以目标变量为标签,对单个特征进行二分类树生长。树的分裂点即为分箱边界。关键参数包括:

  • max_depth:控制树深度,间接控制箱数(深度d最多产生2^d个箱)。
  • min_samples_leaf:每个叶节点的最小样本数,防止过拟合。
  • min_impurity_decrease:分裂所需的最小不纯度下降量。
实战建议:在信用评分卡开发中,通常先用等频分箱做初步WOE计算,再对IV值高但WOE不单调的特征使用决策树分箱进行精细化调整。最终分箱方案需经过业务专家评审。
三种分箱策略对比 等距分箱 范围等分:0-20, 20-40, ... 样本分布不均,易出现空箱 ⚠ 长尾分布不适用 等频分箱 每箱样本数 ≈ 总样本 / 箱数 边界由分位数确定 ✓ 连续特征首选 决策树分箱 CART算法自动寻找分裂点 WOE单调性最优 ⚡ 需防过拟合 分箱策略选择决策指南 1. 数据分布均匀 → 等距分箱(简单快速) 2. 连续特征且样本充足 → 等频分箱(稳健) 3. 高IV但WOE不单调 → 决策树分箱(精细化) 4. 最终方案需满足:每箱≥5%样本,WOE单调,箱数3~8个 5. 禁止使用自动分箱后不经过人工审核直接建模

4.4 完整WOE/IV计算流程

以下是一个端到端的WOE与IV计算实现,包含分箱、编码和特征筛选:

import pandas as pd
import numpy as np

def calc_woe_iv(df, feature, target, bins):
    """
    计算单个特征的WOE和IV值
    Parameters:
        df: DataFrame
        feature: 特征名
        target: 目标变量名(1=坏,0=好)
        bins: 分箱边界列表
    Returns:
        woe_df: 包含分箱、WOE、IV的DataFrame
        iv_total: 总IV值
    """
    # 分箱
    df['bin'] = pd.cut(df[feature], bins=bins, include_lowest=True)
    
    # 统计好坏客户数
    grouped = df.groupby('bin')[target].agg(['count', 'sum'])
    grouped.columns = ['total', 'bad']
    grouped['good'] = grouped['total'] - grouped['bad']
    
    # 计算分布占比
    total_bad = grouped['bad'].sum()
    total_good = grouped['good'].sum()
    grouped['bad_pct'] = grouped['bad'] / total_bad
    grouped['good_pct'] = grouped['good'] / total_good
    
    # 计算WOE和IV
    grouped['woe'] = np.log(grouped['bad_pct'] / grouped['good_pct'])
    grouped['iv'] = (grouped['bad_pct'] - grouped['good_pct']) * grouped['woe']
    
    # 处理无穷值
    grouped = grouped.replace([np.inf, -np.inf], 0)
    
    iv_total = grouped['iv'].sum()
    
    return grouped[['total', 'bad', 'good', 'bad_pct', 'good_pct', 'woe', 'iv']], iv_total

# 示例:使用等频分箱计算年龄特征的WOE/IV
bins = equal_freq_binning(df['age'], n_bins=5)
woe_result, iv_value = calc_woe_iv(df, 'age', 'default_flag', bins)
print(f"年龄特征IV值: {iv_value:.4f}")
print(woe_result[['woe', 'iv']])
工程化建议:在生产环境中,WOE编码映射表应持久化存储(如JSON或数据库),用于Serving阶段的实时特征转换。同时,建议对每个特征记录分箱边界和WOE值,便于模型监控和回溯。

4.5 特征筛选实战清单

基于WOE/IV的特征筛选通常遵循以下步骤:

  1. IV初筛:剔除IV < 0.02的特征,保留IV ≥ 0.02的特征。
  2. WOE单调性检查:对保留特征绘制WOE曲线,剔除WOE剧烈波动的特征。
  3. 缺失值处理:缺失率 > 70% 的特征直接剔除;其余特征将缺失作为单独分箱。
  4. 相关性分析:对高相关特征(|r| > 0.7),保留IV值较高的一个。
  5. 业务合规性:剔除法规禁止使用的特征(如种族、性别、宗教等)。

经过上述筛选后,通常保留20~40个特征进入最终的逻辑回归建模阶段。