3. 特征选择入门
在金融建模中,我们常面对成百上千个候选变量:财务比率、行情因子、宏观指标、文本情绪得分、另类数据衍生特征。把它们全部塞进模型,往往不会带来更好的预测,反而会引入噪声、加剧过拟合、抬高计算成本,并让模型解释变得困难。特征选择要解决的核心问题就是:在保持甚至提升模型泛化能力的前提下,从原始特征集合中挑选出最有信息量的子集。它与降维(如PCA)不同,降维生成新特征,而特征选择保留原始特征的物理含义,这对金融场景中的可解释性与合规审查尤为关键。
一、核心原理:为什么“少即是多”
特征选择的有效性来自三个层面。第一,偏差—方差权衡:无关特征会增加模型方差,尤其在样本量有限的金融数据中,噪声特征容易被模型“记住”。第二,信息冗余:高度相关的特征提供重复信息,既增加共线性风险,也稀释重要变量的权重。第三,计算与解释成本:特征越多,训练、调参、监控和上线维护的成本越高,而金融模型往往需要向风控、合规和业务方解释每个变量的作用。
因此,特征选择不是简单地“删掉没用的列”,而是一个与模型目标、数据分布、业务约束紧密耦合的决策过程。下面这张图概括了三大类方法在“评估方式”和“与模型关系”上的本质差异。
二、过滤法:先打分,再筛选
过滤法的思路最直接:用统计指标给每个特征单独打分,按分数排序后保留前K个或超过阈值的特征。它完全不依赖下游模型,因此计算快、可并行、易于解释。常见指标包括:
- 方差过滤:删除取值几乎不变的特征,如常数或近常数变量。
- 卡方检验:衡量类别型特征与分类标签之间的独立性,适合离散特征。
- 互信息:捕捉非线性相关,对连续和离散特征都适用。
- 相关系数 / IV值:金融风控中常用IV筛选变量,同时用相关系数剔除共线性。
下面是一个使用方差和互信息做初筛的示例:
from sklearn.feature_selection import VarianceThreshold, mutual_info_classif
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=50, n_informative=10, random_state=42)
# 1) 删除低方差特征
vt = VarianceThreshold(threshold=0.01)
X_var = vt.fit_transform(X)
print("方差过滤后特征数:", X_var.shape[1])
# 2) 互信息打分,保留前15个
mi = mutual_info_classif(X_var, y, random_state=42)
idx = mi.argsort()[::-1][:15]
X_sel = X_var[:, idx]
print("互信息筛选后特征数:", X_sel.shape[1])
三、包裹法与嵌入法:让模型参与选择
包裹法把特征选择看作一个搜索问题:不断尝试不同的特征子集,用模型在验证集上的表现来评价子集好坏。典型方法有前向选择、后向消除和递归特征消除(RFE)。它的优点是能捕捉特征之间的交互作用,往往能选出更紧凑、更有效的子集;缺点是计算量大,且在小样本上容易过拟合验证集。
嵌入法则把特征选择嵌入到模型训练过程中。L1正则化(Lasso)通过稀疏化权重自动将部分系数压为零;树模型在分裂时根据信息增益或基尼不纯度选择特征,训练完成后可直接输出特征重要性。嵌入法在效率与效果之间取得较好平衡,是金融建模中最常用的方案之一。
| 方法类别 | 评估依据 | 计算成本 | 是否考虑特征交互 | 典型金融场景 |
|---|---|---|---|---|
| 过滤法 | 统计指标(方差、互信息、IV) | 低 | 否 | 因子库初筛、信用评分变量预选 |
| 包裹法 | 模型交叉验证表现 | 高 | 是 | 中小规模量化策略、追求精度的场景 |
| 嵌入法 | 正则化或树分裂重要性 | 中 | 部分 | 大规模风控模型、端到端机器学习流水线 |
四、误区与复盘:特征选择不是“一劳永逸”
在实际项目中,特征选择最常见的误区有三个。第一,在全部数据上做选择再划分训练测试集,这会造成数据泄露,使验证结果虚高。正确做法是把特征选择放入交叉验证的每一折中,或至少在训练集上完成选择后再应用到测试集。第二,盲目追求特征数量最少,忽略了业务可解释性和稳定性。某些变量虽然统计贡献不高,但在极端行情下具有风险指示作用,不应轻易删除。第三,只做一次选择就固定不变,而金融市场的数据分布会随时间漂移,特征重要性也会变化,需要定期复盘和滚动验证。
- 特征选择是否在训练集内完成,测试集是否保持“未见”状态?
- 是否同时评估了模型精度、特征数量和稳定性三个维度?
- 被删除的特征是否有业务上的强制保留要求?
- 特征重要性是否随时间发生显著漂移?
- 最终子集是否经过多折交叉验证和样本外测试?