在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
相关产品推荐
相关产品推荐

