Permutation Feature Importance
排列特征重要性测量我们在排列了特征值后模型预测误差的增加,这打破了特征与真实结果之间的关系。
Theory
排列特征重要性的概念是直接了当的,我们通过计算置换特征后模型预测误差的增加来衡量特征的重要性。 如果一个特性的值被洗牌会增加模型误差,那么它就是“重要的”,因为在这种情况下,模型依赖于该特性进行预测。 如果一个特征的值不变,那么它就是“不重要的”,因为在这种情况下,模型忽略了该特征进行预测。 Breiman(2001)提出了随机森林的置换特征重要性度量。 基于这个想法,Fisher,Rudin和Dominici(2018)提出了特征重要性的模型不可知论版本,并称之为模型依赖。 他们还引入了关于特征重要性的更先进的思想,例如一个(特定于模型的)版本,它考虑到许多预测模型可以很好地预测数据。 他们的论文值得一读。
The permutation Feature Importance algorithm based on Fisher,Rudin,and Dominici(2018)
输入:训练模型
f
f
f,特征矩阵
X
X
X,目标向量
Y
Y
Y,误差测度
L
(
y
,
f
)
L(y,f)
L(y,f)。
1 :估计原始模型误差
e
o
r
i
g
=
L
(
y
,
f
(
X
)
)
e^{orig}=L(y,f(X))
eorig=L(y,f(X)),例如均方误差。
2:对于每个特征j,
j
=
1
,
…
,
p
j=1,\dots,p
j=1,…,p:
(1)通过排列数据
X
X
X中的特征
j
j
j生成特征矩阵
X
P
E
R
M
X^{PERM}
XPERM,打破了特征
j
j
j与真实结果
Y
Y
Y之间的关联。
(2)基于排列后数据的预测估计误差
E
P
E
R
M
=
L
(
Y
,
f
(
X
P
E
R
M
)
)
E^{PERM}=L(Y,f(X^{PERM}))
EPERM=L(Y,f(XPERM))。
(3)计算排列特征的重要性
F
I
j
=
e
p
e
r
m
/
e
o
r
i
g
FI^j = e^{perm}/e^{orig}
FIj=eperm/eorig。或者使用两者之差:
F
I
j
=
e
p
e
r
m
−
e
o
r
i
g
FI^j=e^{perm}-e^{orig}
FIj=eperm−eorig。
3:通过FI降序排序特征。
Fisher、Rudin和Dominici(2018)在他们的论文中建议将数据集一分为二,交换两半数据集中的特征j的值,而不是置换特征j。 这与置换特性J完全相同,如果你仔细考虑的话。 如果您想要一个更精确的估计,您可以通过将每个实例与每个其他实例的特征j值配对来估计置换特征j的误差(除了与它本身)。 这给出了一个大小为n(n-1)的数据集来估计置换误差,它需要大量的计算时间。 我只能推荐使用n(n-1)-方法,如果你真的想要得到非常准确的估计。
Should I compute Importance on Training or Test Data?
回答关于训练或测试数据的问题触及了什么特征是重要的基本问题。 理解基于训练的特征重要性与基于测试数据的特征重要性之间差异的最佳方法是一个“极端”示例。 我训练了一个支持向量机来预测一个连续的、随机的目标结果,给定50个随机特征(200个实例)。 我所说的“随机”是指要预测的目标结果其实是独立于50个特征, 这就像给出最新的彩票号码来预测明天的温度一样。 如果模型“学习”了任何关系,那么它就会重叠。 事实上,支持向量机确实对训练数据进行了过度拟合。 训练数据的平均绝对误差(简称:MAE)为0.29,测试数据的平均绝对误差为0.82,这也是预测平均结果为0(MAE为0.78)的最佳模型的误差。 换句话说,SVM模型是垃圾。 对于这个过度拟合的支持向量机(SVM)模型来说,你期望特性重要性的值是多少? 零的话,是因为没有一个特性有助于在看不见的测试数据上提高性能? 或者,不管学习到的函数模型是否可以推广未知的数据,这些输入应该反映模型对每个特征的依赖程度吗? 让我们来看看训练数据和测试数据的特征输入的分布是如何不同的。
![](https://i-blog.csdnimg.cn/blog_migrate/66a856ea0affdae70a0732d0290e079d.jpeg)
The case for test Data
这是一个简单的例子:基于训练数据的模型误差估计是垃圾->特征重要性依赖于模型误差估计->基于训练数据的特征重要性是垃圾。 事实上,这是你在机器学习中首先学习的事情之一:如果你在训练模型的相同数据上测量模型误差(或性能),测量结果通常过于乐观,这意味着模型似乎比现实中工作得好得多。 由于置换特征的重要性依赖于模型误差的测量,我们应该使用看不见的测试数据。 基于训练数据的特征重要性使我们错误地认为特征对于预测是重要的,而实际上模型只是过拟合,特征根本不重要。
The case for training Data
使用训练数据集训练并得到的特征重要性结论可能是难以令人说服的,以上得到的支持向量机模型算出的重要特征是 X 42 X_{42} X42。让我们看看特性 X 42 X_{42} X42的部分依赖关系图。 部分依赖图显示了模型输出如何根据特征的变化而变化,而不依赖于泛化误差。 PDP是用训练数据还是测试数据计算的并不重要。
![](https://i-blog.csdnimg.cn/blog_migrate/c17f299f8caee013ff692f0dc6352e87.jpeg)
该图清楚地表明,支持向量机已经学会依赖特征 X 42 X_{42} X42进行预测,但根据基于测试数据(1)的特征重要性,它并不重要。 基于训练数据,重要度为1.19,反映出模型已经学会使用这一特征。 基于训练数据的特征重要性告诉我们哪些特征对模型是重要的,因为它依赖于它们来进行预测。
作为使用训练数据的一部分,我想介绍一个反对测试数据的论点。 在实践中,您希望使用所有的数据来训练您的模型,以最终获得可能的最佳模型。 这意味着不会留下未使用的测试数据来计算特征重要性。 当您要估计模型的泛化误差时,您也会遇到同样的问题。 如果对特征重要性估计使用(嵌套的)交叉验证,您将会遇到这样的问题,即特征重要性不是在具有所有数据的最终模型上计算的,而是在具有可能表现不同的数据子集的模型上计算的。
最后,您需要决定是想知道模型在多大程度上依赖于每个特性来进行预测(->训练数据),还是想知道该特性在多大程度上有助于模型在未见数据上的性能(->测试数据)。 据我所知,没有研究解决训练和测试数据的问题。 它将需要比我的“垃圾-SVM”示例更彻底的检查。 我们需要对这些工具进行更多的研究和更多的经验,以获得更好的理解。