MicrosoftのInterpretMLが便利だった

本記事では、Microsoftが開発しているInterpretMLを紹介をします。

目次

InterpretMLとは

InterpretMLとは、機械学習の解釈を説明可能とするためのpythonライブラリです。(英語だと machine learning inter-pretability algorithms )
最先端の機械学習アルゴリズム(ニューラルネットやGBDTなど)は精度が高い一方で、実際に中でどのようにデータを解釈し結果を出しているかがブラックボックス化されてしまっています。
実際、仕事でも機械学習アルゴリズムがデータをどのように解釈して結果を出しているか説明を求められる場合などもありますし、精度が高くても中身を説明できないものは使わないという現場もあるようです。
一方で線形モデルのように、アルゴリズムがどのようにデータを解釈し結果を出しているのかがわかるものをグラスボックス(Glassbox)と言います。
そして、InterpretMLはこのグラスボックス化されたアルゴリズムをパッケージ化してアルゴリズムの解釈を様々な図として表現できるようにしたライブラリです。
しかし、グラスボックス化されたアルゴリズムは最先端の機械学習アルゴリズムと比較して精度が低い場合が多いです。
InterpretMLではこの「グラスボックス化されたアルゴリズムの精度が低い」というデメリットを解消した、Explainable Boosting Machine(EBM とよばれる新しいモデルを含んでいます。

GitHubf:id:zakopilo:20200919160817p:plain:w15

github.com
※まだ、α版

Explainable Boosting Machine(EBM

EBMは、上記にも記載をしたように「グラスボックス」かつ「高精度」を実現した機械学習アルゴリズムです。
この資料にもあるように、実際にLightGBMと同等もしくはそれ以上の精度がでるようです。
f:id:zakopilo:20200919162244p:plain

精度と解釈で見ると以下のようにまとめることができます。

GBDT NN LR EBM
精度
解釈

これは、実際に使ってみて試したくなりますね。

実際に使ってみる

参考資料
Model Interpretation with Microsoft’s Interpret ML | by Mayur Sand | Analytics Vidhya | Medium

利用データ
Titanic: Machine Learning from Disaster | Kaggle

コード
GitHub - zakopuro/example_interpret

インストール

interpretMLは以下のようにpipで簡単にinstallできます。

pip install interpret

データを確認する

interpretMLでは簡易にデータを確認できます。(現在は欠損値に対応してないので注意)

from interpret import show
from interpret.data import ClassHistogram,Marginal
from interpret.glassbox import ExplainableBoostingClassifier
from sklearn.model_selection import train_test_split
from interpret.perf import ROC
import pandas as pd

data = pd.read_csv("data/train.csv")
# 欠損値をサポートしてないようなので削除する
X = data.drop(['Survived','Cabin','Embarked','Age'],axis=1)
y = data['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

hist = ClassHistogram().explain_data(X_train, y_train, name = 'Train Data')
show(hist)

上記をjupyter notebook上で実行すると以下のようなグラフが表示されます。
これは、ターゲットとなるデータのヒストグラムです。
f:id:zakopilo:20200919172433p:plain:w700

図のSummaryと書かれている部分を選択すると以下のように各カラムを選択することができ、それぞれのデータを簡易に確認することができます。(便利)
f:id:zakopilo:20200919172634p:plain:w700 f:id:zakopilo:20200919172902p:plain:w700

学習

EBMで学習してみます。ラベルエンコーダーなどの必要もないらしい。簡単。
(※Lightgbmなどと比較すると結構学習時間がかかるかも・・)

ebm = ExplainableBoostingClassifier(random_state=42)
ebm.fit(X_train, y_train)

モデルの解釈の可視化

EBMの特徴である、モデルのデータの解釈を可視化も非常に簡単にできます。

ebm_global = ebm.explain_global(name='EBM')
show(ebm_global)

SummaryではLightgbmなどでもおなじみの特徴量重要度(Feature importance)を確認できます。
f:id:zakopilo:20200919173718p:plain:w700

他にも、特徴毎にその特徴量のどんな値が学習に影響を与えたかも可視化することができます。
例えば、下図はFare(運賃)の特徴量の解釈図ですが、おおよそ510以上になっているFareが特徴量として大きな影響を与えていることがわかります。
f:id:zakopilo:20200919174746p:plain:w700

また、testデータに対しての解釈も以下のように確認できます。

ebm_local = ebm.explain_local(X_test, y_test, name='EBM')
show(ebm_local)

すべての予測データに対してどの特徴量がプラスに働いて、どの特徴量がマイナスに働いたかを可視化することができます。
例えば、以下の図では71行目のデータはSexやPclassは結果にプラスに働いたが、Ticketなどはマイナスに働いたことがわかります。
f:id:zakopilo:20200919175403p:plain:w700

ROC曲線も簡単に可視化できます。

ebm_perf = ROC(ebm.predict_proba).explain_perf(X_test, y_test, name="EBM")
show(ebm_perf)

f:id:zakopilo:20200919175939p:plain:w700

まとめ

今回は、InterpretMLを紹介しました。
機械学習アルゴリズムの解釈という点では非常に使いやすくわかりやすい印象です。
しかし、まだα版ということもありドキュメントが充実していなかったり、学習時間が長かったりと改善してほしい点(自分でプルリクしろ)はいくつかありました。
ただ、そこが改善されればLightgbmやxgboostなどにおきかわるライブラリになる可能性もあると思いました。