如何使用FOR循环计算多个dataframe的AUC指标并存储结果
实现方案
- 原代码存在两处可优化点:计算ROC时硬编码了
iris$Species,需要替换为当前循环中数据集的真实标签,避免所有数据集计算出的AUC都对应iris数据集;补充结果写入矩阵的逻辑,建议通过索引遍历数据集列表,更易定位结果存储位置
完整可运行代码
require(pROC) require(randomForest) # 预处理iris数据集作为示例 data(iris) iris <- iris[-which(iris$Species=="setosa"),] iris$Species <- as.factor(as.character(iris$Species)) # 构造数据集列表,可自定义添加任意多数据集 df1 <- iris df2 <- iris # 可以给数据集命名,后续结果列名直接复用 df_list <- list(数据集1 = df1, 数据集2 = df2) # 动态生成空结果矩阵,列数和数据集数量一致,行存储AUC值 results_matrix <- matrix(ncol = length(df_list), nrow = 1, dimnames = list("AUC值", names(df_list))) # 循环遍历每个数据集计算AUC for (i in seq_along(df_list)) { current_df <- df_list[[i]] # 训练随机森林 rf_model <- randomForest::randomForest(Species ~ ., data = current_df) # 计算ROC和AUC,用当前数据集的标签,不要硬编码iris$Species rf_roc <- roc(current_df$Species, rf_model$votes[,2]) current_auc <- as.numeric(auc(rf_roc)) # 写入结果矩阵对应位置 results_matrix[1, i] <- current_auc } # 打印结果 print(results_matrix) # 如果需要转成dataframe后续处理用 results_df <- as.data.frame(results_matrix)
扩展说明
- 如果需要新增数据集,仅需要把数据集加入
df_list即可,results_matrix的列数可以直接用length(df_list)动态生成,无需手动修改 - 如果需要多次重复实验取AUC均值,只需要修改
results_matrix的行数为重复次数,每一行存储一次实验的所有数据集AUC结果 - 如果不同数据集的响应变量名不一致,可以把数据集和响应变量名配对存储,例如列表每个元素为
list(df=xxx, y_col="响应变量名"),循环中动态读取对应列即可
内容的提问来源于stack exchange,提问作者Konar
相关产品推荐
相关产品推荐

