ボストン住宅価格のデータセットをSHAPで可視化

解釈可能AIとして使われる「SHAP」というものがありますが、簡単に言えばshapley値という出力値(厳密には違いますが目的変数の値と思っていただければ)を使ってボストン住宅価格のデータセットを覗いてみようと思います。

※この記事はあくまでSHAPの使い方やグラフの見方でしかありません、過度な期待はしないでください。
# コード
```Python3
from lightgbm import LGBMClassifier
import pandas as pd
import shap

shap.initjs()

df = pd.read_csv("/content/drive/MyDrive/boston.csv")
x = df.drop("PRICE", axis=1)
y = df["PRICE"]

model = LGBMRegressor()
model.fit(x, y)

explainer = shap.TreeExplainer(model)
shap_values = explainer(x)
```

## 重要度のプロット
>一般的な特徴重要度棒グラフを使用するのではなく、各特徴の SHAP 値の密度散布図を使用して、検証データセット内の個人のモデル出力に各特徴がどの程度の影響を与えるかを特定します。 特徴は、すべてのサンプルにわたる SHAP 値の大きさの合計によって並べ替えられます。 興味深いことに、関係特徴はキャピタル ゲイン特徴よりもモデル全体に​​大きな影響を与えますが、キャピタル ゲインが重要なサンプルでは年齢よりも大きな影響を及ぼします。 言い換えれば、キャピタルゲインはいくつかの予測に大きな影響を与えますが、年齢はすべての予測に小さな影響を与えます。
散布点が直線上に収まらない場合は、散布点が重なって密度が示され、各点の色がその個人の特徴量を表すことに注意してください。 
SHAPの公式ページよりGoogle翻訳して引用
```Python3
shap.summary_plot(shap_values, x)
```
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/2033acd7-639a-b836-953f-deab8c694c52.png)
色が赤に近いほどその変数の値が高く、横軸は出力値になります。
こうやってみると色から値の傾向と幅から影響度が分かると思います。
### 実際の重要度
```Python3
imp = model.feature_importances_
df_imp = pd.DataFrame(imp)
df_imp.index = x.columns
df_imp.columns = ["imp"]
df_imp.sort_values("imp", ascending=False)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/b936abea-834b-2d82-6ad6-6b3e044bd103.png)

一部順番が違いますがおおよそ一致している事が分かります、またSHAPの場合だとどういう風に値に影響するかも分かる分、分析する上で非常に有効でしょう。

## SHAP依存プロット
>SHAP 依存プロットは、データセット全体にわたる単一のフィーチャの影響を示します。 これらは、多くのサンプルにわたる特徴の値とその特徴の SHAP 値をプロットします。 SHAP 依存プロットは部分依存プロットに似ていますが、フィーチャ内に存在する交互作用効果を考慮しており、データによってサポートされる入力空間の領域でのみ定義されます。 単一の特徴値における SHAP 値の垂直分散は交互作用効果によって引き起こされ、別の特徴が選択されます。 可能性のある相互作用を強調するための色付け。 
SHAP公式ページをGoogle翻訳で引用
```Python3
for name in x.columns:
    shap.dependence_plot(name, shap_values.values, x, display_features=x)
```
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/bde21379-a2fd-5f62-631e-fca01ca8da0a.png)
![Untitled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/921a2701-fe9a-099b-4dc8-77baacb452f0.png)
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/df6a23c6-8175-72b1-b8f0-9238e106be8f.png)
![Untitled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/9c9bc92b-bff4-f9a4-5b3b-de2e4d5979f7.png)
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/9533e5cb-74fa-146c-5792-037ecad1afb5.png)
![Untitled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/bc509719-c87f-bd79-9954-2b76c362a7bc.png)
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/c28b5186-94e7-de9d-a129-95a7045d3b41.png)
![Untitled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/964e274e-8b5b-1f22-f6ee-9c6f9556dd44.png)
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/b83da00a-47dd-43aa-5651-c4ad5cf95d50.png)
![Untitled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/ab9aced0-c44a-161e-888b-8cdddf32ade3.png)
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/644badcf-14bc-c943-f0f4-232407cb82c8.png)
![Untitled-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/b8e2742d-93d7-7abc-afa8-8079e231f7e9.png)
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/4d9a7a7e-5017-d9b8-f8ab-48c75df2214b.png)

この散布図では横軸に横軸の変数の値を取り色で二つ目の変数の値を表し縦軸はSHAPの出力値にどれだけ寄与しているかを表しています。

# まとめ
Google Colabだったからか一部動かなかったけど、これだけあれば分析に凄い使えますよね
# 参考文献
Census income classification with LightGBM &mdash; SHAP latest documentation
https://shap.readthedocs.io/en/latest/example_notebooks/tabular_examples/tree_based_models/Census%20income%20classification%20with%20LightGBM.html