機械学習は便利なツールである一方、結果の解釈や説明が難しいのがデメリットと一般的に言われています。そこで今回は機械学習を解釈する手法の1つであるPD(Partial Dependence)についてご紹介します。
PD(Partial Dependence)とは
Partial Dependenceは特徴量と目的変数の関係性を理解するための手法です。
PFI(Permutation Feature Importance)では特徴量がどの程度目的変数に影響を与えるか、を知ることができましたが、どのような関係性があるのかはわかりませんでした。
PFIでは影響度が大きいことがわかっても、
・目的変数にプラスに働く特徴量なのか、マイナスに働く特徴量なのかわからない
・線形に影響を与えるものなのか、しきい値などがあって非線形に影響を与えるものなのかわからない
一方PDは、特徴量の値が大きくなると目的変数がどう変わるのか?、特徴量と目的変数が線形に対応するのか非線形に対応するのか?など特徴量の値に応じて目的変数がどのように変わるのかを理解することができます。
PDの使い方
「sklearn.inspection」のライブラリでPDを算出することができます。
データはKaggleのタイタニックのデータを利用しています。
scikit-learnのバージョンが1.1までの場合
1.2以降の場合は「scikit-learnバージョンによるエラーと解決方法」をご覧ください
import pandas as pd
from lightgbm import LGBMClassifier
##############################
#データの読み込み
##############################
import pandas as pd
TRAIN = pd.read_csv('train.csv')
TRAIN = TRAIN[['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
TRAIN = pd.get_dummies(TRAIN, drop_first=True)
TRAIN = TRAIN.fillna(TRAIN.median())
X_train = TRAIN.iloc[:,1:]
y_train = TRAIN['Survived']
##############################
#モデル作成と予測
##############################
from lightgbm import LGBMClassifier
lgb = LGBMClassifier()
lgb.fit(X_train,y_train)
##############################
#PDで評価
##############################
from sklearn.inspection import plot_partial_dependence
import matplotlib.pyplot as plt
#プロットする
plt.rcParams['figure.figsize'] = (15.0, 7.0)
plot_partial_dependence(estimator = lgb, X = X_train, features = X_train.columns.tolist(),
n_jobs = -1, grid_resolution = 20, n_cols =4)
目的変数のsurvivedが0:死亡/1:生存ですので、
・Pclassが小さいほど
・年齢が小さいほど
・Fareが大きいほど
・女性(Sex_male = 0)ほど
生存率が高いことがわかります。
また、
・年齢は10歳以下は特に生存率が高く、10歳より大きい場合はだんだん低く
・SibSpは2以下で生存率が上がる方向に寄与しているが、3以上はほとんど変わらない
など非線形な動きや閾値を知ることができます。
PFI(Permutation Feature Importance)との違い
PFIは単純な重要度だけであったため、
・値の大小によって目的変数がどっち方向に変わるのか
・線形か非線形か
などの要素についてはわかりませんでした。
PDはより詳しく機械学習の結果を解釈することができます。
同じタイタニックデータでのPFI
PDの結果と同じくSex、Age、Fareの効果が大きいことがわかります。
Weight | Feature |
---|---|
0.2283 ± 0.0192 | Sex_male |
0.1389 ± 0.0144 | Age |
0.1172 ± 0.0147 | Fare |
0.0988 ± 0.0201 | Pclass |
0.0258 ± 0.0084 | Embarked_S |
0.0236 ± 0.0055 | SibSp |
0.0108 ± 0.0027 | Parch |
0.0018 ± 0.0030 | Embarked_Q |
PDの原理
PDは下記のように、X0以外の特徴量(X1,X2)はそのままでX0の値をすべて上書きしたデータで予測します。その仮想のデータの予測値の平均をとることでX0=1のときの目的変数がどれくらいになるのかがわかります。
同様にX0=2,X0=3と値を変えていくことでX0がそれぞれの値で目的変数(の平均)がどのように変わるのかがわかります。
scikit-learnバージョンによるエラーと解決方法
scikit-learnのバージョン1.2以降では「plot_partial_dependence」廃止となりましたので、異なる記述方法が必要となりますのでご注意ください。
エラー内容
「plot_partial_dependence」が廃止となったためそもそもインポートすることができません
from sklearn.inspection import plot_partial_dependence
#ImportError: cannot import name 'plot_partial_dependence' from 'sklearn.inspection'
PD(1.2.0以降での記述方法)
##############################
#PDで評価
##############################
from sklearn.inspection import PartialDependenceDisplay
#プロットする
display = PartialDependenceDisplay.from_estimator(
lgb,
X_train,
features= X_train.columns.tolist(),
)
参考図書
機械学習を解釈する技術としてPFI、PD、ICE、SHAPについて解説されています。難しい数式というより理解しやすく書かれていてオススメです。