4. 特征工程与分箱:连续变量分箱方法、WOE与IV值计算、特征筛选
在风控评分卡开发中,原始连续变量(如年龄、收入、负债比)不能直接进入逻辑回归模型。必须通过分箱(Binning)将连续变量离散化,再计算每个分箱的WOE(Weight of Evidence,证据权重)和IV(Information Value,信息量),最终筛选出预测能力最强的特征。本章将完整讲解这一核心流程。
4.1 连续变量分箱方法
分箱的目的是将连续变量转化为有序的类别变量,同时保持与目标变量(好坏客户)的单调关系。常用的分箱方法有三种:等距分箱、等频分箱和卡方分箱。
| 分箱方法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 等距分箱 | 将变量取值范围等分为k个区间,每个区间宽度相同 | 实现简单,计算速度快 | 容易导致样本分布不均,部分区间可能无样本或坏样本为0 | 变量分布均匀、无极端值时使用 |
| 等频分箱 | 将样本按变量值排序后等分为k份,每份样本量相同 | 保证每个区间样本量均衡,避免空箱 | 可能将相近数值强行分到不同区间,破坏单调性 | 样本量充足、变量分布偏态时常用 |
| 卡方分箱 | 基于卡方检验的合并算法,自底向上合并相邻区间,直到满足显著性阈值 | 自动寻找最优切分点,保证区间内好坏分布差异显著 | 计算复杂度高,对参数敏感 | 需要精细分箱、追求模型性能时首选 |
实践建议:在风控评分卡开发中,通常先用等频分箱做初始分箱(5~10箱),再结合业务经验手动调整边界,最后用卡方分箱做自动化合并。纯等距分箱在风控中较少单独使用。
4.2 WOE与IV值计算
分箱完成后,需要将每个分箱转化为WOE值,并计算整个变量的IV值来评估预测能力。
4.2.1 WOE计算公式
对于第i个分箱,WOE定义为:
WOE_i = ln( (坏样本占比_i) / (好样本占比_i) )
= ln( (Bad_i / Bad_total) / (Good_i / Good_total) )
- WOE > 0:该分箱中坏样本比例高于好样本比例,风险较高。
- WOE < 0:该分箱中好样本比例高于坏样本比例,风险较低。
- WOE = 0:该分箱无区分能力。
4.2.2 IV值计算公式与评估标准
IV值衡量变量整体预测能力:
IV = Σ ( (Bad_i / Bad_total) - (Good_i / Good_total) ) × WOE_i
| IV值范围 | 预测能力 | 处理建议 |
|---|---|---|
| < 0.02 | 无预测能力 | 直接剔除 |
| 0.02 ~ 0.10 | 弱预测能力 | 可保留,但需结合业务判断 |
| 0.10 ~ 0.30 | 中等预测能力 | 优先保留 |
| 0.30 ~ 0.50 | 强预测能力 | 核心特征,必须保留 |
| > 0.50 | 可疑/过强 | 需检查是否过拟合或数据泄露 |
注意:IV值过高(>0.5)不一定好,可能意味着该变量与目标变量存在逻辑泄露(如“是否逾期”与“逾期天数”同时入模)。务必结合业务逻辑验证。
4.3 特征筛选流程
特征筛选是连接分箱与建模的桥梁,通常按以下步骤执行:
- 缺失率筛选:剔除缺失率 > 70% 的特征。
- IV值筛选:保留 IV > 0.02 的特征。
- 相关性筛选:对高度相关(|r| > 0.7)的特征对,保留IV值较高的一个。
- 单调性检查:检查分箱后WOE是否单调递增或递减,若不单调则调整分箱边界。
- 业务可解释性确认:与业务方确认特征逻辑是否合理。
4.4 分箱与WOE计算代码示例
以下代码演示使用Python对“年龄”变量进行等频分箱并计算WOE/IV:
import pandas as pd
import numpy as np
def woe_iv_calc(df, feature, target):
"""
计算单变量的WOE和IV值
:param df: DataFrame,包含特征和目标变量
:param feature: 特征列名
:param target: 目标列名(0=好客户,1=坏客户)
:return: WOE DataFrame, IV值
"""
total_bad = df[target].sum()
total_good = len(df) - total_bad
# 等频分箱(5箱)
df['bin'] = pd.qcut(df[feature], q=5, duplicates='drop')
grouped = df.groupby('bin', observed=False)[target].agg(
bad_count='sum',
total_count='count'
).reset_index()
grouped['good_count'] = grouped['total_count'] - grouped['bad_count']
grouped['bad_pct'] = grouped['bad_count'] / total_bad
grouped['good_pct'] = grouped['good_count'] / 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_contrib'] = (grouped['bad_pct'] - grouped['good_pct']) * grouped['WOE']
iv = grouped['IV_contrib'].sum()
return grouped[['bin', 'bad_count', 'good_count', 'bad_pct', 'good_pct', 'WOE', 'IV_contrib']], iv
# 示例调用
# woe_df, iv_value = woe_iv_calc(loan_data, 'age', 'is_default')
# print(f"IV = {iv_value:.4f}")
# print(woe_df)
4.5 分箱与特征筛选整体流程
下图展示了从原始连续变量到最终特征筛选的完整数据流:
4.6 分箱后单调性检查
WOE的单调性是评分卡可解释性的关键。以下是一个典型的单调WOE模式示例:
| 年龄分箱 | 样本数 | 坏样本数 | 坏样本占比 | WOE | 风险趋势 |
|---|---|---|---|---|---|
| [18, 25) | 1200 | 180 | 15.0% | 0.42 | 高 |
| [25, 35) | 2500 | 250 | 10.0% | 0.10 | 中高 |
| [35, 45) | 2800 | 196 | 7.0% | -0.22 | 中低 |
| [45, 55) | 1800 | 90 | 5.0% | -0.59 | 低 |
| [55, 65] | 700 | 28 | 4.0% | -0.82 | 最低 |
上表中WOE随年龄增长单调递减,说明年龄越大风险越低,符合业务直觉。若出现WOE先升后降的“U型”或“倒U型”模式,需要重新调整分箱边界或考虑变量变换。
关键原则:分箱后的WOE必须保持单调性(单调递增或递减),这是评分卡可解释性的基石。如果无法通过调整分箱实现单调,应考虑剔除该变量或使用其他特征工程方法。
4.7 本章小结
- 分箱方法:等距分箱简单但易失衡;等频分箱保证样本均衡;卡方分箱自动优化边界,是风控首选。
- WOE/IV计算:WOE量化每个分箱的风险水平,IV评估变量整体预测能力,IV > 0.02为保留门槛。
- 特征筛选:综合缺失率、IV值、相关性、单调性和业务逻辑,确保入模特征既有效又可解释。
- 代码实现:使用pandas的qcut进行等频分箱,结合groupby计算WOE和IV,形成可复用的特征工程流水线。