如何用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()实现分组计算,非常高效:
- 先打包需要的指标:
# 打包准确率、精确率、召回率、AUC这四个指标 my_eval_metrics <- metric_set(accuracy, precision, recall, roc_auc)
- 分组计算所有指标:
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
相关产品推荐
相关产品推荐

