hirohirohirohirosのブログ

地方国立大学に通う情報系学部4年

機械学習を解釈する技術 6章 まとめ

SHAPを使うモチベーション

 PFIはモデルがどの特徴量を重視しているかを見ることが出来る.PDやICEは特徴量と予測値の関係を見ることが出来る.

 これに対し,SHAPはモデルがなぜこのような予測値を出したかという理由付けを見ることが出来る.

 人物の特徴からローンの返済確率を求める機械学習モデルを考える.PFIは例えば収入を重視しており性別は重視していないということを見ることが出来る.PDは例えば収入を0から1億まで変化させたとき返済確率がどう推移するのかを見ることが出来る.ICEはこれを個々のデータごとに見ることが出来る.

 これに対し,SHAPはなぜこの返済確率を出力したかを見ることが出来る.具体的にこの特徴量がこれだけ確率upに貢献し,この特徴量がこれだけ確率downに貢献したという情報を見ることが出来る.

 返済確率が低いためローン審査に落とすことを決めたとき,どこを見て審査に落とすと決めたのかを説明することは重要である.この説明性にSHAPは大きく貢献する.

SHAPのアイデア

数式表現

 SHAPはICEと同じく一つ一つのデータの予測値に対して説明性を与える.

 SHAPはあるデータに対する予測値と平均的な予測値との差を特徴量ごとに分解するというアイデアで説明性を与える.

 i番目のデータの特徴量 x_{i,j}の貢献度を \phi_{i, j}とすると,貢献度は

\begin{align}
\widehat f(\boldsymbol{x}_i) - E[\widehat f(\boldsymbol{X})] = \sum_{j=1}^J \phi_{i, j}
\end{align}

で定義される. \phi_0 = E[\widehat f(\boldsymbol{X})]と置くと,

\begin{align}
\widehat f(\boldsymbol{x}_i) = \phi_0 \sum_{j=1}^J \phi_{i, j}
\end{align}

となる.こうすると,あるデータの予測値は,平均的な予測値と各特徴量の貢献度の和に分解して表現されることが分かる.この貢献度を使うのがSHAPである.

イメージ例

 この貢献度のイメージをローンの返済確率予測モデルで考える.0番目の特徴量を年収,1番目の特徴を住所,2番目の特徴量を年齢,3番目の特徴量を性別とする.

 さらに,返済確率の平均は70%とする.ある個人(0番目のデータ)の返済確率が85%だとする.この場合,差分15%を特徴量ごとの貢献度に分解する事がSHAPのアイデアであった.

 この例を上の貢献度の定義に当てはめると

\begin{align}
\widehat f(\boldsymbol{x}_i) &= \phi_0 + \phi_{0, 0} + \phi_{0, 1} + \phi_{0, 2} + \phi_{0, 3} \\
&= \phi_0 + \phi_{0, 年収} + \phi_{0, 住所} + \phi_{0, 年齢} + \phi_{0, 性別}
\end{align}

となる.

 そして,この人の予測では,年収が2000万であることで確率+10%,住所が東京であることで確率+10%,年齢が32歳である事で確率-5%,性別が女性である事で確率±0%となっていたとする.すると,

\begin{align}
\widehat f(\boldsymbol{x}_i) &= 70 + 10 + 10 + -5 + 0 = 85
\end{align}

となる.(この例では出力が確率であるため単純に加算できないと思われるがあくまで例としてである.)

 こうすれば,モデルがなぜそのような予測値を出したかという説明が出来る事が分かる.問題は,この貢献度をどうやって分解し,求めるかである.

Shapley値

 特徴量iの貢献度を求める関数をv(i)とする.ここで限界貢献度という概念を導入する.特徴量iが無かったときと比べ,特徴量iが追加されたときの貢献度の増分を限界貢献度と定義する.そして,平均的な限界貢献度のことをShapley値と呼ぶ.

 特徴量jのShapley値 \phi_jは,

\begin{align}
\phi_j = \frac{1}{|J|} \sum_{S\subseteq J:\{j\}} (|S|!(|J|-|S|-1))! (v(S\cup \{j\}) - v(S))
\end{align}

となる.Jは特徴量の集合を差す.|J|は集合の要素数を表す.よって|J|!はJの組み合わせの総数となり,これを割ってるので平均を求めてることが分かる.

  S\subseteq J:\{j\}は集合Jからjを除いた集合から作られる,空集合を含めた全ての組み合わせがSであること指す.例えばJ={0,1,2}ならS=∅, {0}, {1}, {2}, {0,1}, {1,2}, {2,0},{0,1,2}となる.

 よって (|S|!(|J|-|S|-1))!はSの組み合わせの出現回数, v(S\cup \{j\}) - v(S)はjの限界貢献度を表す.

 このことからShapley値はjの限界貢献度を全ての組み合わせで計算し,その平均をッっていることが分かる.この内容は本書のアルバイトの例を参照すると分かりやすい.

SHAP

 SHAPはShapley値のコンセプトを機械学習に応用した手法である.

 例として特徴量が二つの場合の限界貢献度やShapley値を求める.データiがそれぞれ (x_{i, 1}, x_{i, 2})という値を持っていると考える.

 まず,二つとも特徴量の値が分かっているときの予測値は

\begin{align}
v(\{1, 2\}) = \widehat f( (x_{i, 1}, x_{i, 2}))
\end{align}

で求まる.次に,全ての特徴量が分かってない場合,予測値は予測値の期待値とする.
\begin{align}
v(\emptyset ) = E[\widehat f(X_1, X_2)]
\end{align}

となる.そして,1番目の特徴量のみ分かった場合,周辺化を使う.

\begin{align}
v(\{1\}) = E[\widehat f(x_{i, 1}, X_2)] = \frac{1}{N}\sum_{i^{'}=1}^N\widehat f(x_{i, 1}, x_{i^{'}, 2})
\end{align}

n番目の特徴量のみ分かった場合も同様である.

 特徴量が分かる順番を考える.分かる順番が異なるだけで予測値の変化の仕方も変わる.そのため,Sで組み合わせを考えているのである.

 何も分からない状態から,1番目の特徴量が分かり,その後2番目の特徴量が分かった場合を考える.何も分からない状態から1番目の特徴量が分かったとき,その差分は
\begin{align}
E[\widehat (x_{i, 1}, X_2) - E[\widehat f(X_1, X_2)]]
\end{align}

である.そして,2番目の特徴量が分かったときの差分は

\begin{align}
\widehat f(x_{i, 1}, x_{i, 2}) - E[\widehat f(x_{i, 1}, X_2)]
\end{align}

となる.

 これが2番目の特徴量が分かり,その後1番目の特徴量が分かった場合は,同じ式にはならない事に気をつける.

 この二つの平均を取れば

\begin{align}
\phi_{i, 1} = \frac{1}{2}( (E[\widehat f(x_{i, 1}, X_2)] - E[\widehat f(X_1, X_2)]) +\\ (\widehat f(x_{i, 1}, x_{i, 2}) - E[\widehat f(x_{i, 1}, X_2)])) \\
\phi_{i, 2} = \frac{1}{2}( (\widehat f(x_{i, 1}, x_{i, 2}) - E[\widehat f(x_{i, 1}, X_2)]) + \\ (E[\widehat f(X_1, x_{i, 2}) - E[\widehat f(X_1, X_2)]]))
\end{align}

となる.SHAP値 \phi_{i,j}はデータiの予測値に対して特徴量jが与える平均的な影響を表す.

 SHAPの計算は線形性の仮定を置いてないので,SHAPはXgboostやNNなど任意のブラックボックスモデルに適用できる.

実データでの分析

 pythonでSHAP値を計算するにはshapパッケージを使う.

shap.readthedocs.io

 データはshapパッケージにあるbostonの住宅価格データセットを使う.本書ではRandom Forestを使っていたが,今回はXgboostを使ってみる.

 ボストンのデータセット

このような形になっている.これをXgboostで学習させ,SHAP値を計算する.

最後のshap.plots.waterfall()でグラフがプロットされる.