特征选择怎么做?过滤、包裹、嵌入三类方法的实践要点
特征选择是机器学习建模中的一个常见环节:从众多可用的变量中,挑出真正对预测有帮助的那一部分。关于它的基本概念和意义,可以参考本站的“特征选择”词条,这里侧重介绍在实际项目中如何一步步地进行特征选择,以及需要注意的问题。
第一步:快速剔除明显无用的特征
在正式建模之前,可以先做一些简单的检查,去掉那些明显没有价值的特征:几乎不变的特征,比如某一列 99% 的值都相同,它几乎提供不了任何区分信息,可以通过计算方差来发现;缺失过多的特征,如果一个特征大部分的值都是空的,往往难以利用,但也要注意,有时“是否缺失”本身就包含了信息;唯一标识类的特征,比如用户编号、订单号,它们对每个样本都不同,没有可以推广的规律,反而容易让模型过拟合;以及明显与业务无关的特征。
第二步:用过滤法初步筛选
过滤法根据每个特征与预测目标之间的统计关系进行打分和排序,速度很快,适合在特征非常多的时候先进行一轮粗筛。对于数值型的目标,可以计算特征与目标的相关系数;对于分类问题,可以使用卡方检验、方差分析的 F 值;互信息则能够捕捉非线性的关系,适用范围更广。需要记住,过滤法通常是逐个地评估特征,可能会漏掉那些单独看作用不大、但组合起来很有用的特征,所以不宜筛得过于激进。
第三步:处理冗余特征
如果有几个特征高度相关,比如“月收入”和“年收入”,或者“面积(平方米)”和“面积(平方英尺)”,它们提供的几乎是相同的信息。保留它们不仅会增加计算量,在线性模型中还可能导致系数不稳定、难以解释,这叫多重共线性。可以计算特征之间的相关系数矩阵,对高度相关的特征只保留其中一个,通常保留含义更清楚或者与目标关系更强的那个。
第四步:用嵌入法或包裹法精选
嵌入法是实践中最常用的方法,在训练模型的同时得到特征的重要性。使用 L1 正则化的线性模型,比如 Lasso 回归,会把不重要特征的系数压缩为零。树模型,比如随机森林、梯度提升树,能够给出每个特征的重要性分数。不过,树模型基于分裂次数或分裂增益的默认重要性,可能会偏向于取值较多的特征,更可靠的做法是使用置换重要性:把某个特征的值随机打乱,看模型的效果下降了多少;或者使用 SHAP 值来衡量每个特征对预测的贡献。包裹法直接用模型的效果来评价特征组合,比如递归特征消除:反复地训练模型、去掉最不重要的特征,直到剩下想要的数量。它的效果通常更好,但计算量较大,适合在特征数量已经不太多的时候使用。
最重要的注意事项:避免信息泄露
一个非常常见的错误是:先在全部的数据上进行特征选择,然后再划分训练集和测试集,或者再做交叉验证。这样做时,特征选择的过程已经“偷看”了测试数据的信息,导致对模型效果的估计过于乐观,上线后效果明显变差。正确的做法是把特征选择当作模型训练的一部分,只在训练数据上进行;在交叉验证中,要在每一折的训练部分内部单独进行特征选择。很多机器学习库提供的“流水线”工具,可以方便地把特征选择和模型训练组合在一起,自动避免这个问题。另外还要警惕“目标泄露”:如果某个特征的效果好得出奇,要检查它是否包含了只有在知道结果之后才能获得的信息,比如在预测客户是否流失时,使用了“销户日期”这样的特征。
最后:结合业务判断
特征选择不应该完全交给算法。一些在统计上不太显著的特征,可能在业务上非常重要,或者是法规要求必须考虑的;而一些统计上很显著的特征,可能只是巧合,或者涉及隐私、可能带来歧视性的结果,比如在信贷审批中使用某些敏感的个人属性,需要慎重对待。