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评估与特征选择四个阶段:

特征工程全流程 特征工程全流程:从原始数据到建模特征 原始数据 特征衍生 数值变换 · 组合特征 · 时间窗口 · 交叉特征 WOE分箱编码 等频分箱 · 决策树分箱 · 单调性约束 · 缺失值单独分组 IV值计算与评估 IV < 0.02 剔除 · 0.10~0.30 优先保留 特征选择(过滤+包裹) 相关性分析 · 逐步回归 · Lasso · 最终入模变量 建模特征集

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值决定是否入模。