在图像分类任务中,了解哪些像素对于分类结果更为重要是非常有价值的。本文将介绍如何使用随机森林算法来评估人脸数据集中像素的重要性。目标是识别出那些对于分类结果影响最大的像素点。
首先,需要加载人脸数据集,并将其限制在前五个类别中。然后,将使用随机森林算法对数据集进行训练,并评估基于不纯度的特征重要性。需要注意的是,这种方法不能在独立的测试集上进行评估。在这个例子中,关注的是表示从完整数据集中学习到的信息。此外,还将设置用于任务的核心数。
from sklearn.datasets import fetch_olivetti_faces
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)
在Jupyter环境中,请重新运行此单元格以显示HTML表示或信任笔记本。在GitHub上,HTML表示无法渲染,请尝试使用nbviewer.org加载此页面。
特征重要性由拟合的属性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()
计算重要性的耗时:0.104秒。
对于这个数据集,MDI的局限性不是问题,因为:所有特征都是(有序的)数字,因此不会受到基数偏差的影响;只对表示在训练集上获得的森林知识感兴趣。如果这两个条件不满足,建议使用permutation_importance。