如何用R语言Metrics包批量计算多预测列的AUC值?
解决批量计算多列预测值AUC的问题
这个问题我之前也碰到过!Metrics包的auc()函数默认只处理一对一的向量,直接传多列预测值时,它会把多列的预测值拼接成一个长向量,和真实值循环匹配,这就导致了错误的结果和警告。下面给你两个简单的解决方法,帮你批量计算每个预测列对应的AUC:
方法1:使用基础R的apply()函数
apply()可以对数据框的每一列(或行)重复执行指定函数,非常适合这种批量计算场景:
require(Metrics) # 你的原始数据集 evaluate <- "true prediction_1 prediction_2 prediction_3 1 0.9 0.5 0.8 1 0.9 0.4 0.7 1 0.8 0.6 0.75 0 0.1 0.3 0.2 0 0.05 0.4 0.1 0 0.15 0.45 0.15" Table <- read.table(text=evaluate, header = TRUE) # 按列批量计算AUC auc_results <- apply(Table[, 2:4], MARGIN = 2, FUN = function(col) { auc(Table$true, col) }) # 查看结果 auc_results
运行这段代码后,你会得到每个预测列对应的AUC值:
prediction_1 prediction_2 prediction_3 1.0 0.8333 1.0000
这里的MARGIN=2表示我们要对列进行操作,匿名函数里的col代表当前循环到的预测列,每次都用固定的真实值Table$true和当前列计算AUC。
方法2:使用tidyverse风格的purrr::map_dbl()
如果你习惯用tidyverse工具链,purrr包的map_dbl()也能轻松完成这个任务,代码更简洁:
library(purrr) library(Metrics) # 批量计算并返回数值向量 auc_results <- map_dbl(Table[, 2:4], ~ auc(Table$true, .x)) auc_results
map_dbl()会遍历数据框的每一列,~用来定义匿名函数,.x指代当前处理的列,最后自动返回一个数值向量,结果和上面完全一致。
这两种方法都能避免手动逐个列计算的繁琐,也不会出现向量循环匹配导致的错误结果。
内容的提问来源于stack exchange,提问作者Kamil




