使用DALEXtra为tidymodels绘制PDP时遇精度损失转换错误
问题
使用R包DALEXtra为tidymodels创建部分依赖图(Partial Dependence Plot)时,触发如下错误:
Error in
scream(): Can't convert fromdata$sqftto sqftdue to loss of precision.
复现代码如下:
library(tidymodels) data(Sacramento, package = "modeldata") Sacramento <- Sacramento %>% mutate_if(is.character, as.factor) set.seed(123) data_split <- initial_split(Sacramento, prop = 0.75, strata = price) Sac_train <- training(data_split) Sac_test <- testing(data_split) rf_mod <- rand_forest(mtry = tune(), min_n = tune(), trees = 1000) %>% set_engine("ranger", importance = "permutation", keep.inbag = TRUE) %>% set_mode("regression") Sac_recipe <- recipe(price ~ ., data = Sac_train) %>% step_rm(zip, latitude, longitude) %>% step_normalize(all_numeric_predictors()) %>% step_dummy(all_nominal_predictors()) rf_workflow <- workflow() %>% add_model(rf_mod) %>% add_recipe(Sac_recipe) set.seed(123) Sac_folds <- vfold_cv(Sac_train, v = 10, repeats = 2, strata = price) set.seed(123) rf_res <- rf_workflow %>% tune_grid(grid = 3, resamples = Sac_folds, control = control_grid(save_pred = TRUE), metrics = metric_set(rmse)) rf_best <- rf_res %>% select_best(metric = "rmse") last_wf <- rf_workflow %>% finalize_workflow(rf_best) last_fit <- last_wf %>% last_fit(data_split) final_model <- extract_workflow(last_fit) library(DALEXtra) rf_explanier <- explain_tidymodels(model = final_model, data = select(Sac_train, -price), y = Sac_train$price) pdp_sqft <- model_profile(explainer = rf_explanier, variables = "sqft", N = NULL, groups = "type") # Error # Error in `scream()`: Can't convert from `data$sqft` <double> to `sqft` <integer> due to loss of precision.
解决方案
错误核心原因:传入explain_tidymodels的原始训练数据中,sqft是double类型,但经过recipe预处理后,模型实际接收的sqft是integer类型(原始Sacramento数据集的sqft本质是整数,却以double格式存储),DALEXtra生成PDP时类型转换冲突导致报错。
提供两种可行解决方法:
方法1:提前统一原始数据的sqft类型
在数据预处理初期,将sqft转换为integer类型,确保原始数据与模型期望的输入类型一致:
# 修改数据初始化代码 Sacramento <- Sacramento %>% mutate_if(is.character, as.factor) %>% mutate(sqft = as.integer(sqft)) # 新增该行转换sqft为整数
方法2:传入预处理后的数据集给解释器
不使用原始训练数据,改用经过recipe预处理后的数据集,保证数据类型与模型完全匹配:
# 生成预处理后的训练数据 processed_train <- bake(prep(Sac_recipe), new_data = NULL) # 创建解释器时使用预处理后的数据 rf_explanier <- explain_tidymodels(model = final_model, data = select(processed_train, -price), y = Sac_train$price)
验证
修改后重新运行model_profile代码,即可正常生成部分依赖图:
pdp_sqft <- model_profile(explainer = rf_explanier, variables = "sqft", N = NULL, groups = "type") # 绘制图形 plot(pdp_sqft)
内容的提问来源于stack exchange,提问作者Yang Yang
相关产品推荐
相关产品推荐

