赞
踩
排列特征重要性是一种模型检验技术,用于衡量每个特征对于给定表格数据集上已拟合模型的统计性能的贡献。这种技术对于非线性或不透明的估计器特别有用,它涉及随机打乱单个特征的值,并观察模型得分的降低情况。通过破坏特征与目标之间的关系,我们可以确定模型在多大程度上依赖于该特定特征。
在下面的图中,我们观察到对特征进行排列对特征与目标之间的相关性以及模型的统计性能产生的影响。
在上面的图中,我们观察到对一个具有预测性的特征进行排列会破坏特征与目标之间的相关性,从而导致模型的统计性能下降。在下面的图中,我们观察到对一个无预测性的特征进行排列不会显著降低模型的统计性能。
排列特征重要性的一个关键优势是它是与模型无关的,即它可以应用于任何已拟合的估计器。此外,可以使用不同的特征排列多次计算,进一步提供对特定训练模型的估计特征重要性的方差的度量。
下图显示了在一个包含随机分类特征和随机数值特征(即与目标变量无任何相关性)的泰坦尼克号数据集的增强版本上训练的~sklearn.ensemble.RandomForestClassifier
的排列特征重要性:
[!WARNING]
对于一个糟糕的模型来说,被认为是低重要性的特征(交叉验证得分低)可能对于一个好模型来说是非常重要的。因此,在计算重要性之前,始终重要评估模型的预测能力,使用一个留出集(或更好的是交叉验证)。排列重要性不能反映特征本身的固有预测价值,而是特定模型中该特征的重要性。
permutation_importance
函数计算给定数据集上estimators
的特征重要性。n_repeats
参数设置特征随机洗牌的次数,并返回特征重要性的样本。
让我们考虑以下已训练的回归模型:
>>> from sklearn.datasets import load_diabetes
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.linear_model import Ridge
>>> diabetes = load_diabetes()
>>> X_train, X_val, y_train, y_val = train_test_split(
... diabetes.data, diabetes.target, random_state=0)
...
>>> model = Ridge(alpha=1e-2).fit(X_train, y_train)
>>> model.score(X_val, y_val)
0.356...
通过
R
2
R^2
R2得分测量的验证性能明显大于随机水平。这使得可以使用permutation_importance
函数来探索哪些特征最具预测性:
>>> from sklearn.inspection import permutation_importance
>>> r = permutation_importance(model, X_val, y_val,
... n_repeats=30,
... random_state=0)
...
>>> for i in r.importances_mean.argsort()[::-1]:
... if r.importances_mean[i] - 2 * r.importances_std[i] > 0:
... print(f"{diabetes.feature_names[i]:<8}"
... f"{r.importances_mean[i]:.3f}"
... f" +/- {r.importances_std[i]:.3f}")
...
s5 0.204 +/- 0.050
bmi 0.176 +/- 0.048
bp 0.088 +/- 0.033
sex 0.056 +/- 0.023
注意,前几个特征的重要性值占参考得分0.356的很大一部分。
排列重要性可以在训练集上或留出的测试或验证集上计算。使用留出集可以突出显示哪些特征对于检验模型的泛化能力最有贡献。在训练集上重要但在留出集上不重要的特征可能导致模型过拟合。
排列特征重要性取决于使用评分参数指定的评分函数。此参数接受多个评分器,这比多次使用不同评分器调用permutation_importance
更高效,因为它重用了模型的预测。
使用多个评分器的排列特征重要性示例
在下面的示例中,我们使用一个指标列表,但更多的输入格式是可能的,如multimetric_scoring
中所述。
>>> scoring = [‘r2’, ‘neg_mean_absolute_percentage_error’, ‘neg_mean_squared_error’] >>> r_multi = permutation_importance( … model, X_val, y_val, n_repeats=30, random_state=0, scoring=scoring) … >>> for metric in r_multi: … print(f"{metric}“) … r = r_multi[metric] … for i in r.importances_mean.argsort()[::-1]: … if r.importances_mean[i] - 2 * r.importances_std[i] > 0: … print(f” {diabetes.feature_names[i]:<8}" … f"{r.importances_mean[i]:.3f}" … f" +/- {r.importances_std[i]:.3f}") … r2 s5 0.204 +/- 0.050 bmi 0.176 +/- 0.048 bp 0.088 +/- 0.033 sex 0.056 +/- 0.023 neg_mean_absolute_percentage_error s5 0.081 +/- 0.020 bmi 0.064 +/- 0.015 bp 0.029 +/- 0.010 neg_mean_squared_error s5 1013.866 +/- 246.445 bmi 872.726 +/- 240.298 bp 438.663 +/- 163.022 sex 277.376 +/- 115.123
不同指标的特征排序大致相同,即使重要性值的尺度非常不同。然而,这并不是保证的,不同的指标可能导致显著不同的特征重要性,特别是对于训练用于不平衡分类问题的模型,分类指标的选择可能至关重要。
输入:已拟合的预测模型 m m m,表格数据集(训练或验证) D D D。
计算模型 m m m在数据 D D D上的参考得分 s s s(例如分类器的准确性或回归器的 R 2 R^2 R2)。
对于每个特征 j j j( D D D的列):
对于重复次数 k k k在 1 , . . . , K {1, ..., K} 1,...,K中:
计算特征 f j f_j fj的重要性 i j i_j ij定义为:
i j = s − 1 K ∑ k = 1 K s k , j i_j = s - \frac{1}{K} \sum_{k=1}^{K} s_{k,j} ij=s−K1k=1∑Ksk,j
基于树的模型提供了一种基于平均不纯度减少<random_forest_feature_importance>(MDI)的特征重要性
的替代方法。不纯度由决策树的分裂准则(基尼系数、对数损失或均方误差)量化。然而,这种方法可能会赋予那些在模型过拟合时在未见数据上可能不具有预测性的特征较高的重要性。另一方面,基于排列的特征重要性避免了这个问题,因为它可以在未见数据上计算。
此外,对于树的基于不纯度的特征重要性,存在严重的偏差,偏好高基数特征(通常是数值特征)而不是低基数特征,例如二进制特征或具有少量可能类别的分类变量。
排列特征重要性不具有这样的偏差。此外,排列特征重要性可以使用模型预测的任何性能指标计算,并且可以用于分析任何模型类别(不仅限于基于树的模型)。
当两个特征相关,并且其中一个特征被置换时,模型仍然可以通过其相关特征访问后者。这导致两个特征的报告重要性值较低,尽管它们可能实际上是重要的。
下图显示了使用 breast_cancer_dataset
训练的 ~sklearn.ensemble.RandomForestClassifier
的置换特征重要性,该数据集包含强相关特征。一个天真的解释会认为所有特征都不重要:
解决这个问题的一种方法是对相关的特征进行聚类,并只保留每个聚类中的一个特征。
有关此策略的更多详细信息,请参见示例 sphx_glr_auto_examples_inspection_plot_permutation_importance_multicollinear.py
。
示例:
sphx_glr_auto_examples_inspection_plot_permutation_importance.py
sphx_glr_auto_examples_inspection_plot_permutation_importance_multicollinear.py
参考文献:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。