如何对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
相关产品推荐
相关产品推荐

