使用data.table在R中汇总交叉验证指标的技术问题
解决方案:用data.table汇总交叉验证结果
1. 按超参数组合计算MAE/RMSE的均值与标准差
你之前的代码生成了嵌套列表列,导致结果结构不清晰。可以通过两种方式生成规整的汇总结果:
方法1:直接生成宽格式汇总列
hyperparameter_cols <- c("hyperparam_binary", "hyperparam_numeric") metric_cols <- c("MAE", "RMSE") summary_results <- dummy_data[, .( MAE_mean = mean(MAE, na.rm = TRUE), MAE_sd = sd(MAE, na.rm = TRUE), RMSE_mean = mean(RMSE, na.rm = TRUE), RMSE_sd = sd(RMSE, na.rm = TRUE) ), by = hyperparameter_cols ]
方法2:先转长格式再汇总(更灵活)
如果后续需要扩展更多指标,这种方法更易维护:
# 转长格式 melted <- melt(dummy_data, id.vars = c(hyperparameter_cols, "sub_model", "year"), measure.vars = metric_cols, variable.name = "metric", value.name = "score") # 按超参数+指标分组计算均值和标准差 summary_long <- melted[, .(mean_score = mean(score, na.rm = TRUE), sd_score = sd(score, na.rm = TRUE)), by = c(hyperparameter_cols, "metric") ] # 可选:转回宽格式 summary_wide <- dcast(summary_long, hyperparam_binary + hyperparam_numeric ~ metric, value.var = c("mean_score", "sd_score"))
2. 计算各超参数组合的平均排名
关键是在计算排名时保留超参数信息,再按超参数分组求平均:
# 1. 在sub_model/year分组内计算每个指标的排名,新增排名列到原数据 dummy_data[, c(paste0(metric_cols, "_rank")) := lapply(.SD, function(x) rank(x, ties.method = "average")), by = c("sub_model", "year"), .SDcols = metric_cols ] # 2. 按超参数组合计算排名的均值 rank_summary <- dummy_data[, lapply(.SD, mean, na.rm = TRUE), by = hyperparameter_cols, .SDcols = paste0(metric_cols, "_rank") ]
这样rank_summary就会包含每个超参数组合下MAE和RMSE的平均排名。
内容的提问来源于stack exchange,提问作者rw2
相关产品推荐
相关产品推荐

