よっしーの私的空間

機械学習を中心に興味のあることについて更新します

SHAPを使用した回帰問題の機械学習モデルの局所解釈方法

shapライブラリを使用して、回帰問題を解いた機械学習モデルの大局的解釈を行う。

1.SHAPとは

SHAP(SHapley Additive exPlanations)は、機械学習モデルの局所的な解釈可能性を提供するためのフレームワークです。SHAPは、個々の特徴量が予測にどのように寄与しているかを計算することにより、モデルの解釈性を高めます。

2.データセット

今回はsklearnのdiabetes(糖尿病)データセットを例に実装してみる。データセットの概要は以下の通り。

  • 目的変数:1年後の糖尿病の進行に関する測定値
  • 説明変数:11個の特徴量
特徴量 説明
age 患者の年齢
sex 患者の性別
bmi 患者のBMI
bp 患者の平均血圧
S1 T-Cells (白血球の1種)の活性化に関与する化学物質
S2 インスリンのレセプターの活性に関与する化学物質
S3 グルコース代謝に関与する化学物質
S4 トリグリセリド (脂質の一種)の代謝に関与する化学物質
S5 血清アルブミン (タンパク質の一種)のレベル
S6 銅の輸送に関与する化学物質

※S1~S6: 血清の6つの化学指標。

3.実装

3.1.Lightgbmを用いた簡易的なモデルを作成

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
import lightgbm as lgb
import pandas as pd
import shap

# データのロード
diabetes = load_diabetes()
x_train, x_test, y_train, y_test = train_test_split(diabetes.data, diabetes.target, test_size=0.3)

# LightGBMモデルのトレーニング
model = lgb.LGBMRegressor().fit(x_train, y_train)

3.2.SHAPの実装

# SHAP値の計算
df_x_test = pd.DataFrame(x_test, columns=diabetes.feature_names)
explainer = shap.Explainer(model.predict, df_x_test)
shap_values = explainer(df_x_test)

# 特定のサンプルのSHAP値を表示(shap_values[x]:x番目のデータのSHAP値を表示、max_display=n:n個の特徴量を描画)
shap.plots.waterfall(shap_values[0], max_display=10)

上記の結果、以下のような図が表示されます。

E[f(x)]は、モデルの期待出力値(期待値)を表しています。つまり、全体的な平均予測値です。 SHAP値は、個々の特徴量がこの期待値からどれだけ上下に影響を与えたかを表します。