排列特征重要性

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,我们将学习排列特征重要性方法,这是一种用于确定预测模型中特征重要性的模型检查技术。该技术对于难以解释的非线性或不透明模型特别有用。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

加载数据集

首先,我们需要加载一个可用于训练预测模型的数据集。我们将使用 scikit-learn 中的糖尿病数据集,其中包含糖尿病患者的信息。

from sklearn.datasets import load_diabetes

## 加载糖尿病数据集
diabetes = load_diabetes()

## 将数据拆分为训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(diabetes.data, diabetes.target, random_state=0)

训练模型

接下来,我们将在训练数据上训练一个回归模型。在这个例子中,我们将使用岭回归模型。

from sklearn.linear_model import Ridge

## 训练岭回归模型
model = Ridge(alpha=1e-2).fit(X_train, y_train)

评估模型

现在我们将使用验证集来评估训练好的模型。这里使用的评估指标是决定系数(R-squared score)。

## 在验证集上评估模型
score = model.score(X_val, y_val)
print("验证分数:", score)

计算排列特征重要性

现在,我们将使用 scikit-learn 中的permutation_importance函数来计算排列特征重要性。此函数将训练好的模型、验证集以及特征应被置换的次数作为输入。

from sklearn.inspection import permutation_importance

## 计算排列特征重要性
result = permutation_importance(model, X_val, y_val, n_repeats=30, random_state=0)

## 打印特征重要性
for i in result.importances_mean.argsort()[::-1]:
    if result.importances_mean[i] - 2 * result.importances_std[i] > 0:
        print(f"{diabetes.feature_names[i]}: {result.importances_mean[i]:.3f} +/- {result.importances_std[i]:.3f}")

解释结果

计算得到的特征重要性表示当单个特征值被随机打乱时模型分数的下降情况。重要性值较高的特征表明模型在进行预测时对这些特征的依赖程度更高。

在这个例子中,对模型性能贡献最大的前几个特征是“s5”、“bmi”、“bp”和“sex”。

总结

在这个实验中,我们学习了用于评估预测模型中特征重要性的排列特征重要性方法。我们经历了加载数据集、训练模型、评估模型、计算特征重要性以及解释结果的步骤。这种方法对于理解哪些特征最具预测性以及模型对每个特征的依赖程度非常有价值。