#8 Scikit-learn の Random Forest の Permutation importance を計算

yamasaKit
6 min readNov 14, 2018

--

TL; DR

Scikit-learn の Random Forest の feature_importance_ は Gini importance でありバイアスがかかっていることがあります。バイアスが気になるなら rfpimp などのモジュールを使って Permutation importance を計算して評価するといいと思います。

背景

Random Forest は計算コストがかからないのによい予測性能を示すことが多くて大変気に入っていますが、非線形なのもあり説明変数の重みに正負がなく評価が難しい時があります。

何かいい方法がないかなと思って色々調べたら紆余曲折あり勉強になったので備忘録としてまとめておきます。

結果

以下の Repository を見つけました。

ふむふむ、 Permutation importance という重みを計算してくれる module のようですね。 Permutation importance ってなんだろうなって思ってたらちょうど日本語でまとめてくれた方の Tweet が Retweet されてきました。Twitter すごい。

OOB や外部セットなど予測モデル構築に用いなかったデータを構築した予測モデルで予測しその時の予測性能をベースラインとします。次に、ある説明変数の値を y-randomization のようにシャッフルし予測モデルを構築し同じく予測性能を求めます。その時、その説明変数が大事なほど予測性能が大きく下がっているはずです。これを各説明変数で行い重要度とするのが Permutation Importance のようです。

うーん、 Random Forest の重要度は、例えば以下のスライドの 8 枚目のように「決定木を作成した後に説明変数をランダムに入れ替える。その後 OOB を予測し、入れ替え前と予測性能の差から求める」と勉強していたので、「ほとんど同じ感じだしそんなに差が変わるものなのかな?」と初めは思いました。

しかし、初めに紹介した rfpimp のトップページのリンクからいけるこの Repository 作成者のブログに以下の文章がありました。

https://explained.ai/rf-importance/index.html

The most common mechanism to compute feature importances, and the one used in scikit-learn’s RandomForestClassifier and RandomForestRegressor, is the mean decrease in impurity (or gini importance) mechanism (check out the Stack Overflow conversation).

Scikit-learn では各説明変数の重要度は Gini importance という指標を用いて計算されていたんですね。

Gini importance とは簡単に言うと Gini 係数という小さいほど判別がよくできている値が各説明変数のおかげでどれくらい小さくなったかを求めている指標です。日本語だと例えば以下のサイトがわかりやすかったです。

せっかくなのでと Scikit-learn の module の中ものぞいてみました。 RandomForestClassifier はその中で DecisionTreeClassifier を用いています。 さらに DecisionTreeClassifier はその中で cython で書かれたコードを使っているようです。だから高速なんですかね。私は cython は読めないのですがおそらくここだろうと言う部分を見つけました。

差分をとって importance としているのがわかりますね。また、Gini importance を用いていることが DecisionTreeClassifier の Documentation にも書かれていました。

つまり Scikit-learn の Random Forest の説明変数の重みは「決定木を作成した後に説明変数をランダムに入れ替える。その後 OOB を予測し、入れ替え前と予測性能の差から求める」と言うのは私の勘違いで実際には Gini importance を用いていたのでした。

そこで Repository 作成者は Permutation importance を求める module を作成したと言うわけなんですね。ようやく理解することができました。大変勉強になりました。

rfpimp module についてあれこれ勉強したことについては今回は省略させていただきます。 Permutation importance を単純に計算するだけでなく複数の説明変数をまとめて Permutation importance を計算することもでき非常におもしろい module だと思います。先ほど紹介した作成者のブログではバイアスが出るケースの説明も書いてありましたし、 Jupyter Notebook で わかりやすい Example もあり大変助かりました。

最後に

Gini importance にももちろんいいところがあり、それは重みの計算が速いところが一つだと思います。 Permutation importance はその性質上、何度も予測モデル構築を行う必要があるので Gini importance よりも重みの計算に時間がかかり気安く何回も行うのは難しいと言えます。

一方、Permutation importance は Random Forest だけでなく他の機械学習手法でも、特に、SVM のような従来説明変数の重みが手に入らない手法にも適用することで説明変数の重みを求めることができる手法です。ぜひ使いこなしてみてください。

--

--