4. 特征工程基础:特征衍生、特征选择、WOE编码、IV值计算
特征工程是信用评分模型开发中最具创造性与业务深度的环节。原始数据通常无法直接用于逻辑回归或决策树建模,必须经过衍生、筛选、编码与评估四个步骤,才能转化为稳定、可解释且具有预测力的特征变量。本章将系统讲解这四大核心模块,并重点介绍WOE编码与IV值在评分卡中的独特地位。
核心观点:特征工程的质量直接决定模型性能的上限。在信用评分领域,WOE编码不仅解决了类别变量的数值化问题,更天然地建立了变量与坏账率之间的单调关系,是评分卡可解释性的基石。
4.1 特征衍生:从原始数据中挖掘信息
特征衍生是指基于业务逻辑与统计变换,从原始字段中创建新的预测变量。常见的衍生方法包括:
- 数值变换:对数变换、平方根变换、Box-Cox变换,用于修正偏态分布。
- 组合特征:收入/负债比、信用卡使用率(余额/额度)、近6个月查询次数/授信机构数。
- 时间窗口统计:近3/6/12个月的平均逾期天数、最大逾期金额、还款波动率。
- 交叉特征:年龄×职业、收入×学历、地区×行业风险等级。
- 比率与差值:收入-支出、当前余额-历史最低余额、申请金额/年收入。
实战建议:特征衍生应遵循“业务驱动+数据验证”原则。先基于信贷审批经验列出候选衍生逻辑,再通过IV值与缺失率筛选,避免盲目生成大量无效特征。
4.2 特征选择:去芜存菁
特征选择的目标是剔除冗余、噪声与高相关性变量,提升模型泛化能力与训练效率。信用评分模型中常用的选择方法分为三类:
| 方法类别 | 代表技术 | 适用场景 | 注意事项 |
|---|---|---|---|
| 过滤法 | IV值排序、方差阈值、相关系数 | 初步筛选,快速排除低信息量变量 | 忽略特征间交互作用 |
| 包裹法 | 递归特征消除(RFE)、前向选择 | 特征数较少时追求最优子集 | 计算成本高,易过拟合 |
| 嵌入法 | Lasso回归、随机森林特征重要性 | 高维数据,自动选择与建模同步 | 需调整正则化参数 |
在评分卡实践中,通常采用“过滤法+包裹法”的两阶段策略:先用IV值筛选出预测力较强的变量,再通过逐步回归或Lasso进行精细化选择。
4.3 WOE编码:证据权重变换
WOE(Weight of Evidence,证据权重)是评分卡模型中最核心的变量编码方式。它将原始变量(连续或离散)映射为与目标变量(好坏客户)的对数 odds 相关的数值。
WOE的计算公式为:
WOE_i = ln( (好客户在分组i中的占比) / (坏客户在分组i中的占比) )
= ln( (Good_i / Good_total) / (Bad_i / Bad_total) )
WOE编码的核心优势:
- 单调性约束:WOE值通常与坏账率呈单调关系,便于逻辑回归系数解释。
- 缺失值处理:缺失值可单独作为一个分组计算WOE,无需填充。
- 异常值鲁棒:通过分箱将极端值合并,降低噪声影响。
- 线性化:将非线性关系转化为线性关系,提升逻辑回归拟合效果。
常见陷阱:WOE编码要求每个分组同时包含好客户与坏客户。若某分组坏客户数为0,WOE将趋向无穷大,此时需与相邻组合并或进行平滑处理(如加0.5修正)。
4.4 IV值计算:变量预测力评估
IV(Information Value,信息量)是衡量变量对好坏客户区分能力的核心指标。它基于WOE值加权求和得到:
IV = Σ [ (Good_i/Good_total - Bad_i/Bad_total) × WOE_i ]
IV值的评价标准在业界已形成共识:
| IV值范围 | 预测力评价 | 建模建议 |
|---|---|---|
| < 0.02 | 无预测力 | 直接剔除 |
| 0.02 – 0.10 | 弱预测力 | 可结合业务判断是否保留 |
| 0.10 – 0.30 | 中等预测力 | 优先保留 |
| 0.30 – 0.50 | 强预测力 | 核心变量,必须保留 |
| > 0.50 | 可疑/过强 | 需检查是否包含未来信息或过拟合 |
经验法则:在评分卡开发中,最终入模变量的IV值通常集中在0.05~0.40之间。IV值超过0.50的变量虽然预测力强,但往往存在数据泄露风险(如“当前逾期天数”),需谨慎使用。
4.5 特征工程全流程SVG
下图展示了从原始数据到建模特征的标准流程,包含特征衍生、WOE分箱编码、IV评估与特征选择四个阶段:
4.6 WOE与IV计算示例
以下是一个简化的WOE与IV计算示例,假设某变量“年龄”经过分箱后得到4个分组:
| 年龄分组 | 好客户数 | 坏客户数 | 好客户占比 | 坏客户占比 | WOE | IV贡献 |
|---|---|---|---|---|---|---|
| 18-25 | 500 | 120 | 0.125 | 0.240 | -0.652 | 0.075 |
| 26-35 | 1200 | 200 | 0.300 | 0.400 | -0.288 | 0.029 |
| 36-50 | 1500 | 130 | 0.375 | 0.260 | 0.366 | 0.042 |
| >50 | 800 | 50 | 0.200 | 0.100 | 0.693 | 0.069 |
| 合计 | 4000 | 500 | 1.000 | 1.000 | — | IV=0.215 |
该变量IV值为0.215,属于中等预测力,适合纳入模型。WOE值从低年龄组的负值(坏客户占比高)向高年龄组的正值(好客户占比高)单调递增,符合业务认知。
4.7 WOE编码与IV计算的Python实现
import pandas as pd
import numpy as np
def calc_woe_iv(df, feature, target):
"""
计算单变量的WOE与IV值
df: DataFrame,包含特征与目标变量
feature: 特征列名
target: 目标列名(0=好客户,1=坏客户)
"""
total_good = df[target].sum()
total_bad = len(df) - total_good
grouped = df.groupby(feature)[target].agg(['count', 'sum'])
grouped.columns = ['total', 'bad']
grouped['good'] = grouped['total'] - grouped['bad']
grouped['good_pct'] = grouped['good'] / total_good
grouped['bad_pct'] = grouped['bad'] / total_bad
# 平滑处理:避免除零
grouped['good_pct'] = grouped['good_pct'].replace(0, 0.0001)
grouped['bad_pct'] = grouped['bad_pct'].replace(0, 0.0001)
grouped['WOE'] = np.log(grouped['good_pct'] / grouped['bad_pct'])
grouped['IV'] = (grouped['good_pct'] - grouped['bad_pct']) * grouped['WOE']
iv_total = grouped['IV'].sum()
return grouped[['total', 'good', 'bad', 'good_pct', 'bad_pct', 'WOE', 'IV']], iv_total
# 使用示例
# df_woe, iv_value = calc_woe_iv(data, 'age_group', 'is_bad')
# print(f"IV = {iv_value:.4f}")
关键提醒:WOE编码与IV值计算是评分卡特征工程的核心环节。WOE保证了变量与目标之间的单调关系,IV提供了客观的变量筛选标准。在实际项目中,建议对每个候选变量进行分箱调优,确保WOE趋势符合业务逻辑,再根据IV值决定是否入模。