3. 单变量特征选择方法
单变量特征选择是模型风险管理中筛选入模变量的第一道关卡。其核心思想是独立评估每个候选特征与目标变量之间的关系强度或自身质量,不依赖其他特征的组合效应。本章重点介绍四种最常用的单变量筛选方法:方差阈值法、缺失率过滤法、IV值计算与筛选、PSI群体稳定性指标评估。
3.1 方差阈值法
方差阈值法是最简单的特征过滤方法,用于剔除几乎无波动的常量或准常量特征。在风控模型中,如果一个特征的方差接近于零,意味着该特征在样本中几乎没有区分能力,无法为模型提供有效信息。
| 指标 | 计算公式 | 适用场景 | 阈值建议 |
|---|---|---|---|
| 方差 | σ² = Σ(xᵢ − μ)² / n | 连续型特征 | 0.01 ~ 0.1 |
| 标准差 | σ = √σ² | 连续型特征 | 0.1 ~ 0.3 |
| 零值占比 | count(x=0) / n | 稀疏特征 | > 95% |
关键要点:方差阈值法仅适用于数值型特征。对于分类型特征,应先进行独热编码或使用类别频数占比替代。阈值设置需结合业务理解,过高的阈值可能误删有意义的弱信号特征。
# Python 示例:方差阈值过滤
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.05)
X_selected = selector.fit_transform(X)
selected_features = X.columns[selector.get_support()]
3.2 缺失率过滤法
缺失率过滤法通过计算每个特征的缺失值比例,剔除信息缺失严重的特征。在金融风控场景中,缺失率过高的特征往往意味着数据采集不稳定、字段定义不合理或业务逻辑存在缺陷。
- 计算缺失率:missing_rate = missing_count / total_count
- 设定阈值:通常建议 50% ~ 80% 作为剔除线
- 业务判断:对缺失率在 30% ~ 50% 的特征,需评估缺失机制(MCAR/MAR/MNAR)
- 决策处理:剔除或保留后做缺失值插补
| 缺失率范围 | 处理建议 | 风险等级 |
|---|---|---|
| < 5% | 直接保留,可做简单插补 | 低 |
| 5% ~ 30% | 保留并评估缺失模式,选择合适插补方法 | 中 |
| 30% ~ 50% | 需业务确认,考虑构造缺失指示变量 | 高 |
| > 50% | 建议剔除,信息量不足 | 极高 |
注意:缺失率过滤不能盲目执行。某些场景下,缺失本身可能包含业务含义(如“未申请”代表客户无此需求),此时应构造缺失指示变量而非直接剔除。
3.3 IV值(信息价值)计算与筛选
IV值(Information Value)是衡量特征对目标变量区分能力的核心指标,广泛应用于信用评分卡和风控模型开发。IV值基于WOE(Weight of Evidence)变换计算,能够量化每个特征对好坏样本的区分效果。
3.3.1 WOE与IV的计算步骤
- 分箱:将连续特征离散化为k个分组,或直接使用分类特征的类别
- 计算WOE:WOEᵢ = ln( (Goodᵢ / Good_total) / (Badᵢ / Bad_total) )
- 计算IV:IV = Σ (Goodᵢ / Good_total − Badᵢ / Bad_total) × WOEᵢ
# Python 示例:计算单个特征的 IV 值
import numpy as np
import pandas as pd
def calculate_iv(data, feature, target):
df = data.groupby(feature)[target].agg(['sum', 'count'])
df.columns = ['bad', 'total']
df['good'] = df['total'] - df['bad']
total_bad = df['bad'].sum()
total_good = df['good'].sum()
df['bad_rate'] = df['bad'] / total_bad
df['good_rate'] = df['good'] / total_good
df['woe'] = np.log(df['good_rate'] / df['bad_rate'])
df['iv'] = (df['good_rate'] - df['bad_rate']) * df['woe']
return df['iv'].sum()
3.3.2 IV值筛选标准
| IV值范围 | 预测能力 | 筛选建议 |
|---|---|---|
| < 0.02 | 无预测能力 | 剔除 |
| 0.02 ~ 0.10 | 弱预测能力 | 视情况保留 |
| 0.10 ~ 0.30 | 中等预测能力 | 建议保留 |
| 0.30 ~ 0.50 | 强预测能力 | 优先保留 |
| > 0.50 | 过强(可能过拟合) | 需谨慎验证 |
实践建议:IV值过高(>0.5)的特征可能存在过拟合风险或数据泄露,需结合业务逻辑和跨时间验证来确认其可靠性。在模型风险管理中,IV值筛选通常与PSI评估配合使用。
3.4 PSI(群体稳定性指标)评估
PSI(Population Stability Index)用于衡量特征在时间维度上的分布稳定性。在模型风险管理中,一个特征即使IV值很高,如果其分布在训练集和验证集/上线后数据之间发生剧烈偏移,也会导致模型性能快速衰减。
3.4.1 PSI计算公式
PSI = Σ (Actual%ᵢ − Expected%ᵢ) × ln( Actual%ᵢ / Expected%ᵢ )
其中:
- Expected%ᵢ:训练集(基准集)在第i个分箱中的样本占比
- Actual%ᵢ:验证集或上线后数据集在第i个分箱中的样本占比
3.4.2 PSI评估标准
| PSI值范围 | 稳定性等级 | 行动建议 |
|---|---|---|
| < 0.10 | 稳定 | 无需处理,可直接使用 |
| 0.10 ~ 0.25 | 轻度偏移 | 需监控,评估是否需要调整 |
| > 0.25 | 严重偏移 | 必须排查原因,考虑剔除或重构 |
# Python 示例:计算 PSI
def calculate_psi(expected, actual, bins=10):
# 基于期望分布的分位数确定分箱边界
percentiles = np.linspace(0, 100, bins + 1)
bin_edges = np.percentile(expected, percentiles)
expected_counts = np.histogram(expected, bins=bin_edges)[0]
actual_counts = np.histogram(actual, bins=bin_edges)[0]
expected_pct = expected_counts / len(expected)
actual_pct = actual_counts / len(actual)
# 避免除零
expected_pct = np.clip(expected_pct, 0.001, 1)
actual_pct = np.clip(actual_pct, 0.001, 1)
psi = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct))
return psi
模型风险管理要点:PSI评估应贯穿模型全生命周期——开发阶段用于训练集/验证集对比,上线后用于月度/季度监控。当PSI超过0.25时,需启动模型预警机制,分析分布偏移的根因(客群变化、政策调整、数据采集变更等)。
3.5 四种方法的综合应用策略
在实际模型风险管理工作中,四种单变量筛选方法通常按流水线顺序执行,形成特征筛选的标准化流程:
- 第一步:方差阈值过滤 — 剔除常量/准常量特征,降低计算量
- 第二步:缺失率过滤 — 剔除高缺失率特征,保证数据质量
- 第三步:IV值筛选 — 保留预测能力强的特征,确保模型区分度
- 第四步:PSI评估 — 验证特征稳定性,保障模型长期有效
| 筛选方法 | 评估维度 | 核心指标 | 典型阈值 | 风险关注点 |
|---|---|---|---|---|
| 方差阈值法 | 特征自身波动性 | 方差/标准差 | 方差 < 0.01 | 常量特征无信息 |
| 缺失率过滤法 | 数据完整性 | 缺失率 | > 50% | 数据采集缺陷 |
| IV值筛选 | 目标区分能力 | 信息价值 | < 0.02 或 > 0.50 | 过拟合/数据泄露 |
| PSI评估 | 时间稳定性 | 群体稳定性指标 | > 0.25 | 分布偏移/模型衰减 |
重要提醒:单变量筛选只是特征选择的初步过滤,不能替代多变量特征选择方法(如逐步回归、LASSO、随机森林特征重要性等)。通过单变量筛选的特征,仍需在多变量层面验证其共线性、交互效应和增量贡献。