4. 特征工程:WOE编码原理、IV值计算与特征筛选、分箱策略
在评分卡建模流程中,特征工程是决定模型性能与稳定性的核心环节。本章聚焦于三个紧密相连的技术模块:WOE编码、IV值计算与特征筛选、分箱策略。这些技术将原始数值或类别特征转化为具有业务可解释性的单调特征,并量化每个特征对目标变量的区分能力。
4.1 WOE编码原理
WOE(Weight of Evidence,证据权重)是一种将分类或连续变量转换为连续型变量的编码方式,其核心思想是用好坏样本分布的对数比来替代原始特征值。WOE编码后的特征天然具有与违约概率的单调关系,非常适合逻辑回归评分卡。
4.1.1 WOE计算公式
对于第 \( i \) 个分箱(或类别),WOE定义为:
WOE_i = ln( (Bad_i / Bad_total) / (Good_i / Good_total) )
= ln( 坏样本占比 / 好样本占比 )
- Bad_i:第 i 箱中坏样本数
- Good_i:第 i 箱中好样本数
- Bad_total:全量坏样本数
- Good_total:全量好样本数
业务解读:WOE > 0 表示该箱坏样本占比高于好样本占比,风险偏高;WOE < 0 表示该箱风险偏低。WOE绝对值越大,该箱对风险的区分能力越强。
4.1.2 WOE编码的单调性要求
评分卡要求每个特征的WOE值随原始特征值单调递增或递减。单调性保证了评分卡的可解释性——特征值越大,风险评分越低(或越高)。
| 分箱区间 | 样本数 | 坏样本数 | 好样本数 | 坏占比 | 好占比 | WOE |
|---|---|---|---|---|---|---|
| [20, 30) | 1000 | 80 | 920 | 0.08 | 0.92 | -2.44 |
| [30, 40) | 1500 | 180 | 1320 | 0.12 | 0.88 | -1.99 |
| [40, 50) | 1200 | 240 | 960 | 0.20 | 0.80 | -1.39 |
| [50, 60) | 800 | 280 | 520 | 0.35 | 0.65 | -0.62 |
| [60, 80] | 500 | 300 | 200 | 0.60 | 0.40 | 0.41 |
上表展示了年龄特征分箱后WOE随年龄增长单调递增的典型模式,符合“年龄越大,违约风险越高”的业务逻辑。
4.2 IV值计算与特征筛选
IV(Information Value,信息量)用于衡量特征对目标变量的预测能力,是评分卡特征筛选的核心指标。IV值基于WOE计算,综合了每个分箱的区分度与样本占比。
4.2.1 IV计算公式
IV = Σ [ (Bad_i / Bad_total - Good_i / Good_total) * WOE_i ]
其中,求和遍历所有分箱。IV值越大,特征区分能力越强。
4.2.2 IV值筛选标准
| IV值范围 | 预测能力 | 处理建议 |
|---|---|---|
| < 0.02 | 无预测能力 | 直接剔除 |
| [0.02, 0.10) | 弱预测能力 | 可保留,需结合业务判断 |
| [0.10, 0.30) | 中等预测能力 | 建议保留 |
| [0.30, 0.50) | 强预测能力 | 优先保留 |
| > 0.50 | 过强(可疑) | 检查是否过拟合或数据泄露 |
注意:IV值过高(>0.5)的特征可能存在数据泄露或过拟合风险,需结合业务逻辑和交叉验证确认其可靠性。在LightGBM评分卡中,IV值过高的特征往往在跨时间验证时PSI漂移严重。
4.2.3 特征筛选流程
- 计算IV值:对所有候选特征进行分箱并计算IV。
- 剔除低IV特征:移除IV < 0.02的特征。
- 检查高IV特征:对IV > 0.5的特征进行业务复核。
- 相关性去重:对保留特征计算相关系数,剔除高度相关(|r| > 0.7)中IV较低的特征。
- PSI预检:对保留特征计算跨时间PSI,剔除PSI > 0.25的不稳定特征。
4.3 分箱策略
分箱是WOE编码和IV计算的前置步骤。好的分箱策略能提升特征的单调性和稳定性。评分卡中常用的分箱方法包括等距分箱、等频分箱、卡方分箱和决策树分箱。
4.3.1 分箱方法对比
| 分箱方法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 等距分箱 | 按数值区间等宽划分 | 简单直观 | 样本分布不均,易出现空箱 | 均匀分布的特征 |
| 等频分箱 | 按样本数量等频划分 | 每箱样本量均衡 | 边界可能不自然 | 偏态分布的特征 |
| 卡方分箱 | 基于卡方检验合并相邻箱 | 保证箱间差异显著 | 计算量大,需调参 | 需要统计显著性的场景 |
| 决策树分箱 | 用单变量决策树寻找最优切分点 | 自动捕捉非线性关系 | 易过拟合 | 特征与目标关系复杂时 |
4.3.2 分箱约束条件
- 每箱样本占比不低于5%:避免小样本导致的WOE不稳定。
- 每箱同时包含好坏样本:避免WOE计算出现无穷大。
- WOE单调性:分箱后WOE必须单调递增或递减。
- 分箱数量:通常控制在3~8箱,过多会降低模型稳定性。
实战建议:在LightGBM评分卡项目中,推荐先使用等频分箱作为初始分箱,再通过卡方分箱合并相邻箱以满足单调性要求。最终分箱方案需在训练集和验证集上分别计算WOE,确保跨时间稳定性。
4.4 WOE编码与分箱流程总览
下图展示了从原始特征到WOE编码特征的整体流程,以及IV值在特征筛选中的位置:
4.5 代码实现:WOE编码与IV计算
以下代码展示了在Python中实现WOE编码和IV计算的核心逻辑,使用Pandas和NumPy:
import pandas as pd
import numpy as np
def calc_woe_iv(df, feature, target):
"""
计算单特征的WOE和IV值
:param df: DataFrame,包含特征和目标列
:param feature: 特征列名
:param target: 目标列名(0=好样本,1=坏样本)
:return: WOE字典, IV值
"""
total_bad = df[target].sum()
total_good = len(df) - total_bad
grouped = df.groupby(feature)[target].agg(['count', 'sum'])
grouped.columns = ['total', 'bad']
grouped['good'] = grouped['total'] - grouped['bad']
grouped['bad_pct'] = grouped['bad'] / total_bad
grouped['good_pct'] = grouped['good'] / 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'] = (grouped['bad_pct'] - grouped['good_pct']) * grouped['WOE']
woe_dict = grouped['WOE'].to_dict()
iv = grouped['IV'].sum()
return woe_dict, iv
# 示例用法
# woe_dict, iv_value = calc_woe_iv(train_data, 'age_bin', 'is_default')
# print(f"特征IV值: {iv_value:.4f}")
代码说明:上述函数假设特征已经完成分箱(feature列存储分箱标签)。实际项目中,需先使用pd.cut()或自定义分箱函数对连续特征进行分箱,再调用calc_woe_iv计算WOE和IV。
4.6 本章小结
- WOE编码将分箱后的特征转换为对数比值,保证与违约概率的单调关系,是评分卡建模的基础。
- IV值量化特征区分能力,IV < 0.02的特征应剔除,IV > 0.5的特征需警惕过拟合。
- 分箱策略需兼顾单调性、样本均衡性和业务可解释性,推荐等频分箱+卡方合并的组合方案。
- 特征筛选需结合IV值、相关性和PSI稳定性三个维度,确保入模特征在时间维度上表现稳健。