You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Tidymodels的workflowsets中为XGB模型获取SHAP值的问题

解决带可调参数Recipe的XGBoost模型对接SHAPforxgboost的问题

问题背景

使用tidymodels构建带有可调参数(如step_ns(deg_free = tune()))的Recipe结合XGBoost模型后,无法像常规示例那样直接通过prep()和bake()生成特征矩阵,进而无法传入SHAPforxgboost进行模型解释。

解决方案步骤

当通过last_fit()完成最终模型拟合后,tidymodels已自动完成Recipe的参数固化和预处理流程,可直接从拟合结果中提取所需对象:

  • 提取拟合完成的Workflow,它包含参数确定且已prep好的Recipe,以及训练完成的XGBoost模型
  • 用预处理后的Recipe生成符合要求的特征矩阵
  • 提取底层XGBoost模型对象,传入SHAPforxgboost计算解释值

完整代码示例

在你现有代码的基础上,添加以下内容即可实现SHAP分析:

# 安装并加载SHAPforxgboost
if (!require("SHAPforxgboost")) install.packages("SHAPforxgboost")
library(SHAPforxgboost)

# 从last_fit结果中提取已拟合完成的workflow
final_wf <- test_results$.workflow[[1]]

# 提取参数固化后已prep好的recipe
prepped_rec <- final_wf %>% extract_recipe()

# 用预处理后的recipe处理训练数据,生成特征矩阵(排除响应变量)
X_train <- bake(prepped_rec, new_data = ames_train, all_predictors()) %>% as.matrix()

# 提取底层的xgboost模型对象
xgb_model <- final_wf %>% extract_fit_parsnip() %>% extract_fit_engine()

# 计算SHAP值
shap_values <- shap.score.rank(xgb_model, X_train = X_train)

# 绘制SHAP汇总图
shap.plot.summary(shap_values)

# 绘制单个特征的SHAP依赖图(示例:overall_qual)
shap.plot.dependence(data_long = shap_values, x = "overall_qual", color_feature = "gr_liv_area")

关键说明

  • last_fit()执行过程中会自动对Recipe执行prep(),并使用调优得到的最优参数完成所有预处理,因此提取出的prepped_rec无需手动调用prep()
  • 特征矩阵需要转换为矩阵格式,以适配xgboost模型和SHAPforxgboost的输入要求
  • 若需分析测试数据,只需将new_data替换为ames_test即可

内容的提问来源于stack exchange,提问作者TheGoat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:54:54