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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:09:01