4. 过滤法特征选择

在金融风控、量化选股与信用评分建模中,特征工程往往决定了模型上限。过滤法(Filter Method)作为特征选择的第一道筛子,不依赖任何具体模型,仅通过统计指标对每个特征独立打分,再按阈值或排名剔除冗余与噪声。它的优势是计算快、可解释强、便于在建模前快速压缩特征空间;代价是忽略了特征之间的组合效应与模型偏好。本节围绕五类常用过滤指标,讲清原理、适用边界与金融场景中的落地方式。

一、核心原理:五类指标各自在“过滤”什么

过滤法的本质是给每个特征打一个“与目标的相关性”或“自身稳定性”的分数。不同指标回答的问题并不相同:

  • 方差阈值(VarianceThreshold):衡量特征自身取值是否几乎不变。金融数据中大量“近30天是否逾期”类字段在样本中恒为0,方差接近0,对模型无信息量,应优先剔除。
  • 卡方检验(Chi-Square):衡量离散特征与离散标签之间的独立性。信用评分中“职业类别”与“是否违约”是否相关,可用卡方统计量判断,值越大越相关。
  • 互信息(Mutual Information):衡量特征与标签之间的任意依赖关系,不限于线性。对“收入区间”与“违约概率”这类非线性关系,互信息比相关系数更敏感。
  • 相关系数(Pearson/Spearman):衡量连续特征与连续标签的线性或单调关系。量化选股中因子与未来收益的IC值,本质就是相关系数。
  • 方差膨胀因子(VIF):衡量一个特征能被其他特征线性解释的程度,用于识别多重共线性。金融因子间高度相关时,VIF会显著放大。
记忆口诀:方差看“自己变不变”,卡方看“离散对离散”,互信息看“任意依赖”,相关系数看“线性单调”,VIF看“彼此像不像”。

二、方法流程:从原始特征到候选集

在真实项目中,五类指标通常不是并列使用,而是按“先剔无用、再剔冗余、后看共线”的顺序串联。推荐流程如下:

  1. 数据清洗后,先计算所有特征的方差,剔除方差低于阈值的常量或近常量特征。
  2. 对离散特征与离散标签,计算卡方统计量并做显著性筛选。
  3. 对连续特征与标签,计算互信息或相关系数,保留Top-K或超过阈值的特征。
  4. 对保留下来的连续特征计算VIF,迭代剔除VIF最高的特征,直到全部低于阈值(常用5或10)。
  5. 输出候选特征集,再交给包裹法或嵌入法做二次筛选。
from sklearn.feature_selection import VarianceThreshold, chi2, mutual_info_classif
from sklearn.preprocessing import MinMaxScaler
from statsmodels.stats.outliers_influence import variance_inflation_factor
import pandas as pd, numpy as np

# 1. 方差阈值
vt = VarianceThreshold(threshold=0.01)
X_vt = vt.fit_transform(X)

# 2. 卡方检验(要求非负,先做MinMax缩放)
X_pos = MinMaxScaler().fit_transform(X_vt)
chi_scores, p_values = chi2(X_pos, y)

# 3. 互信息
mi_scores = mutual_info_classif(X_vt, y, random_state=42)

# 4. VIF迭代剔除
def drop_high_vif(df, thresh=10.0):
    while True:
        vif = pd.Series(
            [variance_inflation_factor(df.values, i) for i in range(df.shape[1])],
            index=df.columns)
        if vif.max() < thresh:
            return df, vif
        df = df.drop(columns=[vif.idxmax()])

三、金融场景案例:信用评分卡特征筛选

假设我们有一份消费金融申请数据,包含年龄、月收入、负债收入比、近6个月查询次数、职业类别、婚姻状态等30个特征,标签为“是否逾期90天以上”。直接入模会面临三个问题:部分字段几乎不变、类别字段与标签关系弱、收入与负债收入比高度共线。

指标作用对象金融场景示例常用阈值
方差阈值所有特征剔除“是否持有某冷门产品”近常量字段0.01~0.05
卡方检验离散特征 vs 离散标签职业类别、婚姻状态与违约标签p值 < 0.05
互信息任意特征 vs 离散标签收入区间与违约概率的非线性关系Top-K 或 > 0.02
相关系数连续特征 vs 连续标签因子IC、利率与债券收益率|r| > 0.1
VIF连续特征之间月收入与负债收入比、额度与使用率< 5 或 < 10

实操中,先用方差阈值剔除3个近常量字段,再用卡方保留职业类别与婚姻状态,用互信息保留收入区间与查询次数,最后对连续变量做VIF迭代,剔除负债收入比后,模型AUC从0.712提升到0.736,同时特征数从30降到14,训练时间下降约40%。这说明过滤法虽简单,但在金融高维稀疏场景中收益显著。

金融数据过滤法特征选择:五类指标协同路径 原始特征集 30个申请字段 方差阈值 剔除近常量 卡方检验 离散 vs 离散 互信息 任意依赖 相关系数 连续 vs 连续 VIF 剔除共线性 候选特征集 14个入模特征 金融要点:方差阈值先剔“死字段”;卡方与互信息处理类别与非线性;相关系数看因子IC;VIF解决收入与负债收入比等共线。 结果:特征数30→14,AUC 0.712→0.736,训练时间下降约40%。

四、误区与复盘:过滤法不是“一筛了之”

常见误区一:把VIF当作特征重要性。VIF高只说明共线,不代表特征无用。金融中“额度使用率”与“负债收入比”共线,但两者业务含义不同,直接删可能损失解释性。
常见误区二:卡方检验用于连续特征。卡方要求非负频数,连续变量必须先分箱或离散化,否则结果不可信。
常见误区三:互信息与相关系数混用。互信息能捕捉非线性,但计算成本高、对连续变量需估计密度;相关系数快但只反映线性单调关系。金融因子筛选中,建议两者都算,取交集或并集再评估。

复盘建议:过滤法适合作为“粗筛”,不要用它替代模型评估。每次筛选后,应记录被剔除特征及原因,并在验证集上对比AUC、KS、PSI等指标。若某特征被过滤法剔除但业务上强相关,应保留并单独观察,避免因统计阈值误杀关键变量。最终,过滤法、包裹法与嵌入法应形成互补,而不是互相替代。