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

如何对10折交叉验证得到的10组ROC与AUC取均值?(ROSE包)

嘿,我来帮你搞定这个问题!用ROSE包做完10折交叉验证后,计算AUC均值和生成平均ROC曲线其实很简单,分两种常见情况给你讲清楚:

1. 计算10折AUC的均值

情况1:用ROSE自带的cv.rose()做交叉验证

如果你直接用ROSE包的cv.rose()函数完成10折交叉验证,它的返回结果里已经自带了每一组的AUC值,直接提取计算就行:

  • 先运行交叉验证(假设你的数据是data,二分类响应变量是y):
library(ROSE)
# 替换成你的公式和数据集
cv_result <- cv.rose(y ~ ., data = data, k = 10)
  • 提取10个AUC值并计算均值:
# 提取所有折的AUC,得到一个长度为10的向量
all_auc <- cv_result$auc
# 计算均值
mean_auc <- mean(all_auc)
# 输出结果
cat("10折交叉验证的平均AUC值:", mean_auc, "\n")

情况2:手动实现10折交叉验证

如果是你自己写循环拆分数据集做的交叉验证(比如用caret包拆分折叠),那只需要把每一次的AUC存到向量里,最后求均值就行:

library(ROSE)
library(caret)
library(pROC)

# 替换成你的数据集和响应变量
data <- your_dataset
response_var <- data$y

# 创建10折的索引
folds <- createFolds(response_var, k = 10)
# 初始化空向量存储每折的AUC
auc_values <- numeric(10)

for (i in 1:10) {
  # 拆分训练集和测试集
  train_data <- data[-folds[[i]], ]
  test_data <- data[folds[[i]], ]
  
  # 用ROSE生成平衡后的训练集
  rose_train <- ROSE(y ~ ., data = train_data)$data
  
  # 训练你的模型(这里用逻辑回归举例,换成你实际用的模型即可)
  model <- glm(y ~ ., data = rose_train, family = binomial)
  
  # 对测试集预测概率
  pred_probs <- predict(model, newdata = test_data, type = "response")
  
  # 计算当前折的ROC和AUC
  roc_obj <- roc(test_data$y, pred_probs)
  auc_values[i] <- auc(roc_obj)
}

# 计算平均AUC
mean_auc <- mean(auc_values)
cat("10折交叉验证的平均AUC值:", mean_auc, "\n")
2. 生成平均ROC曲线(可选)

如果你还需要把10组ROC曲线合并成一条平均曲线,可以用pROC包的roc.aggregate()函数,承接上面手动循环的代码,只需要额外保存每折的ROC对象:

# 初始化空列表存储每折的ROC对象
roc_list <- list()

for (i in 1:10) {
  # ... 上面的循环代码不变 ...
  roc_obj <- roc(test_data$y, pred_probs)
  roc_list[[i]] <- roc_obj
  auc_values[i] <- auc(roc_obj)
}

# 合并得到平均ROC曲线
mean_roc <- roc.aggregate(roc_list)

# 绘制平均ROC曲线,同时叠加各折的曲线作为参考
plot(mean_roc, main = "Average ROC Curve (10-fold CV with ROSE)", 
     col = "darkred", lwd = 2, print.auc = TRUE)
# 绘制每折的ROC曲线(灰色虚线)
for (roc in roc_list) {
  lines(roc, col = "gray", lty = 2)
}
# 重新绘制平均曲线,确保在最上层
lines(mean_roc, col = "darkred", lwd = 2)
# 添加图例
legend("bottomright", 
       legend = c("Individual Fold ROC", "Average ROC"),
       col = c("gray", "darkred"),
       lty = c(2, 1),
       lwd = c(1, 2))

内容的提问来源于stack exchange,提问作者Fatima Mb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:08:17