はじめに
この実験では、scikit-learn ライブラリを使って Olivetti Faces データセットに対してランダムフォレストを学習し、不純度に基づく特徴量の重要度を評価します。特徴量の重要度を使って画素の重要度のヒートマップを作成します。また、複数のジョブ内で予測の構築と計算を並列化します。
VM のヒント
VM の起動が完了したら、左上隅をクリックして ノートブック タブに切り替えて、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題があった場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
データの読み込みとモデルのフィッティング
まず、Olivetti Faces データセットを読み込み、最初の 5 クラスのみを含むようにデータセットを制限します。その後、データセットに対してランダムフォレストを学習し、不純度に基づく特徴量の重要度を評価します。タスクに使用するコア数を設定します。
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 to compute the importances: {elapsed_time:.3f} seconds")
imp_reshaped = importances.reshape(img_shape)
plt.matshow(imp_reshaped, cmap=plt.cm.hot)
plt.title("Pixel importances using impurity values")
plt.colorbar()
plt.show()
ヒートマップを解釈する
ヒートマップは画素の重要度を示しています。画素が赤くなるほど、その画素は重要です。Olivetti Faces データセットの分類に寄与する重要な画素を観察することができます。
まとめ
この実験では、Olivetti Faces データセットに対してランダムフォレストを学習し、不純度に基づく特徴量の重要度を評価する方法を学びました。画素の重要度のヒートマップを作成し、Olivetti Faces データセットの分類に寄与する重要な画素を観察しました。