SHAP(Shapley Additive Explanations)について
SHAPとは?
SHAP(Shapley Additive Explanations)は、機械学習モデルの予測を解釈するための方法論です。ゲーム理論のShapley値に基づいており、どんな機械学習のモデルにも用いることができます。
今回はshapを利用して、特徴量の寄与度を可視化してみたいと思います。
下記のドキュメントを参考に進めていきます。
SHAPで特徴量の寄与度を可視化
環境はGoogle Corabです。
インストール
!pip install shap
XGBoostモデルの構築
国勢調査のデータセットをもとに収入が年間50,000ドルを超えるかどうかをXGBoostで予測しています。
X, y = shap.datasets.adult()
X_display, y_display = shap.datasets.adult(display=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)
d_train = xgboost.DMatrix(X_train, label=y_train)
d_test = xgboost.DMatrix(X_test, label=y_test)
params = {
"eta": 0.01,
"objective": "binary:logistic",
"subsample": 0.5,
"base_score": np.mean(y_train),
"eval_metric": "logloss",
}
model = xgboost.train(
params,
d_train,
5000,
evals=[(d_test, "test")],
verbose_eval=100,
early_stopping_rounds=20,
)
モデルを読み込み、Shap値を算出します。
XGBoostは決定木(GBDT)のモデルなので、TreeExplainerを用います。
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
モデルの種類に合わせたExplainerを活用できます。
Explainerの一覧は下記リファレンスで確認できます。
それでは、各プロットを見ていきたいと思います。
Force Plot
shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[0, :], X_display.iloc[0, :])
![](https://assets.st-note.com/img/1710402919839-W8EwKvzhgs.png?width=1200)
Force Plotの赤色の特徴量は予測値を増加させる影響があり、青色の特徴量は減少させる影響があります。青いバーの長さから赤いバーの長さを引くと、予測値から基準値(base value)までの距離と等しくなります。
Age、Sex、Education-Numが正の影響を与える事が確認できます。
またCapital Gain、Relationship、Occupationといった特徴量が負の影響を与えている事が確認できます。
shap.initjs()はグラフの出力に必要なJavaScriptの読み込みのための記述です。Google Corabでは、force_plot()の実行を行うセルの全てにこちらの記述をしないとエラーになりました。
Summary Plot
shap.summary_plot(shap_values, X)
![](https://assets.st-note.com/img/1710403434198-273wn9At8J.png?width=1200)
各特徴量のShap値のScatter Plotになります。
特徴量は全てのサンプルの中でShap値の大きさの合計が大きいものからソートされています。RelationshipがCapital Gainよりも全体的なモデルの性能に与えるインパクトが大きいといった事がわかります。
Bar Plot
shap.summary_plot(shap_values, X_display, plot_type="bar")
![](https://assets.st-note.com/img/1710403514768-qexDBqQ0Rc.png?width=1200)
データセット全体のShap値の大きさの平均をとったBar Plotです。
Dependence Contribution Plot
for name in X_train.columns:
shap.dependence_plot(name, shap_values, X, display_features=X_display)
Dependence Plotは、データセット全体にわたる単一の特徴量の影響を可視化します。X軸に特徴量の値とY軸にShap値をプロットしています。
また、別の特徴量との交互作用も確認できます。
指定を行わない場合は自動で交互作用が大きい特徴量が選択されるようです。
Age
![](https://assets.st-note.com/img/1710403593117-qkjSFPvhCe.png?width=1200)
Workclass
![](https://assets.st-note.com/img/1710404723954-znlNxK345R.png?width=1200)
Education-Num
![](https://assets.st-note.com/img/1710404733318-q9kHJHbF3f.png?width=1200)
Marital Status
![](https://assets.st-note.com/img/1710404738685-BehTKmlA3W.png?width=1200)
Occupation
![](https://assets.st-note.com/img/1710404745991-aG30TpvbPt.png?width=1200)
Relationship
![](https://assets.st-note.com/img/1710404751131-TkO0bJVUAx.png?width=1200)
Race
![](https://assets.st-note.com/img/1710404756355-7ccvcNnfyr.png?width=1200)
Sex
![](https://assets.st-note.com/img/1710404761214-6UwG6Bafrk.png?width=1200)
Capital Gain
![](https://assets.st-note.com/img/1710404767357-TqpHgP6whx.png?width=1200)
Capital Loss
![](https://assets.st-note.com/img/1710404782031-gSGRQIMu4B.png?width=1200)
Hours per week
![](https://assets.st-note.com/img/1710404787937-fC3eVpUNVT.png?width=1200)
Country
![](https://assets.st-note.com/img/1710404793171-Cl3F8RkELc.png?width=1200)