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。
特征构造方法全景图 原始特征 聚合特征 交叉特征 比率特征 均值/标准差 计数/频数 乘积/比值 类别组合 DTI/使用率 逾期率 构造原则 业务可解释性 > 统计显著性 > 模型增益;避免过度构造导致维度灾难

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%,为后续精细筛选留出空间。
特征重要性初筛流程 步骤1:缺失率过滤 剔除缺失率>70% 步骤2:IV值筛选 保留IV≥0.02 步骤3:相关性去重 |r|>0.9保留其一 步骤4:随机森林排序 取Top N或累积90% 步骤5:业务复核 剔除业务不可解释特征 初筛候选特征集

4.4 本章小结

  • 特征分类是特征工程的第一步,数值型、类别型、时序型特征需要采用不同的处理方法。
  • 聚合、交叉、比率是三种最核心的特征构造方法,应结合业务逻辑灵活运用。
  • 特征重要性初筛遵循“先单变量后多变量”的流程,IV值和随机森林重要性是最常用的筛选工具。
  • 初筛阶段应保留业务可解释性强的特征,避免完全依赖统计指标而丢失业务信号。