如何将多份AUC与Cutoff结果合并为单一DataFrame?
我来帮你搞定这个问题!你的代码现在每次循环都会覆盖df变量,而且对Area函数返回值的处理方式也不对,导致最后只能得到单条记录的零散结果。咱们调整一下代码,就能把所有阈值对应的AUC和Cutoff合并成一个整齐的DataFrame了。
调整后的完整代码
首先优化Area函数,让它直接返回单行DataFrame(而不是列表),这样循环里可以直接把结果追加起来:
# 提前加载依赖库,避免函数内重复加载(更高效) library(ROCR) library(Metrics) Area <- function(x){ log_predict <- predict(lr1, newdata = valid, type = "response") log_predict <- ifelse(log_predict > x, 1, 0) pr <- prediction(log_predict, valid$target) perf <- performance(pr, measure = "tpr", x.measure = "fpr") plot(perf) # 注意:循环里会生成11张ROC图,不需要的话可以注释掉 a <- auc(valid$target, log_predict) # 返回带列名的单行数据框 data.frame(AUC = a, Cutoff = x) } # 初始化空的结果数据框 result_df <- data.frame(AUC = numeric(), Cutoff = numeric()) # 遍历阈值,逐个追加结果 for (i in seq(from=0.1, to=0.2, by=0.01)){ result_df <- rbind(result_df, Area(i)) } # 查看最终合并后的结果 str(result_df) print(result_df)
为什么原来的代码出问题?
- 你原来的
Area函数返回的是list(AUC=a, cutoff=x),用do.call(rbind, Area(i))处理后,会生成只有V1列的DataFrame(每行对应列表的一个元素),列名也丢失了。 - 每次循环都重新给
df赋值,导致之前的结果被覆盖,最后只保留了最后一个阈值的结果。
额外小提示
如果不想循环里生成11张ROC图,可以把plot(perf)语句移到循环外,或者只在找到最优Cutoff后再绘制对应图,这样更清爽。
内容的提问来源于stack exchange,提问作者gssv anand




