模型特征重要性分析

机器学习中,了解模型依赖于哪些特征对于预测结果至关重要。一种评估特征对模型统计性能贡献的方法是通过随机排列特征值并观察模型得分的下降程度。这种方法特别适用于非线性或不透明的估计器。通过破坏特征与目标之间的关联,可以确定模型在多大程度上依赖于特定的特征。

在下面的图表中,观察到排列特征对特征与目标之间的相关性以及模型统计性能的影响。在顶部的图表中,可以看到排列一个预测性特征会破坏特征与目标之间的相关性,从而导致模型统计性能的下降。在底部的图表中,观察到排列一个非预测性特征并不会显著降低模型的统计性能。

排列特征重要性的一个关键优势是它是模型无关的,即可以应用于任何拟合的估计器。此外,它可以通过不同排列的特征多次计算,进一步提供特定训练模型估计特征重要性的方差度量。

下图显示了在包含随机分类和随机数值特征的泰坦尼克数据集的增强版本上训练的RandomForestClassifier的排列特征重要性。需要注意的是,对于交叉验证得分低的模型,可能被认为不重要的特征对于好的模型可能非常重要。因此,在计算重要性之前,始终使用保留集(或更好的交叉验证)评估模型的预测能力是非常重要的。排列重要性并不反映特征本身的内在预测价值,而是对于特定模型的重要性。

排列重要性函数计算给定数据集的估计器的特征重要性。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)

其通过R^2得分衡量的验证性能显著高于偶然水平。这使得可以使用排列重要性函数来探究哪些特征最具预测性:

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} +/- {r.importances_std[i]:.3f}")

需要注意的是,顶级特征的重要性值代表了参考得分0.356的很大一部分。排列重要性可以在训练集或保留的测试集或验证集上计算。使用保留集可以突出显示哪些特征对被检查模型的泛化能力贡献最大。在训练集上重要但在保留集上不重要的特征可能会导致模型过拟合。

排列特征重要性取决于通过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} +/- {r.importances_std[i]:.3f}")

即使不同指标的重要性值尺度非常不同,不同指标下特征的排名大致相同。然而,这并不保证,不同的指标可能会导致显著不同的特点重要性,特别是对于训练用于不平衡分类问题的模型,分类指标的选择可能是关键的。

排列重要性算法的概述:输入:拟合的预测模型m,表格数据集(训练或验证)D。计算模型m在数据D上的参考得分s(例如,分类器的准确性或回归器的R^2)。对于每个特征j(D的列):对于重复k在{1, ..., K}中:随机打乱数据集D的列j,生成一个名为\tilde{D}_{k,j}的数据的损坏版本。计算模型m在损坏数据\tilde{D}_{k,j}上的得分s_{k,j}。计算特征f_j的重要性i_j,定义为:i_j = s - \frac{1}{K} \sum_{k=1}^{K} s_{k,j}。

与基于不纯度的重要性的关系:基于树的模型提供了另一种特征重要性的度量,基于平均不纯度的减少(MDI)。不纯度由决策树的分割标准量化(Gini、Log Loss或均方误差)。然而,当模型过拟合时,这种方法可能会给可能在未见数据上没有预测力的特征赋予高重要性。另一方面,基于排列的特征重要性避免了这个问题,因为它可以在未见数据上计算。此外,对于树的基于不纯度的特征重要性具有很强的偏见,并且倾向于高基数特征(通常是数值特征)而不是低基数特征,如二元特征或具有少数可能类别的分类变量。基于排列的特征重要性没有表现出这种偏见。此外,排列特征重要性可以与模型预测的任何性能指标一起计算,并且可以用来分析任何模型类别(不仅仅是基于树的模型)。

以下示例突出了基于不纯度的特征重要性与基于排列的特征重要性的局限性对比:排列重要性与随机森林特征重要性(MDI)。

当两个特征相关,并且排列其中一个特征时,模型仍然可以通过其相关特征访问后者。这导致报告的两个特征的重要性值较低,尽管它们实际上可能很重要。下图显示了使用乳腺癌威斯康星(诊断)数据集训练的RandomForestClassifier的排列特征重要性,该数据集包含强相关特征。

处理这个问题的一种方法是对相关特征进行聚类,并且只保留每个聚类中的一个特征。有关此策略的更多详细信息,请参见示例“具有多重共线性或相关特征的排列重要性”。

示例:排列重要性与随机森林特征重要性(MDI)。具有多重共线性或相关特征的排列重要性。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485