Azure Machine Learning Serviceで行う予測モデルの解釈【LIME】

こんにちは。R&D Divisionの山本です。

本記事は予測モデル解釈の第四回目になります。これまでの記事は下記のリンクからどうぞ。

  • 第一回:予測モデル解釈とはなんぞやを解説した記事はこちら
  • 第二回:Azure Machine Learningの機能を利用して、予測モデルの作成、モデル解釈を行った記事はこちら
  • 第三回:線形回帰と決定木アルゴリズムを利用して、予測モデルの作成、モデル解釈を行った記事はこちら

今回は高度なアルゴリズムを使ってモデルを作成し、LIMEというものを利用してモデル解釈を行います。

LIMEによるモデル解釈

ローカルなモデル解釈方法にLIME(Local Interpretable Model-agnostic Explainations)と呼ばれる手法があります。

これは、人間による解釈の困難なアルゴリズムで予測モデルを作成した際に有効な方法です。

解釈の方法としては、以下のことを行っています。

  1. 高度なアルゴリズムを利用して予測モデル(A)を作成
  2. 予測モデル(A)に、1つのデータを入力し予測結果(A)を得る
  3. 予測結果(A)に近似する予測結果(B)を出力する予測モデル(B)を単純なアルゴリズムで作成
  4. 予測モデル(B)を解釈することで予測モデル(A)を解釈したこととする

1つの予測結果だけと近似するように単純なアルゴリズムで予測モデルを作成することで、解釈の誤差を少なくしているんですね。

実際にLIMEでの解釈を見ていきましょう 。

今回もPythonで行っていくので、まずはノートブックの管理画面まで移動し、 新しいファイルの作成アイコンをクリックします。 ノートブック管理画面への移動やコンピューティングの設定方法がわからない場合は、第三回の記事を参考にしてください。

ファイル名をLIME_WhiteWineQuality.ipynb、ファイルの種類をPython Notebookにし、作成をクリックします。

をクリックし、編集をクリック、Jupyterで編集をクリックします。

Jupyterの画面に移動しました。 引き続き、コードを書いていきます。

  1. Workspace.from_config()でAzure Machine Learning Service上の情報と接続
  2. 接続情報を元に、Dataset.get_by_nameで前回データセットに登録した白ワインのデータを取得
  3. 取得した白ワインのデータをを扱いやすいように変換
  4. Xにワインデータのquality以外の情報を格納(学習データ)
  5. Yに ワインデータのqualityの情報を格納(予測対象データ)
from azureml.core import Workspace, Dataset

ws = Workspace.from_config()
dataset = Dataset.get_by_name(ws, name='White Wine Quality Data')
df = dataset.to_pandas_dataframe()

X = df.drop("quality", axis=1).values
Y = df['quality'].values
  1. 白ワインデータを学習用と評価用に分割
from sklearn.model_selection import train_test_split
train_data, test_data, train_labels, test_labels = train_test_split(X, Y, test_size=0.1)
  1. Random Forest RegressorのアルゴリズムをRfrに格納
  2. Random Forest Regressorでqualityを予測するモデルの作成
from sklearn.ensemble import RandomForestRegressor
Rfr = RandomForestRegressor(n_estimators = 100)
Rfr.fit(train_data, train_labels)
  1. モデル解釈で利用するLIMEをインストール
pip install lime
  1. LIMEの初期設定
import lime
import lime.lime_tabular
explainer = lime.lime_tabular.LimeTabularExplainer(train_data,
                                                   feature_names = df.drop("quality", axis=1).columns,
                                                   class_names = ["3","4","5","6","7","8","9"],
                                                   discretize_continuous=True,
                                                   mode='regression')
  1. LIMEでtest_data[1]をローカル解釈
  2. 解釈結果を表示
exp = explainer.explain_instance(test_data[1], Rfr.predict, num_features=5)
exp.show_in_notebook(show_table=True, show_all=False)

+をクリックすると、空のセルを追加することができるので、上記したコードを1セルに1つづつJupyterに貼り付けます。

上から順にすべてのセルが実行完了になるまでRunします。

最後のほうに青とオレンジでグラフィカルな情報が出ています。これがLIMEによる解釈の内容です。

左の内容は、 test_data[1] の予測結果です。
真ん中の内容は、どの特徴が結果に寄与しているかを表しています。
右の内容は、 test_data[1] の実際の値です。

今回の場合はアルコール度数が11.40を超えていたことが、この予測値になった大きな理由のようです。

真ん中の情報で見切れているものについてはexp.as_list()で確認することができます。

これでLIMEによるモデル解釈は完了です。次回はSHAPによるモデル解釈を行います。

%d人のブロガーが「いいね」をつけました。