Permutation Feature Importance

原文:HTML
翻译:我


置换特征重要性(Permutation feature importance)衡量了我们对特征的值进行打乱(permuted)后,模型的预测误差的增加,它打破了特征与真实结果之间的关系。

1 Theory

这个概念其实很简单。我们衡量一个特征的重要性的方法是:计算改变特征后模型预测误差的增加。如果打乱(shuffle)其值增加了模型的误差,那么一个特征就是 “重要的”,因为在这种情况下,模型是依靠这个特征来进行预测的。如果打乱(shuffle)其值使模型误差不变,则该特征为 “不重要”,因为在这种情况下,模型忽略了预测的特征。置换特征重要性测量是由Breiman(2001)35针对随机森林引入的。基于这一思想,Fisher、Rudin和Dominici(2018)提出了特征重要性的模型无关版本,并称之为模型依赖(model reliance)。他们还引入了关于特征重要性的更高级的想法,例如考虑到许多预测模型可能会很好地预测数据的(特定模型)版本。他们的论文值得一读。

The permutation feature importance algorithm based on Fisher, Rudin, and Dominici (2018):
在这里插入图片描述
Fisher、Rudin和Dominici(2018)在他们的论文中建议将数据集一分为二,并交换两半数据集的特征j的值,而不是permuting特征j,如果你想一想,这和permuting特征j是完全一样的。如果你想要一个更准确的估计,你可以通过将每个实例与每个其他实例的特征j的值配对(除了与自己)来估计重新组合特征j的误差。这就给你提供了一个大小为n(n-1)的数据集来估计换位误差,而且需要大量的计算时间。我只能推荐你使用n(n-1)-方法,如果你是认真地想得到非常准确的估计。


2 Should I Compute Importance on Training or Test Data?

tl; dr:我没有确切的答案。

回答关于训练数据还是测试数据的问题,就触及到了什么是特征重要性的根本问题。理解基于训练的特征重要性与基于测试数据的特征重要性之间差异的最好方法是一个 "极端 "的例子。我训练了一个支持向量机,给定50个随机特征(200个实例)来预测一个连续、随机的目标结果。我所说的 "随机 "是指目标结果与50个特征无关。这就像给定最新的彩票号码预测明天的温度一样。如果模型 "学习 "到任何关系,那么它就会过拟合。而事实上,SVM在训练数据上确实是过拟合的。训练数据的平均绝对误差(简称:mae)为0.29,测试数据的平均绝对误差为0.82,这也是总是预测平均结果为0的最佳模型的误差(mae为0.78)。换句话说,SVM模型是垃圾。对于这个过度拟合的SVM的50个特征,你期望特征重要性的数值是多少?零,因为没有一个特征有助于提高未见测试数据的性能?还是重要性应该反映模型在多大程度上取决于每个特征,而不管所学的关系是否泛化为看不见的数据?让我们来看看训练数据和测试数据的特征导入度分布有何不同。
在这里插入图片描述
图5.27:按数据类型划分的特征重要性值分布。在具有50个随机特征和200个实例的回归数据集上训练了一个SVM。SVM过拟合了数据。基于训练数据的特征重要性显示了许多重要特征。在未见过的测试数据上计算,特征重要性接近于1的比例(=不重要)。

我不清楚这两种结果哪种更理想。因此,我将尝试为这两个版本提出一个理由,让你自己决定。

The case for test data
这是一个简单的案例。基于训练数据的模型错误估计是垃圾 ->特征重要性依赖于模型错误估计 ->基于训练数据的特征重要性是垃圾。
真的,这是你在机器学习中最先学到的东西之一。如果你在训练模型的同一数据上测量模型误差(或性能),测量结果通常过于乐观,这意味着模型似乎比现实中好用得多。而由于置换特征重要性依赖于模型误差的测量,我们应该使用未见过的测试数据。基于训练数据的特征重要性让我们误以为特征对预测很重要,而实际上模型只是过拟合,特征根本不重要。

The case for training data
使用训练数据的论点有些难以表述,但IMHO与使用测试数据的论点一样令人信服。我们再来看看我们的垃圾SVM。基于训练数据,最重要的特征是X42。让我们看一下特征X42的部分依赖性图(partial dependence plot,pdp)。部分依赖图显示了模型输出如何根据特征的变化而变化,并不依赖于泛化误差。不管PDP是用训练数据还是测试数据计算的,都没有关系。
在这里插入图片描述
图5.28:特征X42的PDP,根据训练数据的特征重要性,这是最重要的特征。该图显示了SVM如何依靠此特征进行预测。

该图清楚地表明,SVM已经学会了依赖特征X42进行预测,但根据基于测试数据的特征重要性(1),它并不重要。基于训练数据,重要性为1.19,反映出模型已经学会了使用这个特征。基于训练数据的特征重要性告诉我们哪些特征对模型来说是重要的,因为模型要依靠这些特征来进行预测。

作为使用训练数据案例的一部分,我想介绍一个反对测试数据的论点。在实践中,你希望使用所有的数据来训练你的模型,以便最终得到最好的模型。这意味着没有未使用的测试数据可以用来计算特征重要性。当你想估计模型的泛化误差时,你也会遇到同样的问题。如果你会使用(嵌套)交叉验证来估计特征重要性,你会有一个问题,即特征重要性不是在具有所有数据的最终模型上计算的,而是在具有可能表现不同的数据子集的模型上计算的。

最后,你需要决定你是想知道模型在多大程度上依赖于每个特征来进行预测(->训练数据),还是想知道特征对模型在未见数据上的性能有多大贡献(->测试数据)。据我所知,还没有研究解决训练数据与测试数据的问题。这需要比我的 "垃圾-SVM "例子更彻底的研究。我们需要更多的研究和更多的这些工具的经验来获得更好的理解。

接下来,我们将看一些示例。我将重要性计算基于训练数据,因为我必须选择一个,并且使用训练数据需要少几行代码。

3 Example and Interpretation

我展示了分类和回归的示例。

Cervical cancer (classification)

我们拟合一个随机森林模型来预测宫颈癌。我们用1-AUC(1减去ROC曲线下的面积)来衡量误差增加。与模型误差增加1倍(=无变化)相关的特征对预测宫颈癌不重要。
在这里插入图片描述
图5.29:用随机森林预测宫颈癌时各特征的重要性。最重要的特征是Hormonal.Contraceptives.years。其导致1-AUC增加了6.13倍。

Bike sharing (regression)

在给定天气条件和日历信息的情况下,我们拟合了支持向量机模型来预测租用自行车的数量。作为误差测量,我们使用平均绝对误差。
在这里插入图片描述
图5.30:使用支持向量机预测自行车数量时每个特征的重要性。最重要的特征是温度,最不重要的是假期。


4 Advantages

很好的解释:特征重要性是特征信息被破坏时模型误差的增加。

特征重要性提供了对模型行为的高度压缩的全局洞察力。

使用错误率代替错误差的一个积极方面是,在不同问题之间,特征重要性度量是可比较的。

重要性测量会自动考虑到与其他特征的所有交互作用。通过置换特征,您还可以破坏与其他特征的交互效应。这意味着换位特征重要性既考虑了主要特征效应,也考虑了模型性能的交互效应。这也是一个缺点,因为两个特征之间的交互作用的重要性包含在两个特征的重要性测量中。这意味着特征的重要性并不能加总性能的下降,但是总和更大。仅当要素之间没有交互时(如线性模型中),重要性才近似相加。

置换特征的重要性不需要重新训练模型。其他一些方法建议删除特征,重新训练模型,然后比较模型误差。由于重新训练机器学习模型可能需要很长时间,因此“仅”置换特征就可以节省大量时间。

用特征子集重新训练模型的重要性方法乍一看很直观,但减少数据的模型对于特征重要性是没有意义的。我们感兴趣的是固定模型的特征重要性。用缩减后的数据集重新训练,会创建一个与我们感兴趣的模型不同的模型。假设你训练一个稀疏的线性模型(使用Lasso),该模型具有固定数量的非零权重的特征。数据集有100个特征,你将非零权重的数量设置为5,你分析其中一个非零权重的特征的重要性。你删除该特征并重新训练模型。模型性能保持不变,因为另一个同样好的特征得到了一个非零的权重,你的结论将是该特征不重要。另一个例子。模型是一棵决策树 我们分析被选为第一个分割的特征的重要性。你去掉这个特征,重新训练模型。由于另一个特征被选为第一个分割点,整个树可能会有很大的不同,这意味着我们比较(可能)完全不同的树的错误率,以决定该特征对其中一棵树的重要性。


5 Disadvantages

应该使用训练数据还是测试数据来计算特征的重要性并不明确。

置换特征的重要性与模型的误差有关。这本质上并不是坏事,但在某些情况下并不是你所需要的。在某些情况下,你可能更想知道模型的输出对某个特征的变化程度,而不考虑它对性能的意义。例如,您想知道当有人操纵特征时,您的模型的输出有多健壮。在这种情况下,你不会对某个特征被篡改时模型性能下降多少感兴趣,而是对每个特征解释了多少模型的输出方差感兴趣。当模型泛化良好时(即不过度拟合),模型方差(由特征解释)和特征重要性有很强的相关性。

你需要获得真正的结果。如果某人仅提供模型和未标记的数据,但没有提供真实结果,则将无法计算置换特征的重要性。

置换特征重要性取决于对特征的打乱(shuffle),这增加了测量的随机性。当重复进行换位时,结果可能会有很大的不同。重复排列,并对重复排列的重要性度量进行平均,可以稳定度量,但会增加计算时间。

如果特征是相关的,那么置换特征重要性可能会被不真实的数据实例所偏离。这个问题与部分依赖图(pdp)相同。当两个或多个特征相关时,特征的排列会产生不可能的数据实例。当它们是正相关的时候(比如一个人的身高和体重),我把其中一个特征洗牌,我就会产生新的实例,这些实例是不可能的,甚至在物理上是不可能的(比如2米的人重30公斤),但我却用这些新的实例来衡量重要性。换句话说,对于相关特征的换位特征重要性,我们考虑当我们用我们在现实中永远不会观察到的值交换该特征时,模型性能会下降多少。检查特征是否具有强相关性,如果具有强相关性,则要注意特征重要性的解释。

另一个棘手的事情:添加关联的特征可以通过在两个特征之间划分重要性来降低关联特征的重要性。让我举个例子说明我所说的 "拆分 "特征重要性的意思。我们想预测下雨的概率,使用前一天早上8点的温度作为特征和其他不相关的特征,训练了一个随机森林,结果发现温度是最重要的特征。现在想象另一种情况,我另外把早上9:00的温度作为一个特征,与早上8:00的温度强相关。如果我已经知道早上8:00的温度,那么早上9:00的温度并不能给我提供多少额外的信息。但有更多的特征总是好的,对吗?我用两个温度特征和不相关的特征训练了一个随机森林。随机森林中的一些树取到了早上8点的温度,另一些树取到了早上9点的温度,又有一些树两者都取到了,还有一些树没有取到。两个温度特征加在一起比之前单一的温度特征更重要一些,但现在每个温度不是在重要特征列表的顶端,而是在中间的某个位置。通过引入一个相关特征,我把最重要的特征从重要性的顶端踢到了平庸的位置。一方面这很好,因为它只是反映了底层机器学习模型的行为,这里是随机森林。早上8点的温度只是变得不那么重要了,因为模型现在也可以依赖早上9点的测量。另一方面,它使特征重要性的解释大大增加了难度。想象一下,你想检查特征的测量误差。检查的代价很高,你决定只检查最重要的前3个特征。在第一种情况下,你会检查温度,在第二种情况下,你不会包括任何温度特征,只是因为它们现在共享重要性。即使重要性值在模型行为的层面上可能是有意义的,但如果你有相关的特征,那就会令人困惑。


Software and Alternatives

示例使用了iml R包。 R包DALEX和vip以及Python库alibi也实现了与模型无关的置换特征的重要性。

一种称为PIMP的算法会修改特征重要性算法,以提供重要性的p值。


Reference

  • Breiman, Leo.“Random Forests.” Machine Learning 45 (1). Springer: 5-32 (2001).?

  • Fisher, Aaron, Cynthia Rudin, and Francesca Dominici. “Model Class Reliance: Variable importance measures for any machine learning model class, from the ‘Rashomon’ perspective.” http://arxiv.org/abs/1801.01489 (2018).?