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

如何用Tidyverse语法+yardstick包按组计算模型评估指标?

嗨,这事儿用tidyverse语法结合yardstick包就能轻松搞定,我给你一步步拆解:

第一步:先对齐数据结构(模拟你的场景)

首先假设你的数据是长格式(每个模型的单条预测占一行),包含分组变量(比如模型名称)、真实标签、分类预测结果,以及正类别的预测概率(用来算AUC)。我先模拟一个和你类似的数据集:

library(tidyverse)
library(yardstick)

set.seed(123) # 固定随机种子方便复现
df <- tibble(
  group = rep(c("模型A", "模型B", "模型C"), each = 100), # 分组:三个模型
  truth = factor(sample(c("负类", "正类"), 300, replace = TRUE), levels = c("负类", "正类")), # 真实标签(转成因子很重要!)
  pred = factor(sample(c("负类", "正类"), 300, replace = TRUE), levels = c("负类", "正类")), # 分类预测结果
  prob_pos = runif(300) # 正类的预测概率(AUC需要这个)
)

如果你的数据是宽格式(每个模型的预测是单独的列),得先转成长格式,比如:

# 假设宽格式数据示例
wide_df <- tibble(
  truth = factor(sample(c("负类", "正类"), 100, replace = TRUE), levels = c("负类", "正类")),
  模型A_pred = factor(sample(c("负类", "正类"), 100, replace = TRUE), levels = c("负类", "正类")),
  模型A_prob = runif(100),
  模型B_pred = factor(sample(c("负类", "正类"), 100, replace = TRUE), levels = c("负类", "正类")),
  模型B_prob = runif(100)
)

# 转成长格式
long_df <- wide_df %>%
  pivot_longer(
    cols = -truth,
    names_to = c("group", ".value"),
    names_pattern = "(.*)_(pred|prob)" # 按下划线拆分列名
  )

第二步:按组批量计算指标

yardstick支持用metric_set()打包你需要的所有指标,再结合group_by()实现分组计算,非常高效:

  1. 先打包需要的指标:
# 打包准确率、精确率、召回率、AUC这四个指标
my_eval_metrics <- metric_set(accuracy, precision, recall, roc_auc)
  1. 分组计算所有指标:
result <- df %>%
  group_by(group) %>%
  summarise(
    # 直接调用打包好的指标函数,参数顺序:真实标签、分类预测、正类概率(给AUC用)
    my_eval_metrics(truth, pred, prob_pos),
    .groups = "drop" # 计算完取消分组
  )

# 查看结果
result

关键注意事项

  • 一定要把truth和pred转成因子类型,并且统一类别水平(比如都把正类放在第二个位置,或者在指标函数里用event_level = "second"指定正类)
  • 如果是多分类场景,需要调整指标(比如用precision_recall_fscore()的多分类版本),但你提到的AUC、Precision这些默认是二分类场景的指标
  • 如果你的概率列命名不同,只要在调用指标函数时对应好参数即可(比如roc_auc(truth = truth, estimate = 你的概率列名))

运行完上面的代码,你就能得到每个分组(模型)对应的四个评估指标结果啦!

内容的提问来源于stack exchange,提问作者Abi K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:16:44