如何将双循环下的模型交叉验证评估指标存入DataFrame?
解决R语言循环存储交叉验证AUC到DataFrame的问题
你的核心问题是循环中未计算正确的行索引,导致后续循环覆盖了之前的AUC值。以下是两种可靠的实现方案:
方案1:预先初始化DataFrame(推荐,效率更高)
预先根据变量组合数和折数创建足够行数的DataFrame,直接通过计算索引赋值,避免动态修改的性能损耗:
# 计算总记录数:变量组合数 × 10折 total_rows <- length(var_combinations) * 10 # 预先创建结构完整的DataFrame Table <- data.frame( Model = rep(paste0("j=", seq_along(var_combinations)), each = 10), Fold = rep(paste0("i=", 1:10), times = length(var_combinations)), AUC = numeric(total_rows), stringsAsFactors = FALSE ) # 双层循环遍历变量组合与折数 for (j in seq_along(var_combinations)) { for(i in 1:10) { # --- 这里插入你的模型训练与AUC计算代码 --- # 示例:从已训练好的模型列表中提取并计算AUC # current_model <- models_vgam[[j]][[i]] # auc <- ... # 替换为你的AUC计算逻辑,比如使用pROC包的roc()函数 # 计算当前循环对应的行索引:(j-1)*10 + i row_idx <- (j - 1) * 10 + i # 为对应行的AUC赋值 Table$AUC[row_idx] <- auc } }
方案2:动态添加行(适合小数据量)
如果变量组合数量不多,可以直接在每次循环中构造新行并追加到DataFrame:
# 初始化空DataFrame Table <- data.frame( Model = character(), Fold = character(), AUC = numeric(), stringsAsFactors = FALSE ) for (j in seq_along(var_combinations)) { for(i in 1:10) { # --- 模型训练与AUC计算 --- # auc <- ... # 构造当前循环的记录行 new_row <- data.frame( Model = paste0("j=", j), Fold = paste0("i=", i), AUC = auc, stringsAsFactors = FALSE ) # 追加到DataFrame Table <- rbind(Table, new_row) } }
问题原因说明
你之前使用Table[i + 1, 3] <- auc的方式,当j进入下一轮循环时,i会重新从1开始,导致覆盖上一个j对应的行数据,最终只保留了最后一个变量组合的10折结果。而通过(j-1)*10 + i计算的索引,能确保每个j和i的组合对应唯一的行,不会出现覆盖问题。
内容的提问来源于stack exchange,提问作者vinha
相关产品推荐
相关产品推荐

