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

使用DALEXtra为tidymodels绘制PDP时遇精度损失转换错误

问题

使用R包DALEXtra为tidymodels创建部分依赖图(Partial Dependence Plot)时,触发如下错误:

Error in scream(): Can't convert from data$sqft to sqft due 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:20:33