不重要的特征对模型性能的影响

数据挖掘 特征选择 随机森林 xgboost
2021-09-20 06:08:24

使用 XGBoost 和 RandomForests,不重要的特征(根据feature_importances_属性)会损害模型的性能吗?

我是否需要仔细选择高度相关导入特征?还是我把所有东西都扔进去,希望它能正确地在目标变量上添加一些信息?

2个回答

是的,不重要的功能会损害模型的性能。根据我的经验,这发生在几个方面:

  1. 效率 - 它们使拟合过程变慢。特别是如果您对分类特征进行一次性编码,并最终得到一个大而无用的稀疏矩阵。如果这些效率降低迫使您采取可能影响实际信息功能的步骤,例如 PCA 转换,那么您可能还会直接影响预测能力。

  2. 每个特征需要最少数量的样本才能使模型有效学习。通过包含冗余特征,该样本:特征比率降低,这使得许多模型更难以确定特征是否是有用的预测器。

  3. 你使它更有可能过度适应“嘈杂”的特征。

您可以使用 sklearns 递归特征消除来递归拒绝模型的 feature_importances_ 例程认为不重要的特征。或者,在构建模型的探索阶段,您可以使用可视化或假设检验来评估预测能力。

这很好地突出了通过放弃冗余功能来提高性能:

https://scikit-learn.org/stable/auto_examples/feature_selection/plot_rfe_with_cross_validation.html#sphx-glr-auto-examples-feature-selection-plot-rfe-with-cross-validation-py

一般来说,对于随机森林和提升正则化超参数(mtry、最大深度、colsample_byX、lambda、alpha 和可能的 gamma 等)通常就足够了,以至于基于显式包装器的特征选择通常会使模型性能没有更好甚至可能更差。特征选择是一个二元选择,要么我们将一个特征完全排除在外,要么完全留在模型中。通过正则化,我们包括所有变量,但理想情况下只允许每个变量影响预测到有益的程度。

基于包装器的特征选择仍然很有用,但通常用于正则化很少的模型。删除冗余特征确实提高了计算速度,这反过来又可以让你在特征工程等其他领域尝试更多的超参数或更多的实验。但是,基于包装器的特征选择也不是非常快,因为您最终要拟合数百个模型并评估它们以查看特征选择方法是否仍然有效。此外,正确使用特征重要性,以免泄漏信息和偏差测试集分数本身就是一项昂贵且令人讨厌的任务(推导特征重要性,然后快速评估前 k 个特征变得耗时,尽管很容易平行)。

您可能会出于商业原因进行基于包装的特征选择,例如:收集无用的变量可能会很昂贵。我认为如果您有时间和耐心正确地进行基于包装器的特征选择(以及获得一致的变量重要性分数的大量数据),可以尝试使用基于包装器的特征选择。否则,它并不总是必要的,甚至可能不会带来任何改进,特别是如果您使用的是已经内置大量正则化的更新的 ML 算法。