機械学習は便利なツールである一方、結果の解釈や説明が難しいのがデメリットと一般的に言われています。そこで今回は機械学習を解釈する手法の1つであるPFI(Permutation Feature Importance)についてご紹介します。
PFI(Permutation Feature Importance)とは
Permutationとは順列/並べ替えの意であり、対象の変数をランダムにシャッフルすることにより、どの変数(特徴量)が結果に影響を与えているかその重要度を示す指標です。
機械学習では多くの特徴量を作成しモデルに組み込み予測することになります。特徴量を増やすほど何が寄与しているのかわかりにくくなっていきます。PFIは、結局どの特徴量がアウトプットにインパクトしたの?という概略をつかむための手法です。
PFIの使い方
「eli5」のライブラリでPFIを算出することができます。
データはKaggleのタイタニックのデータを利用しています。
##############################
#データの読み込み
##############################
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)
##############################
#PFIで評価
##############################
import eli5
from eli5.sklearn import PermutationImportance
PFI = PermutationImportance(lgb, random_state=1).fit(X_train, y_train)
eli5.show_weights(PFI, feature_names = X_train.columns.tolist())
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 |
Feature Importanceとの違い
PFIと通常のFeature Importanceはの違いは重要とする指標がことなります。
それぞれの特徴量について、PFIはモデルの結果に影響するかを指標にしているのに対して、Feature Importanceはモデルを作成するのに影響する指標にしています。
比較してみる
実際にPFIと通常のFeature Importanceを比較してみましょう
今回はLGBMClassifierを利用しているので「.feature_importances_」を指定。Regressorの場合は「.feature_importance()」となり書き方が異なるので注意!
pd.DataFrame(lgb.feature_importances_,
index=X_train.columns.tolist(),
columns=['importance']
).sort_values('importance',ascending= False)
Feature | importance |
---|---|
Fare | 1296 |
Age | 1212 |
SibSp | 110 |
Pclass | 108 |
Sex_male | 92 |
Embarked_S | 84 |
Parch | 62 |
Embarked_Q | 36 |
PFI(SEX → Age → Fare → …)とFeature Importance(Fare → Age → SibSp → …)で結果が異なります。これは前述の通り何を指標とするかの違いから生じています。
Feature Importanceはモデルを作成するのに重要な特徴量の重みとなります。
例えばFeature Importanceで重要とされるFare,Ageは連続値を取るのに対し、その他の指標(SEX,SibSp,Pclassなど)は01のフラグとなっています。連続値であればいろんな値で切り口がありモデルを作る上で複雑な分岐を形成しますが、フラグはそもそも切り口が少なく分岐も限られたものになってしまいます。
結果Fare,Ageなどの特徴量がモデル作成によく使われ、Feature Importanceでは重要と判断されます。
一方、モデルのアウトプット(Survived)への影響としてはPFIで算出したように性別が一番重要という結論になります。
PFIの原理
PFIは対象の特徴量をシャッフルしてその予測結果の差異から重要度を算出します。
X0の重要度を算出する場合、その他の特徴量はそのままでX0だけをシャッフルします。元データにモデルを適用して出力された予測結果と、シャッフル後のデタラメなデータに適用した予測結果を比較します。
予測結果の差が大きかった場合はデタラメデータで正しく予測できない(重要な変数である)ことになり、差が小さければ予測結果にほとんど影響を与えない(重要ではない変数である)ことになります。
PFIの使い所と弱点
PFIでは影響度が大きいことがわかっても、
・目的変数にプラスに働く特徴量なのか、マイナスに働く特徴量なのかわからない
・線形に影響を与えるものなのか、しきい値などがあって非線形に影響を与えるものなのかわからない
などの弱点があります。
「作成したモデルで結局どの特徴量が影響しているの?」を端的にわかりやすく説明するための手法として利用できます。機械学習でモデルを作ったら初手PFIでざっくり概要を理解するのに最適です。
参考図書
機械学習を解釈する技術としてPFI、PD、ICE、SHAPについて解説されています。難しい数式というより理解しやすく書かれていてオススメです。