tidymodels中tune_grid如何实现按分组计算自定义斯皮尔曼相关指标
基于tidymodels实现分组平均斯皮尔曼相关调优指标的方案
核心逻辑
不需要把Sample列设为预测变量,仅需将其标记为ID角色保留在数据集和重抽样对象中,自定义指标时直接从预测结果里读取该列做分组计算即可。
1. 预处理阶段标记Sample为ID列
在recipe中明确指定Sample列的角色为ID,不会进入模型训练,同时会在所有后续流程中保留:
library(tidymodels) library(yardstick) # 此处疗效替换为你的真实响应变量名 train_rec <- recipe(疗效 ~ ., data = 训练数据集) %>% update_role(Sample, new_role = "id")
交叉验证的重抽样对象会自动保留Sample列,不需要额外处理。
2. 自定义分组平均斯皮尔曼相关指标
直接适配yardstick的指标体系,无需额外传参,内部直接调用Sample列分组计算:
# 自定义指标函数 mean_grouped_spearman <- function(data, truth, estimate, na_rm = TRUE, ...) { # 按Sample分组计算每组斯皮尔曼相关 group_cor <- data %>% dplyr::group_by(Sample) %>% dplyr::summarise( spearman = cor( x = {{estimate}}, y = {{truth}}, method = "spearman", use = ifelse(na_rm, "pairwise.complete.obs", "everything") ) ) # 返回所有组的平均相关系数 mean(group_cor$spearman, na.rm = na_rm) } # 注册为yardstick可识别的数值型指标,指定为最大化方向 attr(mean_grouped_spearman, "direction") <- "maximize" attr(mean_grouped_spearman, "class") <- c("numeric_metric", "function") # 封装到指标集 custom_metrics <- metric_set(mean_grouped_spearman)
3. 调优时配置参数
调用tune_grid时开启保存预测结果的开关,指定自定义指标集即可:
# 你的模型声明示例,按需替换为真实模型 xgb_spec <- boost_tree( trees = tune(), learn_rate = tune() ) %>% set_mode("regression") %>% set_engine("xgboost") # 构建工作流 wf <- workflow() %>% add_recipe(train_rec) %>% add_model(xgb_spec) # 交叉验证调优 tune_res <- tune_grid( object = wf, resamples = vfold_cv(训练数据集, v = 5), # 按需调整折数 metrics = custom_metrics, control = control_grid(save_pred = TRUE) # 必须开启,否则预测结果不包含Sample列 )
常见报错处理
如果出现unused arguments报错,检查两个点:
- 自定义指标函数必须包含
data、truth、estimate三个核心参数,多余的入参可以放到...里 - 确认recipe中Sample列的角色是
id,没有被设为预测变量或响应变量 - 确认
control_grid中save_pred设置为TRUE
内容的提问来源于stack exchange,提问作者perdedorium
相关产品推荐
相关产品推荐

