2、特征工程基础:特征类型、质量评估与缺失值处理
特征工程是风控建模的基石。原始数据通常包含大量噪声、不一致和缺失,直接建模会导致模型偏差大、泛化能力差。本章系统讲解特征类型的识别与处理、特征质量评估的核心指标,以及缺失值处理的标准化流程。
2.1 特征类型与处理策略
风控数据中的特征按测量尺度可分为三类,每类对应不同的预处理方法:
| 特征类型 | 典型风控字段 | 常见问题 | 处理策略 |
|---|---|---|---|
| 数值型 | 收入、年龄、负债率、近6月逾期次数 | 量纲差异大、长尾分布、异常值 | 标准化/归一化、对数变换、分箱、截尾 |
| 类别型 | 职业、学历、婚姻状况、地区编码 | 基数高、稀疏类别、新类别泛化 | Label Encoding、One-Hot、Target Encoding、频次编码 |
| 时序型 | 申请时间、最近一次逾期日期、账户开立时间 | 时间跨度不一致、趋势漂移、周期性 | 衍生距今天数、滑动窗口统计、时间衰减权重 |
实战建议:风控场景中,类别型特征建议优先使用 Target Encoding(目标编码),将类别映射为历史坏账率,既能保留类别信息,又避免高基数带来的维度灾难。但需注意在训练集内做交叉验证折叠编码,防止标签泄露。
2.2 特征质量评估体系
特征质量直接影响模型效果。评估需从完整性、区分度、稳定性三个维度展开:
- 完整性(Coverage): 缺失率 < 5% 为优质特征;5%-20% 需填充;> 50% 建议剔除。
- 区分度(IV / 信息量): IV < 0.02 为弱预测力;0.02-0.1 中等;0.1-0.3 强;> 0.5 需警惕过拟合。
- 稳定性(PSI / 群体稳定性指标): PSI < 0.1 稳定;0.1-0.25 需监控;> 0.25 特征漂移严重,需重衍或剔除。
质量评估三原则: 缺失率低 + IV高 + PSI低 = 优质特征。三者缺一不可,尤其风控模型上线后,PSI是监控特征退化的第一道防线。
2.3 数据清洗与缺失值处理
数据清洗是特征工程中最耗时但最关键的环节。风控数据常见问题包括:重复记录、逻辑矛盾、异常值、缺失值。以下聚焦缺失值处理的标准化流程:
2.3.1 缺失机制分类
| 缺失机制 | 含义 | 风控示例 | 处理建议 |
|---|---|---|---|
| MCAR | 完全随机缺失 | 系统随机丢包导致字段为空 | 可直接删除或简单填充 |
| MAR | 随机缺失(依赖其他变量) | 高收入人群更倾向不填职业 | 用回归/模型预测填充 |
| MNAR | 非随机缺失(依赖自身) | 逾期用户故意不填联系方式 | 需单独建模或标记缺失模式 |
2.3.2 缺失值处理策略矩阵
根据特征类型和缺失率,选择最优填充方法:
- 数值型特征:
- 缺失率 < 5%:中位数填充(稳健)或均值填充(正态分布时)
- 缺失率 5%-20%:KNN填充、随机森林填充、多重插补
- 缺失率 > 20%:将缺失单独编码为-999或-1,保留缺失模式作为新特征
- 类别型特征:
- 缺失率 < 5%:众数填充
- 缺失率 5%-20%:将“缺失”作为独立类别编码
- 缺失率 > 20%:结合业务逻辑,若缺失本身有区分度则保留为单独类别
- 时序型特征:
- 前向填充(ffill)或后向填充(bfill),适用于时间序列连续缺失
- 线性插值,适用于趋势稳定的时序字段
⚠ 风控特殊处理: 缺失值在风控中往往携带信息。例如“近6个月逾期次数”为空,可能意味着用户无信贷记录(白户),此时填充0会丢失“白户”这一重要风险信号。建议对缺失值单独编码,并衍生“是否缺失”的0/1标志特征。
2.3.3 数据清洗代码示例
import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer
# 加载风控样本数据
df = pd.read_csv('credit_data.csv')
# 1. 删除重复记录
df.drop_duplicates(inplace=True)
# 2. 逻辑矛盾清洗:年龄 < 18 或 > 100 视为异常
df = df[(df['age'] >= 18) & (df['age'] <= 100)]
# 3. 缺失率统计
missing_rate = df.isnull().mean().sort_values(ascending=False)
print("缺失率前5特征:\n", missing_rate.head())
# 4. 按缺失率分层处理
for col in df.columns:
rate = df[col].isnull().mean()
if rate == 0:
continue
elif rate < 0.05:
# 低缺失率:中位数填充
if df[col].dtype in ['int64', 'float64']:
df[col].fillna(df[col].median(), inplace=True)
else:
df[col].fillna(df[col].mode()[0], inplace=True)
elif rate < 0.2:
# 中等缺失率:KNN填充(仅数值型)
if df[col].dtype in ['int64', 'float64']:
imputer = KNNImputer(n_neighbors=5)
df[[col]] = imputer.fit_transform(df[[col]])
else:
df[col].fillna('MISSING', inplace=True)
else:
# 高缺失率:保留缺失标志 + 填充固定值
df[col + '_is_missing'] = df[col].isnull().astype(int)
df[col].fillna(-999, inplace=True)
print("清洗完成,剩余样本数:", df.shape[0])
2.4 本章小结
- 特征类型决定预处理方法:数值型需处理量纲和分布,类别型需解决高基数,时序型需衍生时间窗口特征。
- 特征质量评估需综合 缺失率、IV值、PSI 三个维度,任何一项不达标都应谨慎入模。
- 缺失值处理没有银弹,需根据缺失机制和缺失率选择策略,风控场景下建议保留缺失标志特征。
- 数据清洗代码应形成标准化 pipeline,确保训练集和测试集采用相同的填充逻辑。