4. 特征工程基础:特征分类、构造方法与重要性初筛
特征工程是信用评分模型开发中最具创造性和业务价值的环节。原始数据中的变量往往存在缺失、异常、量纲不统一等问题,直接建模会导致模型性能低下甚至失效。本章系统讲解特征分类体系、常用构造方法以及特征重要性初筛技术,为后续特征筛选与模型训练奠定基础。
核心观点:特征工程不是简单的数据变换,而是将业务经验与统计方法相结合,从原始数据中提取对违约风险具有区分能力的预测信号。
4.1 特征分类体系
根据数据来源与时间属性,信用评分模型中的特征可分为三大类:数值型、类别型和时序型。理解特征类型是选择正确处理方法的前提。
| 特征类型 | 定义 | 信用评分常见示例 | 典型处理方法 |
|---|---|---|---|
| 数值型 | 连续或离散的定量数值,具有可比较的大小关系 | 年龄、收入、负债金额、信用卡额度使用率 | 标准化、分箱、对数变换、异常值截断 |
| 类别型 | 有限个离散取值,取值之间无天然顺序或仅有名义顺序 | 婚姻状况、学历、职业类型、居住城市等级 | 独热编码、标签编码、WOE编码、频数编码 |
| 时序型 | 记录时间顺序或时间窗口内的行为模式 | 近6个月逾期次数、最近一次查询距今天数、月均消费增长率 | 滑动窗口聚合、时间衰减加权、差分、趋势提取 |
实战提示:信用评分建模中,时序型特征往往比静态截面特征更具预测力。例如,“近3个月信贷申请次数”比“总信贷账户数”更能反映借款人近期的资金紧张程度。
4.2 特征构造方法
特征构造是从原始变量中衍生新变量的过程,旨在捕捉变量间的交互关系、非线性模式或业务逻辑。以下三种方法在信用评分领域应用最广。
4.2.1 聚合特征
对同一主体在不同时间点或不同账户上的数据进行统计汇总,生成反映其整体行为模式的指标。
- 统计量聚合:均值、最大值、最小值、标准差、变异系数
- 计数聚合:总次数、正/负向事件次数、缺失次数
- 比率聚合:逾期次数/总还款次数、消费金额/收入金额
- 时间衰减聚合:对近期行为赋予更高权重,如指数加权移动平均
# 示例:计算客户近6个月的平均消费金额与消费波动率
import pandas as pd
# 假设 df_trans 包含字段:customer_id, trans_date, trans_amount
df_trans['trans_date'] = pd.to_datetime(df_trans['trans_date'])
cutoff = df_trans['trans_date'].max() - pd.DateOffset(months=6)
recent = df_trans[df_trans['trans_date'] >= cutoff]
agg_features = recent.groupby('customer_id').agg(
avg_amount_6m=('trans_amount', 'mean'),
std_amount_6m=('trans_amount', 'std'),
count_6m=('trans_amount', 'count')
).reset_index()
4.2.2 交叉特征
将两个或多个原始特征进行组合,生成反映变量间交互效应的新特征。交叉特征能捕捉单一变量无法表达的复杂关系。
- 数值×数值:乘积、比值、差值的绝对值
- 类别×数值:按类别分组后的数值统计量(如不同职业的平均收入)
- 类别×类别:笛卡尔积组合(如“已婚×本科”作为一个新类别)
- 多项式交叉:对数值特征进行平方、立方或交互项扩展
# 示例:构造收入与负债的交叉特征
df['debt_to_income'] = df['total_debt'] / (df['annual_income'] + 1e-6)
df['income_age_interact'] = df['annual_income'] * df['age']
4.2.3 比率特征
比率特征本质上是交叉特征的特例,但在信用评分中具有独立的业务解释意义,因此单独列出。
| 比率类型 | 计算公式 | 业务含义 |
|---|---|---|
| 负债收入比(DTI) | 月总负债 / 月总收入 | 衡量借款人还款压力 |
| 信用卡使用率 | 已用额度 / 总授信额度 | 反映资金紧张程度 |
| 逾期率 | 逾期次数 / 总还款次数 | 衡量历史还款质量 |
| 收入稳定性 | 近12个月收入标准差 / 均值 | 反映收入波动风险 |
避坑提醒:构造比率特征时务必处理分母为零的情况。建议对分母加一个极小常数(如1e-6),或先对分母进行缺失值填充,避免产生无穷值或NaN。
4.3 特征重要性初筛
特征构造完成后,特征数量可能从几十个膨胀到数百甚至上千个。直接全部入模会导致过拟合、训练缓慢和模型稳定性下降。特征重要性初筛的目标是快速剔除无效或冗余特征,保留最有预测力的候选集。
4.3.1 单变量筛选方法
| 方法 | 适用特征类型 | 评估指标 | 筛选标准 |
|---|---|---|---|
| 缺失率分析 | 所有类型 | 缺失比例 | 缺失率 > 70% 直接剔除 |
| 方差过滤 | 数值型 | 方差/标准差 | 方差接近0的特征剔除 |
| IV值(信息量) | 数值型(需分箱) | IV = Σ(WOE × (好占比 - 坏占比)) | IV < 0.02 无预测力;0.02~0.1 弱;0.1~0.3 中;>0.3 强 |
| 卡方检验 | 类别型 | 卡方统计量 / p值 | p > 0.05 剔除 |
| 相关系数 | 数值型 | Pearson / Spearman | |r| > 0.9 保留其一 |
4.3.2 多变量筛选方法
- 随机森林特征重要性:基于袋外误差(OOB)或基尼系数下降量排序,取Top N或重要性累积占比前80%的特征。
- L1正则化(Lasso):通过惩罚项将不重要特征的系数压缩为0,自动完成特征选择。
- 前向/后向逐步选择:以AIC或BIC为准则,逐步添加或剔除特征,适合特征数较少的情况。
- Boruta算法:通过影子特征与原始特征的随机森林重要性对比,判断特征是否显著优于随机噪声。
# 示例:使用随机森林进行特征重要性排序
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
# 假设 X_train 为特征矩阵,y_train 为标签
rf = RandomForestClassifier(n_estimators=100, random_state=42, n_jobs=-1)
rf.fit(X_train, y_train)
importance_df = pd.DataFrame({
'feature': X_train.columns,
'importance': rf.feature_importances_
}).sort_values('importance', ascending=False)
# 保留累积重要性前90%的特征
importance_df['cumsum'] = importance_df['importance'].cumsum()
selected_features = importance_df[importance_df['cumsum'] <= 0.90]['feature'].tolist()
print(f"初筛保留特征数: {len(selected_features)}")
实战建议:特征重要性初筛应遵循“先单变量后多变量”的流程。先用缺失率、IV值、相关系数快速过滤掉明显无效的特征,再用随机森林或Lasso进行二次筛选。初筛保留的特征数量建议控制在原始特征数的30%~50%,为后续精细筛选留出空间。
4.4 本章小结
- 特征分类是特征工程的第一步,数值型、类别型、时序型特征需要采用不同的处理方法。
- 聚合、交叉、比率是三种最核心的特征构造方法,应结合业务逻辑灵活运用。
- 特征重要性初筛遵循“先单变量后多变量”的流程,IV值和随机森林重要性是最常用的筛选工具。
- 初筛阶段应保留业务可解释性强的特征,避免完全依赖统计指标而丢失业务信号。