使用并行决策树森林的像素重要性

Beginner

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

简介

在本实验中,我们将使用 scikit-learn 库在 Olivetti Faces 数据集上训练一个随机森林,并评估基于杂质的特征重要性。我们将使用特征重要性来创建像素重要性的热图。我们还将在多个作业中并行化预测的构建和计算。

虚拟机使用提示

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

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

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

加载数据与模型拟合

我们首先加载 Olivetti Faces 数据集,并将数据集限制为仅包含前五个类别。然后,我们在该数据集上训练一个随机森林,并评估基于杂质的特征重要性。我们将设置用于任务的核心数量。

from sklearn.datasets import fetch_olivetti_faces

## 我们选择用于执行森林模型并行拟合的核心数量。`-1` 表示使用所有可用核心。
n_jobs = -1

## 加载人脸数据集
data = fetch_olivetti_faces()
X, y = data.data, data.target

## 将数据集限制为 5 个类别。
mask = y < 5
X = X[mask]
y = y[mask]

## 将拟合一个随机森林分类器以计算特征重要性。
from sklearn.ensemble import RandomForestClassifier

forest = RandomForestClassifier(n_estimators=750, n_jobs=n_jobs, random_state=42)

forest.fit(X, y)

评估特征重要性

我们基于杂质平均减少量(MDI)来评估特征重要性。特征重要性由拟合属性 feature_importances_ 提供,它们是通过计算每棵树内杂质减少量累积的均值和标准差得到的。

import time
import matplotlib.pyplot as plt

start_time = time.time()
img_shape = data.images[0].shape
importances = forest.feature_importances_
elapsed_time = time.time() - start_time

print(f"计算重要性所花费的时间:{elapsed_time:.3f} 秒")
imp_reshaped = importances.reshape(img_shape)
plt.matshow(imp_reshaped, cmap=plt.cm.hot)
plt.title("使用杂质值的像素重要性")
plt.colorbar()
plt.show()

解读热图

热图展示了像素的重要性。像素越红,其重要性越高。我们可以观察到对 Olivetti Faces 数据集分类有贡献的重要像素。

总结

在本实验中,我们学习了如何在 Olivetti Faces 数据集上训练随机森林,并评估基于杂质的特征重要性。我们创建了像素重要性的热图,并观察到了对 Olivetti Faces 数据集分类有贡献的重要像素。