2、特征工程基础:特征分类、质量评估与有效性验证

特征工程是风控模型构建的核心环节,其质量直接决定模型的上限。本章系统梳理特征的分类体系、质量评估标准以及有效性验证方法,为后续特征服务与样本分层奠定基础。

2.1 特征分类体系

风控场景中的特征可按数据形态与业务含义分为三大类:数值型、类别型和时序型。每类特征在预处理、编码和业务解释上存在显著差异。

特征类型 典型字段 常见问题 常用处理方法
数值型 年龄、收入、负债率、近3月交易金额 量纲差异、长尾分布、异常值 标准化/归一化、分箱、对数变换、截断
类别型 职业、学历、地区、设备型号 基数过高、稀疏类别、缺失值 Label Encoding、One-Hot、Target Encoding、频次编码
时序型 申请时间、还款日、交易时间戳 周期性、趋势漂移、不规则间隔 滑动窗口统计、时间衰减、差分、周期性编码
实践建议:在风控特征服务中,建议对数值型特征优先做分箱处理以增强鲁棒性;对高基数类别型特征使用Target Encoding时需配合交叉验证防止过拟合;时序型特征必须关注时间窗口的稳定性,避免引入未来信息。

2.2 特征质量评估

特征质量评估是特征筛选的第一道关卡,主要从完整性、一致性、稳定性和区分度四个维度展开。

  • 完整性:缺失率是否在可接受范围内(通常阈值设为5%~20%)。缺失率过高的特征需评估是否保留或进行插补。
  • 一致性:特征在不同时间窗口、不同客群中的分布是否稳定。常用PSI(Population Stability Index)衡量。
  • 稳定性:特征在训练集与测试集、线上与线下之间的分布差异。PSI < 0.1 表示稳定,0.1~0.25 需关注,> 0.25 建议剔除。
  • 区分度:特征对好坏样本的区分能力。常用IV(Information Value)或KS统计量评估。
质量评估速查表:
维度 指标 阈值参考 处理建议
完整性 缺失率 < 5% 优秀;5%~20% 可接受;> 20% 需处理 缺失率过高时考虑剔除或使用业务默认值填充
一致性 PSI < 0.1 稳定;0.1~0.25 需监控;> 0.25 不稳定 PSI过高时检查数据源或特征定义是否发生变化
区分度 IV < 0.02 无效;0.02~0.1 弱;0.1~0.3 中等;> 0.3 强 IV过低可考虑删除或与其他特征组合
特征质量评估四维框架 特征质量评估 完整性 一致性 稳定性 区分度 评估顺序建议:完整性 → 一致性 → 稳定性 → 区分度,逐层过滤低质量特征

2.3 特征有效性验证方法

特征有效性验证旨在确认特征是否对模型预测有实质贡献,避免引入噪声。常用方法包括单变量分析、多变量筛选和模型重要性评估。

2.3.1 单变量验证

  • IV(Information Value):衡量特征对好坏样本的区分能力。IV > 0.02 为有效特征。
  • KS(Kolmogorov-Smirnov)统计量:衡量好坏样本累计分布的最大差异。KS > 0.1 通常认为有区分度。
  • 卡方检验:用于类别型特征与目标变量的独立性检验,p值 < 0.05 表示显著相关。

2.3.2 多变量筛选

  • 相关性分析:计算特征间Pearson/Spearman相关系数,剔除高度相关(|r| > 0.8)的冗余特征。
  • VIF(方差膨胀因子):检测多重共线性,VIF > 10 表示存在严重共线性。
  • 前向/后向/逐步选择:基于AIC或BIC准则逐步加入或剔除特征。

2.3.3 模型重要性评估

  • 树模型特征重要性:基于分裂次数或信息增益排序,筛选Top-K特征。
  • Permutation Importance:随机打乱特征值后观察模型性能下降程度,下降越大特征越重要。
  • SHAP值:基于博弈论解释每个特征对预测结果的边际贡献,可同时评估全局和局部重要性。
避坑提示:单变量验证(如IV)只能反映特征与目标之间的边际关联,无法捕捉特征间的交互作用。建议将单变量筛选作为初筛,再结合多变量和模型重要性评估做最终决策。此外,Permutation Importance在特征高度相关时可能低估重要特征,建议配合SHAP使用。
特征有效性验证流程 阶段一:单变量验证 IV / KS / 卡方检验 阶段二:多变量筛选 相关性 / VIF / 逐步选择 阶段三:模型重要性 树重要性 / SHAP / Permutation 最终有效特征集 建议采用“漏斗式”筛选:先单变量粗筛 → 多变量去冗余 → 模型重要性精排 最终保留的特征应同时满足:IV > 0.02、VIF < 10、模型重要性排名前80%

2.4 特征有效性验证代码示例

以下代码展示使用Python进行特征有效性验证的典型流程,涵盖IV计算、相关性分析和树模型重要性排序。

import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# 示例数据:假设df包含特征列和目标列'target'
# df = pd.read_csv('feature_data.csv')

# 1. 计算IV值(离散化后)
def calc_iv(df, feature, target):
    df_group = df.groupby(feature)[target].agg(['count', 'sum'])
    df_group['good'] = df_group['count'] - df_group['sum']
    df_group['bad_rate'] = df_group['sum'] / df_group['sum'].sum()
    df_group['good_rate'] = df_group['good'] / df_group['good'].sum()
    df_group['woe'] = np.log(df_group['bad_rate'] / df_group['good_rate'])
    df_group['iv'] = (df_group['bad_rate'] - df_group['good_rate']) * df_group['woe']
    return df_group['iv'].sum()

# 2. 相关性分析
corr_matrix = df.corr().abs()
upper_tri = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool))
high_corr_features = [column for column in upper_tri.columns if any(upper_tri[column] > 0.8)]

# 3. 树模型特征重要性
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)

feature_importance = pd.DataFrame({
    'feature': X.columns,
    'importance': rf.feature_importances_
}).sort_values('importance', ascending=False)

# 输出Top10重要特征
print(feature_importance.head(10))
工程落地建议:在风控特征服务中,建议将特征有效性验证流程封装为自动化Pipeline,每次特征上线前自动执行IV、相关性、VIF和模型重要性检查,并生成质量报告。对于IV < 0.02或VIF > 10的特征,系统自动标记为“待审核”状态,由人工确认后再决定是否上线。