機械学習モデルを説明するための手法として有名なSHAP(SHapley Additive exPlanations)。
Pythonのライブラリを使えば簡単に計算できるし、図の見方も慣れてきました。
一方で、「どのように計算しているのか」という理論的な部分は煩雑そうで、ないがしろにしてきてしまいました。
ただ、これを理解しないまま使っていると、どこかで誤った解釈をしそうなので、今回は気合を入れて学んでみましたので記録を残します。
言い回しなどが難しく、不正確な部分や説明不足があるかと思いますので、見つけたらコメントいただけると幸いです。
以下のサイトを参考にしています。
※Pythonコードは出てきません
最終目標の確認
まず「最終的に何を理解すれば良いのか」を見ておきます。
\phi_i = \sum_{\boldsymbol{S} \subseteq \boldsymbol{F} \setminus \{x_i\}} \frac{|\boldsymbol{S}|!(|\boldsymbol{F}|-|\boldsymbol{S}|-1)!}{|\boldsymbol{F}|!} \left[f_{\boldsymbol{S} \cup \{x_i\}}(\boldsymbol{x}_{\boldsymbol{S} \cup \{x_i\}}) - f_\boldsymbol{S}(\boldsymbol{x}_\boldsymbol{S})\right]
なんだか色々な文字が出てきて複雑です。
以下に文字の定義と意味を書き出しておきます。
- $\phi_i$ : 特徴量$i$に対するSHAP値
- $\boldsymbol{S}$: 特徴量$i$を除いた特徴量の組み合わせの集合
- $\boldsymbol{F}$: 特徴量の集合
- $f$: 学習済み予測モデル
- $\boldsymbol{x}$: 特徴量ベクトル
この記事でのルールは、太小文字はベクトル量、太大文字は集合、小文字はスカラーとします。
この式を一言で言うと
「特徴量ベクトル(行)から予測値を求める際の特徴量$x_i$の貢献度(SHAP値)は、特徴量$x_i$を除いた特徴量の組み合わせの集合$\boldsymbol{S}$に特徴量$x_i$を加えたときの予測の期待値から、特徴量$x_i$を加えてない場合の予測の期待値を差し引き、それに適切な重みをつけたものを、集合$\boldsymbol{S}$について足し合わせる」
になります。
意味がわかりませんね。
下記で一つ一つ丁寧に紐解きます。
要素の説明
前提(あればイメージしやすいかも)
すでにSHAPをお使いの方であればイメージがあるかもしれませんが、SHAP値は特徴量ベクトル(1行)を使って、特徴量ごとに算出します。
なので、テーブルのイメージは要らず、箱が横に連なっている行のイメージさえ持っていれば良いです。
特徴量iを除いた特徴量の組み合わせの集合とは
一番意味わからんポイントだと思います。
例を使いながら説明します。
今、4つの特徴量があるとします。
$$\boldsymbol{x} = \{ x_1,x_2,x_3,x_4\}$$
一つの特徴量ベクトルなので、$x_i$には具体的な値が入ります。
$$\boldsymbol{x} = \{ 12.0,メロン,猫,1\}$$
ここで、特徴量4のSHAP値($\phi_4$)を求めたいとします。
集合$\boldsymbol{S}$は、特徴量4を除いた、"特徴量の組み合わせ"の集合なので全て書き出すと以下の8パターンになります。
全特徴量がないパターン:$\{\}$
一つだけ特徴量が入るパターン:$\{x_1\},\{x_2\},\{x_3\}$
二つの特徴量が入るパターン:$\{x_1, x_2\},\{x_2, x_3\},\{x_3, x_1\}$
三つの特徴が入るパターン:$\{ x_1,x_2,x_3\}$
これが、$\boldsymbol{x}_\boldsymbol{S}$に具体的に入ってきます。
ちなみにこの場合、集合$\boldsymbol{F}$は以下のようになります。
$$\boldsymbol{F} = \{ x_1,x_2,x_3\}$$
特徴量iを加えてない場合の予測の期待値とは
冒頭の最終目標式で言うところの
$$f_\boldsymbol{S}(\boldsymbol{x}_\boldsymbol{S})$$
です。
より正確な言い方をすると「特徴量$i$にランダムな値を入れたときの予測期待値」です。
「加えていない」とは、実際に値がない(欠損)のではなく正確な値じゃないよ、と言う意味です。
上記の集合$\boldsymbol{S}$を例にとると、
$$f(\{\}), f(\{x_3\}), f(\{ x_1,x_2,x_3\}), etc.$$
を計算します。
例えば、$f(\{x_3\})$を計算する(予測を求める)ことを考えます。
$x_3$の値は具体的に決まっているので問題ありませんが、$x_1$や$x_2$,$x_4$の値は不明です。
これでは正常に予測を実行できません。
そこで、学習用データから"適切に"サンプリングを行います。"適切に"というのは、いろいろルールや手法があるようなのでいれました。
このサンプリング1回につき1つの予測値が求まります。
これを複数回繰り返した後、これらの予測値の期待値(平均)を算出します。
この値が$f(\{x_3\})$です。
特徴量iを加えたときの予測の期待値とは
冒頭の最終目標式で言うところの
$$f_{\boldsymbol{S} \cup \{x_i\}}(\boldsymbol{x}_{\boldsymbol{S} \cup \{x_i\}})$$
です。
なにやら難しそうな添字があります。
$\boldsymbol{S} \cup \{x_i\}$は「集合$\boldsymbol{S}$に$x_i$を加える」くらいに思っておけば大丈夫です。
$x_i$に$\{\}$をつけているのは、"集合"にするためです。
具体的には上記と同じように期待値を計算します。
今回の場合、$x_1$と$x_2$をサンプリングして予測します。
$$f_{\{x_3\} \cup \{x_4\}}(\boldsymbol{x}_{\{x_3\} \cup \{x_i\}})$$
予測の期待値の差し引きとは
冒頭の最終目標式で言うところの
$$f_{\boldsymbol{S} \cup \{x_i\}}(\boldsymbol{x}{\boldsymbol{S} \cup \{x_i\}}) - f\boldsymbol{S}(\boldsymbol{x}_\boldsymbol{S})$$です。
上2つの引き算ですね。
これがいわゆる「効果」です。
これは「特徴量$i$以外の条件は同じにして、特徴量$i$がしっかりやったものと出鱈目にやったものでどのくらい変わるんだろうか?」を数値化したものです。
ゲーム理論っぽいですね。
適切な重み
※ この部分は筆者も理解できていない部分が多いです。
冒頭の最終目標式で言うところの
$$\frac{|\boldsymbol{S}|!(|\boldsymbol{F}|-|\boldsymbol{S}|-1)!}{|\boldsymbol{F}|!} $$
です。
まず、集合に対する絶対値は特徴量数を表します。
今回の例で行くと$|\boldsymbol{F}|=4$です。
$|\boldsymbol{S}|$は組み合わせパターン次第で変わってきます。
この重みは「どの順番で特徴量$x_i$が追加されたかについて、公平性を保つため」につけられます。
ややこしいのが、「計算上必要な手続きではなく、ゲーム理論の考え方(公理)を満たすようにつけられている」という点です。
例えば、Aさん、Bさん、Cさんのチームで順番にゲームを行ったときの貢献度を計算したいとします。
上記の考え方に基づいて、$\boldsymbol{S}=\{A,B\}$としたとき、$\{C\}$を加えることを考えます。
ここで、Cさんはどの順番でゲームをしたかで貢献度が変わるかもしれません。
つまり、A→B→Cだったのか、C→A→Bだったのかです。
こういった"順序"が変わったパターンがあっても公平にCさんの貢献度を計算したいのが自然です。
これを考慮した重みをつけた上で、足し合せることにします。
$\boldsymbol{S}$の並べ方:$|\boldsymbol{S}|!$
残りの並べ方:$(|\boldsymbol{F}|-|\boldsymbol{S}|-1)!$
全体の並べ方:$|\boldsymbol{F}|!$
よって、ちょうど集合$\boldsymbol{S}$の直後に$x_i$を追加する確率は上記のようになります。
まとめ
今回は機械学習モデルの説明でよくみるSHAPの理論的な部分を学んでみました。
まだまだ理解が及んでいない部分が多々ある感覚ですが、数式を分解しながら紐解くことで大きな部分は掴めました。
実務上こちらの数式を意識することはありませんが、誤った説明や運用をしないように気をつけたいです。
自分と同じようによくわかってないわという方のお力になれていれば幸いです。