”すぐ” このデータまとめて欲しい」に ”すぐ”に超簡単に応えられる Python の・・・（SHAP+ICE）



***
https://qiita.com/hima2b4/items/6a490f6d9527221da6f1

～ ↑↑ **前回記事** ↑↑ ：「”すぐ” このデータまとめて欲しい」に ”すぐ”に超簡単に応えられる Python の・・・（その7）　の**続き**です。
　

## はじめに
前回記事は、Borutaで特徴量を選択した後、SHAP とdtreevizで特徴量と目的変数の関係を可視化し、解釈を容易にしようという内容でした。

先日、以下の書籍に巡り合いました。

https://www.amazon.co.jp/gp/aw/d/429712226X/ref=cm_cr_arp_mb_bdcrb_top?ie=UTF8

機械学習はブラックボックス → 解釈可能に変わってきていると。PFI(Permutation Feature Importance), PD(Partial Dependence), ICE(Individual Conditional Expectation), そしてSHAP(SHapley Additive exPlanations) がこの代表格として取り上げられていました。

機械学習やPython関連書籍は「ネット情報で十分だったな」と感じることも多いのですが、この書籍は「これでないとわからなかった・知らなかった」ことが（私は）数多くあり、直近でSHAPのよさを感じていたことも相まって、思わず拝みました。

書籍では、**SHAP, ICE** を以下のように紹介されていました。
- 機械学習モデルが 「なぜその予測値を出したのか」 を各特徴量の貢献度に分解して解釈できるのが**SHAP**。
- 各特徴量がモデルの予測値にどのように影響を与えているのかを確認できるのが **ICE**。

**SHAP**は「なぜモデルがこの予測値を出したのか｣、**ICE**は「特徴量が変化した際に予測値がどう反応するのか」・・・との内容から、**ICEもやってみたい！** と感化され、前回記事の内容から一歩前進させることにしました。

- 前回記事からBorutaは抜きました。特徴量を絞る前に特徴量と目的変数の関係を見たいことがありますので、今回はSHAP, ICEに絞ったということです。
- 先の通り、ICEを追加しました。
- SHAP, ICEともに機械学習モデルありきなので、いずれもモデル精度を意識した上でお付き合いしないといけないなと（遅ればせながら）認識し、モデル精度の確認を追加しました。
- 前回はマルチクラスデータを切り捨てましたが、今回は「回帰•二値分類データ用」と「マルチ分類データ用」それぞれで作成しました。ただ、ICEはマルチクラスに対応していないっぽいので「回帰•二値分類データ用」のみに実装しています。
 
***



## 実行条件など
>- **Google colab**で実行（※前回同様、いくつかのデータセットをLoadできるようにしています。）

- [**回帰•二値分類データ**]
[Open with Colab](https://colab.research.google.com/github/hima2b4/Auto_Profiling/blob/main/SHAP%2Bdtreeviz.ipynb)
- [**マルチクラス分類データ**]
[Open with Colab](https://colab.research.google.com/github/hima2b4/Auto_Profiling/blob/main/SHAP%2Bdtreeviz_Multi-class.ipynb)

***
**ipynbファイル（ヘッド部分）のイメージ** 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/3bc52bae-3234-5b92-50d1-c6f42c4476f0.png)

**bostonデータセットで描いたICE plot**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/a8d221b8-24f1-8caa-0a63-873954edba94.png)
以下、SHAPの summary plot をみると、LSTATとRMの重要度が大きいことがわかります。ICEでみると「あぁ、このような傾向なのか」が掴めます。LSTATは右肩下がり、RMは右肩上がり。これはsummary plotの色でもわかりますが、ICEをみるとより傾向が掴めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/de920561-e7d6-5c35-def3-54a3c0a5b688.png)



## 最後に
**SHAP**は「なぜモデルがこの予測値を出したのか｣、**ICE**は「特徴量が変化した際に予測値がどう反応するのか」が可視化できますので、解釈する上でとてもいいです。
線形回帰モデルの場合、「特徴量と予測値の関係は解釈できるが、高い予測精度は期待できないことが多い」に対し、決定木のアンサンブルモデルは「高い予測精度が期待できるが、ブラックボックスモデルなので解釈はむつかしい」という関係にある、ということが通例でしたが、SHAP・ICEはこの通例を覆してくれています。

また、データを読込ませた後、数分で可視化されたこれだけの結果（SHAP・ICE・dtreeviz）を見ることができるというのは、一昔前は考えてもいませんでしたので、各ライブラリ も Python も 書籍[「機械学習を解釈する技術」](https://www.amazon.co.jp/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%92%E8%A7%A3%E9%87%88%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%E3%80%9C%E4%BA%88%E6%B8%AC%E5%8A%9B%E3%81%A8%E8%AA%AC%E6%98%8E%E5%8A%9B%E3%82%92%E4%B8%A1%E7%AB%8B%E3%81%99%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-%E6%A3%AE%E4%B8%8B-%E5%85%89%E4%B9%8B%E5%8A%A9/dp/429712226X/ref=sr_1_1?adgrpid=124198978555&gclid=Cj0KCQjwhqaVBhCxARIsAHK1tiOWz9MWreusvaKAV2HIiFlFBN9u0YeQ83HJl6mSq9V5O7GxZEBfzMwaAky-EALw_wcB&hvadid=598107952013&hvdev=c&hvlocphy=1009501&hvnetw=g&hvqmt=e&hvrand=10156289038612485629&hvtargid=kwd-1305614279162&hydadcr=1979_13502549&jp-ad-ap=0&keywords=%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%82%92%E8%A7%A3%E9%87%88%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93&qid=1655282188&sr=8-1)も すべてがすばらしいです。
これらを利用させていただくことができることは本当にありがたいことです。



## 参考
https://github.com/slundberg/shap

https://scikit-learn.org/stable/modules/generated/sklearn.inspection.plot_partial_dependence.html