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,坏客户对数几率的变化量”。这是评分卡刻度转换的基础。
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不单调的特征使用决策树分箱进行精细化调整。最终分箱方案需经过业务专家评审。
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的特征筛选通常遵循以下步骤:
- IV初筛:剔除IV < 0.02的特征,保留IV ≥ 0.02的特征。
- WOE单调性检查:对保留特征绘制WOE曲线,剔除WOE剧烈波动的特征。
- 缺失值处理:缺失率 > 70% 的特征直接剔除;其余特征将缺失作为单独分箱。
- 相关性分析:对高相关特征(|r| > 0.7),保留IV值较高的一个。
- 业务合规性:剔除法规禁止使用的特征(如种族、性别、宗教等)。
经过上述筛选后,通常保留20~40个特征进入最终的逻辑回归建模阶段。