Permutation Importance: 機械学習モデルを「特徴量の重要度」から解釈する

ビジネスで機械学習モデルを活用する場合には、ブラックボックスなモデルの挙動を解釈することが必要である場合があります。本記事では、特徴量の重要度という観点から機械学習モデルを解釈する「Permutation Importance」について解説します。
1 はじめに
近年の機械学習モデルは、LightGBMやDeep Neural Networkなどの高度なアルゴリズムによって、高い予測性能が達成されています。これらの複雑な機械学習モデルは「ブラックボックス」とも呼ばれ、モデルがどのように予測値を出力しているのかを人間が理解するのは非常に困難です。
ビジネスで機械学習モデルを活用する場合には、モデルがブラックボックスであることは大きな問題となることがあります。モデルの挙動を理解することは、予測値に対する信頼性を高め、ユーザーに納得してモデルを使用してもらうために非常に重要です。また、医療や自動運転など大きなリスクを伴う意思決定にAIを活用する場合、モデルの挙動をある程度説明できる必要があるでしょう。
そこで本記事では、予測モデルを解釈する手法の一つである、Permutation Importanceについて解説します。
2 Permutation Importance の計算方法
Permutation Importance (PI) は、既存の学習済みモデルを再学習することなく、モデルが予測にどの特徴量を重要視しているかを評価する方法です。重要度を知りたい特徴量の値をシャッフルし、その特徴量が持つ重要度を数値化します。
具体的には、以下の手順によって特徴量の重要度を計算します。
1 モデルのベースライン性能(テストデータ全体に対する予測精度)を測定する。
2 一つの特徴量をシャッフルしたデータセットを作成する。
3 そのデータセットで再度予測を行い、新たな予測精度を測定する。
4 予測精度がどれだけ低下したかをその特徴量の重要度とする。
5 重要度を知りたい全ての特徴量について、2 ~ 4 を繰り返す。
PIでは、特徴量をシャッフルすることでその特徴量の情報がなくなることの影響を測定し、予測モデルの出力がその特徴量にどれだけ依存していたかを評価します。
(森下 (2021)『機械学習を解釈する技術』を元に作成)
3 Pythonでの実行例
実行環境
Python 3.11.9
データの準備
今回は、scikit-learnの fetch_california_housing データセットを使用します。これは、1990年のカリフォルニアにおける住宅価格のデータセットです。ターゲット変数である住宅価格を予測する回帰問題を解くために使われます。
# 必要なライブラリをインポート
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
from sklearn.inspection import permutation_importance
# カリフォルニア住宅価格データセットを読み込む
california = fetch_california_housing()
# データをDataFrameに変換
df = pd.DataFrame(california.data, columns=california.feature_names)
# カラム名を日本語に変更
japanese_columns = {
'MedInc': '世帯の中央値収入',
'HouseAge': '住宅の築年数',
'AveRooms': '平均部屋数',
'AveBedrms': '平均寝室数',
'Population': '人口',
'AveOccup': '世帯の平均人数',
'Latitude': '緯度',
'Longitude': '経度',
}
df.rename(columns=japanese_columns, inplace=True)
df['住宅価格'] = california.target
# 特徴量とターゲットに分ける
X = df.drop('住宅価格', axis=1)
y = df['住宅価格']
# データをトレーニングセットとテストセットに分割(8:2)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
学習済みモデルの準備
今回は、scikit-learnの GradientBoostingRegressor を用いて予測モデルを学習します。
PIは学習アルゴリズムに依存せずに特徴重要度を計算できるため、解きたい問題設定に応じて、他のアルゴリズムを用いることもできます。
# モデルの構築
gbr = GradientBoostingRegressor()
# モデルのトレーニング
gbr.fit(X_train, y_train)
PIの計算
Pythonでは、scikit-learnの permutation_importance を用いて簡単にPIを計算することができます。
# テストデータを用いて特徴量重要度を計算
result = permutation_importance(gbr, X_test, y_test, n_repeats=10,
random_state=42, n_jobs=-1)
ここでは、各特徴量のシャッフルを10回繰り返して、予測精度の差の平均を特徴重要度としています。
結果の可視化
# 結果を可視化
sorted_idx = result.importances_mean.argsort()
plt.figure(figsize=(10, 6))
plt.barh(
X_test.columns[sorted_idx], result.importances_mean[sorted_idx],
color='skyblue', edgecolor='black',
)
plt.xlabel('パーミュテーションによる重要度')
plt.title('PIによる特徴量重要度')
plt.show()
結果として、以下のような横棒グラフが描画されます。
縦軸が特徴量、横軸が重要度を表します。
4 メリットと限界
PIには、主に次のようなメリットがあります。
直感的に理解できる
計算アルゴリズムがシンプルであるため、モデルの挙動を把握しやすい。
機械学習アルゴリズムに依存しない
モデルの学習アルゴリズムに依存せずに使用できるため、モデル間の比較も可能。
モデルの再学習の必要性がない
PIでは学習済みモデルを利用して重要度を評価できるため、新たにモデルを再学習する必要がありません。
重要度を知りたい特徴量をシャッフルする代わりに、データセットから取り除いて予測精度の低下を測ることで重要度を計算することもできますが、その場合はモデルの再学習が必要になります。
一方でPIには次のような限界があるため、使用する際には注意が必要です。
因果関係として解釈できない
PIで計算されるのはあくまで予測モデルにおける特徴量とターゲット変数の相関関係である。重要度が高いと計算された特徴量とターゲット変数との間に因果関係があるとは限らない点に注意する必要があります。
特徴量間の相関の影響
相関が強い特徴量のペアがある場合、PIの値が歪む可能性があります。 その場合は別の手法を用いることが推奨されます。
5 まとめ
Permutation Importanceは、機械学習モデルにグローバルな解釈を与える有効な手法です。ある特徴量の値をシャッフルすることによる予測精度の低下を測るというシンプルな手法であり、直感的に解釈することが可能です。一方で、因果関係の説明には使用できず、特徴量間の相関に弱いなど、いくつかの限界も存在します。これらの限界を理解することが、PIを用いてモデルを正しく解釈するために重要です。
6 参考資料
森下(2021)『機械学習を解釈する技術』技術評論社
Christoph Molnar (2024) Interpretable Machine Learning.