Re:ゼロから始めるML生活

どちらかといえばエミリア派です

SHAPを使ってみた

先日こちらの記事を見かけました。

towardsdatascience.com

機械学習モデルの解釈についてあまり勉強したことがなく、いい機会だったので上記の記事を参考に勉強してみたので、今回はそのメモです。

SHAP is なに

SHAP「シャプ」はSHapley Additive exPlanationsの略称で、モデルの予測結果に対する各変数(特徴量)の寄与を求めるための手法です。SHAPは日本語だと「シャプ」のような発音のようです。ある特徴変数の値の増減が与える影響を可視化することができます。 機械学習モデルを解釈するSHAP – S-Analysis

最近ではXAI(Explainable AI, 説明可能AI)なるものが注目されることが増えてきており、そのためにSHAP(SHapley Additive exPlanations)値が使われることがあります。 予測結果に対して説明変数の寄与度は具体的には下記のように算出されるようです。*1

 \displaystyle{ \phi_{j}(val) = \sum_{S \subseteq \{x_{1}, ..., x_{p}\} \backslash \{x_{j}\}} \frac{|S|!(p-|S| -1)!}{p!} (val (S \cup \{x_{j}\}) - val(S))}

数式の解釈としてはこんな感じになっているようです。(若干式は異なっています)

細かい話を抜きにすれば、特徴量が予測に対してどれだけ寄与したかが確認できるので、XAIの文脈で有効そうということがわかります。

まずは使ってみる

ざっくり定義がわかったところで、実際に使ってみます。

ボストンの住宅価格を予測するチュートリアルをそのままやってみます。

github.com

f:id:nogawanogawa:20210719115733p:plain

f:id:nogawanogawa:20210719115724p:plain

それぞれの特徴量が予測に対してどのように寄与しているかを知ることができます。

この他にも様々な角度から予測値に対する特徴量の寄与を調べることが可能になっており、細かく見ていく場合にも有用そうです。

冒頭で紹介した"落とし穴"にハマってみる

さて、前置きが長くなりましたが、本題の”落とし穴”ってやつにハマってみたいと思います。 一応コードも公開されてるんですが、私の手元の環境でうまいこと動いてくれなかったので、一部改変しています。

題材は、契約更新型の商品を顧客が更新するかどうかを予測することを考えます。

裏の前提

今回、仮に顧客に関する契約更新を含む各特徴量への寄与が下記のような形で分かっているとします。

f:id:nogawanogawa:20210719121813p:plain

まず正直にやってみる

上の使い方に習って寄与する度合いを可視化してみるとこんな感じになっています。

f:id:nogawanogawa:20210719123819p:plain

読み方としては、割引(Discount)が最も契約更新に対して影響が強く、次いで広告費(Ad spend)、バグ報告件数(Bug Reported)という事になっています。 これだけだと、正の相関なのか負の相関なのかがわからないので、散布図で確認するとこんな感じです。

f:id:nogawanogawa:20210719124233p:plainf:id:nogawanogawa:20210719124229p:plainf:id:nogawanogawa:20210719124226p:plain

ただ、これちょっと不思議な結果になっています。 上のデータをそのまま信用すると、割引をすればするほど解約率が落ち、バグレポートが増えるほど解約率が上がる、といった解釈になってしまい、最悪の場合解約率を上げるためにバグを埋め込ませることが有効という判断になりかねません。

単純に予測タスクなのであればどの説明変数が寄与しているかを考えるだけで良いので、この結果で問題ありません。 ただし、この場合、この結果を元に次の施策を検討するのであれば、より深く結果の解釈について考えるべきと思われます。

じゃあどう見るべきか

さて、今回のケースでは上で示したように、目的変数と説明変数の関係がすべて分かっていました。 つまり、この解釈が正しいかどうかについて確認することができます。

実際の真の因果関係とSHAP値を重ねたものは下記のようになっています。(実線が実際の因果関係)

f:id:nogawanogawa:20210719150509p:plain f:id:nogawanogawa:20210719150506p:plain f:id:nogawanogawa:20210719150502p:plain

実際には、割引したほうが更新は起こりやすく、広告費やバグレポートについては直接関係はないということがわかります。 ここから分かる通り、相関関係ではなく、因果関係を理解することが非常に重要になってきます。

実際にはこの目的変数と説明変数の関係は、明確に手に入るものではなく、ドメイン固有の知見に基づいて本当に相関があるのか、はたまた見せかけの相関であるのか、などを判断していく必要がありそうですね。

因果関係を見つけるのに役立つかもしれないもの

さて、ここまでだけだと「結局ドメイン知識最強」って話になってしまいます。 実際、最終的にはそこに行き着きはするんですが、一応手がかりはあるようです。

まず1つには、データの冗長構造をデンドログラムで確認することができます。

f:id:nogawanogawa:20210719184211p:plain

これにより、複数の説明変数が組み合わさって影響しているかを判断できるそうです。(画像では見にくいですが、経済状況は直接契約更新に影響し、広告費は様々な要素と交錯因子になっている、などが確認できます。)

こうした交錯因子の疑いがあるものについては、実際の因果関係を調べるためにeconMLやCausalMLなどを使用するのが便利だとしています。 その他、ある特徴量が別の特徴量に対して因果関係を持っている場合や、実際には存在するが観測されていない変数の存在(今回の場合だとProduct needsが該当)にも注意が必要のようです。

実際、この記事の最後にも下記のように書いてあります。(DeepLによる翻訳)

XGBoostやLightGBMのような柔軟な予測モデルは、予測問題を解決するための強力なツールです。しかし、これらは本質的に因果関係のあるモデルではないため、SHAPで解釈すると、多くの一般的な状況で因果関係のある質問に正確に答えることができません。モデルの特徴が実験的な変動の結果である場合を除き、交絡を考慮せずに予測モデルにSHAPを適用することは、一般的に、政策に反映させるための因果関係の影響を測定するための適切なツールではありません。SHAPやその他の解釈可能性ツールは因果推論に有用であり、SHAPは多くの因果推論パッケージに統合されているが、それらのユースケースは本質的に明確な因果関係にある。そのため、予測問題のために収集するのと同じデータを使用し、特に因果効果を返すように設計されたdouble MLのような因果推論手法を使用することは、政策に情報を提供するための良いアプローチであることが多い。他の状況では、実験や他の無作為化のソースだけが、もしもの質問に答えることができます。因果推論は常に重要な仮定を必要とします。この記事の要点は、通常の予測モデルを因果関係があると解釈する際の仮定は、しばしば非現実的であるということです。 Be Careful When Interpreting Predictive Models in Search of Causal Insights | by Scott Lundberg | Towards Data Science

もうこの辺になってくると、ある程度経験に基づいた仮定をおいて因果関係を一つ一つ確認していかないといけないということですかね。

使ったコード

一部動かなかったコードもありますが、一応動作確認はこちらのコードでやりました。

参考文献

下記の文献を参考にさせていただきました。

qiita.com

www.datarobot.com

data-analysis-stats.jp

https://recruit.cct-inc.co.jp/tecblog/machine-learning/shap/

感想

「思考停止でSHAPを使うのには落とし穴があるのはわかったから、結論SHAPをどう使ったら良いの?」という声が聞こえてきそうだったので、頭の整理を兼ねて色々やってみた次第です。 結論として、因果推論をちゃんと勉強してから使わないと、表面上の値だけを見て使用するとおかしな解釈になるという、至極一般的なことかなと思います。

正しく理解して使わないと痛い目を見るというのは何事もそうだと思うので、気をつけたいなと思いました。(小並感)