随机森林中的特征重要性没用吗?

机器算法验证 机器学习 特征选择 随机森林 scikit-学习 重要性
2022-04-09 23:48:14

对于随机森林或 XGBoost,我了解如何计算特征重要性,例如使用信息增益或杂质减少。

特别是在 sklearn(以及其他实现)中,特征重要性被归一化,使得特征的重要性总和为 1。

但考虑到以下事实:

  1. 随机森林中的特征重要性没有考虑特征之间的相互依赖:例如,考虑到两个特征都与目标强相关的极端情况,无论如何,它们最终的特征重要性分数总是在 0.5 左右每个,而人们会期望两者都应该得到接近一的分数。

  2. 特征重要性始终与所使用的特征集相关,并没有告诉我们任何关于目标和特征之间的统计依赖性的信息。例如,考虑到一个目标和一组随机生成的特征的极端情况,完全独立于目标,当然你仍然可以根据特征重要性度量对特征进行排名,但你得到的结果在此毫无意义案例,因为您已经知道所有功能都独立于目标。

我做了两个例子,我知道特征和目标的数据生成,并解释了为什么随机森林中的特征重要性完全没用。

所以我的问题是:

  1. 如果您处于 99.9% 的情况下,您对特征和目标之间的关系一无所知,您如何使用这种方法来推断特征重要性?

  2. 我一般不只使用杂质的减少或绝对值的信息增益,而是使用相对的措施,如杂质减少与总杂质之间的比率,这样数字仍然会在 0 和 1 之间有界(就像现在一样)但它也反映了某种关联的力量?(在我看来,首先重要性总和为 1 没有任何意义)

感谢您花时间阅读我的问题。

2个回答

标准特征重要性只是告诉您在构建模型时哪些特征更有用。它们不应被解释为预测变量和目标之间的直接依赖关系。

作为结果:

  • 如果你的模型很弱,它们就完全没用了。如果你的模型不能推广到验证数据——就像你提到的完全随机的预测变量一样——那么特征重要性就没有意义了。那是因为所有拆分都只是过度拟合训练数据而没有捕捉到任何真实趋势,所以你总结的所有 gini 杂质都是无用的
  • 它们受到相关特征的强烈影响。正如你所说,这是事实。只要知道它并事先执行一些好的旧特征工程以避免具有过于相关的特征
  • 它们偏向于数值和高基数特征。这绝对是个问题。有一些替代方法可以帮助缓解这种情况

因此,您不得将它们解释为“相关性”或“强度系数”,因为它们不代表与目标的依赖关系。然而,这并不意味着它们毫无用处!
一些限制缺点的替代方法是:

  • 排列重要性:这些是根据验证数据计算的,因此解决了第一个过拟合问题。如果一个特征分割在训练数据上过拟合,那么它在测试数据上的重要性就会很低。此外,由于它们是根据您选择的指标计算的,因此它们更容易解释,并且在某种意义上可以被视为“强度系数”,因为它们回答了以下问题:“如果我洗牌这个预测器?”。Boruta - 在评论中提到 - 使用基于此的算法。
  • Unbiased Feature Importances:这方面有很多作品,其中一个链接的是较新的作品之一。它们尚未在主要包中实现,但允许更好地测量不受上述过度拟合问题影响的重要性
  • Oblivious Trees:这种用于构建树的方法(例如在 catboost 中使用)会强制在树的同一级别上对同一特征进行所有拆分。这会迫使对泛化更好的特征进行分裂,并且通常会给出对过度拟合训练的不满程度要低得多的重要性。

最后——特征重要性非常有用,有助于在使用非常强大的算法(如 GBM 和 RF)时区分重要特征和不重要特征——但是,需要谨慎使用它们并以正确的方式解释它们。同时,还有一些替代方案和包解决了经典特征重要性的一些主要缺陷,使其更易于使用和解释。

让我从 sklearn排列重要性页面复制并粘贴一条警告消息

警告:对于坏模型(低交叉验证分数)被认为不重要的特征对于好的模型可能非常重要。因此,在计算重要性之前使用保留集(或使用交叉验证更好)评估模型的预测能力始终很重要。排列重要性并不反映特征本身的内在预测价值,而是反映该特征对于特定模型的重要性

大胆的面孔是我的。对于许多其他特征重要性度量,这个粗体句子实际上是正确的:它们测量相对于特定模型的重要性。它们不衡量独立于特定模型的特征的重要性。IMO,在这方面,“特征重要性”一词是一个不好的命名,因为无论这是特定模型中特征的重要性还是更一般意义上的特征的重要性,都是模棱两可的。根据第二个意义,“特征重要性”可以定义为特征与目标类之间的依赖程度。如果特征和目标类相互独立,那么我们可以说特征对目标并不重要。

但是这种情况并没有使特征重要性(对于特定模型)变得无用。您可能想知道模型中特征的重要性,以便解释模型的预测或了解特征如何影响预测。