You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将多份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)

为什么原来的代码出问题?

  1. 你原来的Area函数返回的是list(AUC=a, cutoff=x),用do.call(rbind, Area(i))处理后,会生成只有V1列的DataFrame(每行对应列表的一个元素),列名也丢失了。
  2. 每次循环都重新给df赋值,导致之前的结果被覆盖,最后只保留了最后一个阈值的结果。

额外小提示

如果不想循环里生成11张ROC图,可以把plot(perf)语句移到循环外,或者只在找到最优Cutoff后再绘制对应图,这样更清爽。

内容的提问来源于stack exchange,提问作者gssv anand

火山引擎 最新活动