首页 > 解决方案 > 绘制单个 Shapley 值观察(类似于原作者的 Python 输出)

问题描述

我想在这里创建类似于下图(来自 Python)的东西

在此处输入图像描述

Python代码如下:

import xgboost
import shap

# load JS visualization code to notebook
shap.initjs()

# train XGBoost model
X,y = shap.datasets.boston()
model = xgboost.train({"learning_rate": 0.01}, xgboost.DMatrix(X, label=y), 100)

# explain the model's predictions using SHAP
# (same syntax works for LightGBM, CatBoost, scikit-learn and spark models)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)

它根据 Shapley 值绘制单个观测值预测。

我想我已经设法使用以下方法在 R 中重新创建了这一点:

library(MASS)
library(xgboost)
library(SHAPforxgboost)
data(Boston)
Boston


X_train <- Boston %>% 
  dplyr::select(-crim) %>% 
  as.matrix()

Y_train <- Boston %>% 
  dplyr::select(crim) %>% 
  as.matrix()

dtrain <- xgb.DMatrix(data = X_train, label = Y_train)


params <- list(
  "eta" = 0.3,
  "max_depth" = 6,
  "colsample_bytree" = 1,
  "min_child_weight" = 3,
  "subsample"= 0.8,
  "objective"="reg:linear",
  "gamma" = 1,
  "lambda" = 1,
  "alpha" = 0,
  "max_delta_step" = 0,
  "colsample_bylevel" = 1,
  "eval_metric"= "rmse",
  "set.seed" = 176
)

watchlist <- list("train" = dtrain)
nround = 50 
xgb.model <- xgb.train(params, dtrain, nround, watchlist)

shapValues <- shap.values(xgb_model = xgb.model, X_train = X_train)

shapForceData <- X_train %>% 
  data.frame(shapValues$shap_score)

singleShapObs <- data.frame(shapForceData[1, ]) # want to plot this data

现在我有一个singleShapObs包含“真实”值和“Shapley”值的变量(包含的变量.1是 Shaply 值。如何绘制类似于上述 Python 示例的内容?

注意:这源于我在此处回答的上一个问题。在那个解决方案中,每个geom_col都是一个观察。我基本上想提取其中一个并以与 Python包geom_cols类似的方式表示它。Shap(不必与 Python 图 100% 完全相同)

标签: pythonrggplot2

解决方案


推荐阅读