Shapley Values#

Note

Shapley 値はモデルの評価指標ではなく、特徴量ごとのモデルへの影響度を測るものである。

前章の Feature Importance のように、特徴量の予測したモデルへの寄与度を測る手段として SHAP value が存在する。

シャープレイ値(Shapley Value)とは?#

協力ゲーム理論で用いられる Shapley Value は、単独ではなく協力してゲームに参加することによる貢献を考慮した上で分配された報酬を意味する。

「各プレイヤーが新たにゲームに加わり、それによる貢献で賞金がいくら増えるか」を表す限界貢献度(marginal contribution)を用いて、Aさん、Bさん、Cさんの Shapley value(報酬)を出してみよう。

どの順番でAさんが協力に参加するかによって限界貢献度は異なるので、全ての順番における限界貢献度の期待値(平均値)をとり、それをシャープレイ値と呼ぶ。(計算方法は省略)結果、各個人のシャープレイ値は以下のようになる:

  • Aさん: 25万円(単独の場合30万円)

  • Bさん: 20万円(単独の場合18万円)

  • Cさん: 15万円(単独の場合12万円)

シャープレイの考え方に基づくと、BさんとCさんは、単独の力量で配分するよりも、他者と協力することでより多くの報酬をもらえることになる。

機械学習における SHAP 値#

機械学習の分野においては、このゲーム理論で活用されていたシャープレイ値を機械学習の分野に応用したオープンソースのライブラリである SHAP を利用していくことになる。

ひとつひとつの特徴量がモデル予測値に与える貢献度をシャープレイ値で表そうとしたものが SHAP 値と呼ばれるものであり、シャープレイ値の近似値となっている。純粋なシャープレイ値を求めるためには特徴量のすべての組み合わせを考慮した計算が発生するため、実質的には困難であるためだ。本 Notebook で出力される値は全て SHAP 値となっている。

SHAP 値の特徴#

あるサンプルのすべての SHAP 値の合計をとると、その予測値 f(x)、分類問題の場合は予測確率)に一致する。

つまり SHAP 値は、Feature Importance のような係数の値ではなく、予測値と同じ単位を持つ具体的な数値となっている。以下の図はあるサンプルに対して、予測値に対して各特徴量の値が SHAP の意味でどれだけ貢献したのかを表現している。

3

customerid

0927-CNGRH

gender

Male

seniorcitizen

0

partner

No

dependents

Yes

tenure

1

phoneservice

Yes

multiplelines

No

internetservice

No

onlinesecurity

No internet service

onlinebackup

No internet service

deviceprotection

No internet service

techsupport

No internet service

streamingtv

No internet service

streamingmovies

No internet service

contract

Month-to-month

paperlessbilling

No

paymentmethod

Mailed check

monthlycharges

19.55

totalcharges

19.55

2値分類において、あるサンプル3における各特徴量の値のテーブル。このサンプルに対する予測確率 f(x)=0.25 となっている。(これはこのサンプルが No に分類されたことを意味している。)

_images/3-8-24-1.png

Fig. 43 サンプル3における force_plot。数直線上にはこのサンプルの予測値 f(x)=0.25 と、base value と呼ばれる全サンプルの予測値の平均値が表示されている。base value から、プラスの意味で寄与している赤の特徴量: tenure と、マイナスの意味で寄与している複数の青の特徴量が押し合いへし合いした結果、f(x) の値になったことを意味している。それぞれの特徴量の大きさは、数直線から把握することができている。#

_images/3-8-25-1.png

Fig. 44 SHAP 値の waterfall_plot は、特徴量ごとの SHAP 値が f(x) にどれくらい寄与しているかをより明確に表現している。予測値の平均値である E[f(x)] からスタートし、下方から特徴量ごとの SHAP 値を重ねていき、最終的に予測値の f(x) に辿り着く様子がみて取れる。こここからわかることは、tenure=1 という特徴量の値は、予測確率を 0.22 (22%) 上げる方向に寄与し、internetservice = No という特徴量の値が、予測確率を 0.08 (8%) 下げる方向に寄与していることである。#

SHAP 値の概要を理解したところで、本 Notebook から出力される SHAP 関連の表現をみていこう。どの表現も、サンプルごとの SHAP 値を様々な角度で重ね合わせ、特徴量の寄与を確認することを目的としており、得られる情報はほぼ同じである。扱いやすいものを選んで活用していくことになる。

force_plot#

前述の force_plot を30ほどの複数サンプルに対して適用すると、1つ1つのサンプルの force_plot を左に90度回転して並べたグラフとして表現される。インタラクティブなグラフになっていて、X軸はサンプル番号、Y軸はセレクトボックスから選んだ指標となるが、主に f(x) と各特徴量の SHAP 値となる。X軸情報のセレクトボックスにてサンプルの並び替えの順番を指定することができる。

_images/3-8-24-1.png

Fig. 45 サンプルごとのこの force_plot を左に90度回転して並べたものが以下の表現になる。#

_images/3-8-26-1.png

Fig. 46 X軸のサンプルの並び順を sample order by output value(予測値の大きい順)とし、Y軸に予測値 f(x) を設定した force_plot。12番目のサンプルにフォーカスして、特徴量の値を確認している。SHAP値を押し上げる赤の特徴量値のレイヤー層と、押し下げる青の特徴量値のレイヤー層の綱引きによって f(x) が決まっていることが確認できる。#

_images/3-8-27-1.png

Fig. 47 X軸のサンプルの並び順を tenure(tenure 値の小さい順)とし、Y軸に tenure effect(SHAP 値)を設定した force_plot。赤色の範囲では、 tenure の値が小さければ小さいほど f(x) をプラスの方向に寄与し、あるところ(青色の範囲)からは大きくなるにつれてマイナスの方向に寄与していることがわかる。#

summary_plot#

Note

2値分類、多値分類の場合にだけ表示することができる。

特徴量ごとに、すべてのサンプルの SHAP 値の絶対値の平均をとり、大きい順に並べたグラフ。予測したそれぞれのラベルごとに色分け(2値なら Yes/No の2色、多値分類ならラベル数だけ色分けされる)されている。

_images/3-8-28-1.png

Fig. 48 SHAP 値の平均を大きい順に並べたグラフ。Feature Importance と同じく、モデルの予測に強いインパクトを与えている特徴量を把握することができる。#

decision_plot#

decision_plot は、サンプルごとの waterfall plot を重ねたイメージに近いものになっている。

_images/3-8-29-1.png

Fig. 49 SHAP 値のインパクトの低い特徴量から、予測の平均値(0.314)をスタートにサンプルごとに SHAP 値を足し上げていって、最終的に情報のX軸の予測値になることを線で示している。各サンプルの線は予測値の値によって色分けされており、予測値が大きいほど赤い線に、低いほど青い線で表現されている。#

heatmap#

30ほどのサンプルをX軸に並べ、各特徴量の SHAP 値をヒートマップ(プラスの寄与なら赤、マイナスの寄与なら青、寄与が大きいほど濃い色となる)で表現したものである。X軸上方から、そのサンプルの予測値をみることができる。

_images/3-8-30-1.png

Fig. 50 heatmap#

beeswarm#

ドットがサンプルで、X軸が SHAP 値を表しており、色が特徴量の値の大小(濃い赤ほど値が大きく、濃い青ほど値が小さい、灰色は数値型ではない特徴量を意味する)を表していることになる。

_images/3-8-31-1.png

Fig. 51 beeswarm からは、例えば tenure は値が小さいほどプラスの SHAP 値を取る(青いドットをに着目)ことがわかり、monthlycharges は、値が小さいほど マイナスの SHAP 値を取る(青いドットに着目)ことがわかる。このように、すべての特徴量を通じてその値の大小が SHAP 値にどの方向にどれくらい影響を与えているのかを読み解くことができる。#

Row-level inspection#

トレーニングデータから 10 のサンプルを抽出し、それぞれ対して force_plot と waterfall_plot を出力したものとなっている。