使用caret训练模型(以ROC调参)后如何提取交叉验证准确率?
获取Caret交叉验证模型的准确率(以ROC为调参指标时)
嗨,我来帮你搞定这个问题!你现在用Caret训练随机森林模型,把ROC作为超参数调优的核心指标,想要拿到交叉验证的准确率,其实有两种实用的方法:
方法1:提前自定义汇总函数,训练时直接输出准确率
你当前用的twoClassSummary默认只计算ROC、灵敏度(Sens)和特异性(Spec)。如果想在调参过程中同时得到准确率,可以自定义一个汇总函数,把准确率也加入评估指标里:
# 自定义同时计算ROC、Sens、Spec和准确率的汇总函数 customSummary <- function(data, lev = NULL, model = NULL) { # 先调用原有twoClassSummary获取ROC相关指标 twoClassMetrics <- twoClassSummary(data, lev, model) # 计算当前折的准确率 acc <- confusionMatrix(data$pred, data$obs)$overall["Accuracy"] # 合并所有指标返回 c(twoClassMetrics, Accuracy = acc) } # 更新训练控制参数,使用自定义汇总函数 train_control <- trainControl( method = "cv", number = 10, classProbs = TRUE, summaryFunction = customSummary ) # 重新训练模型(保持你的原有参数) grid = expand.grid(mtry = c(1,2,3)) output <- train( Class~., data = segmentationData, trControl = train_control, tuneGrid = grid, method = "rf", metric = 'ROC', verbose = FALSE ) # 查看结果,现在results里会包含每个mtry对应的平均准确率 print(output$results)
运行后,output$results里会新增Accuracy列,直接显示每个调参组合的10折交叉验证平均准确率。
方法2:从已训练好的模型中提取结果计算准确率
如果你已经用原来的代码完成了模型训练,不想重新跑一遍,可以直接从训练好的output对象里提取交叉验证的预测数据来计算准确率:
# 提取交叉验证的真实标签和预测结果 pred_data <- output$pred[, c("obs", "pred", "Resample")] # 计算整体的交叉验证准确率 overall_accuracy <- mean(pred_data$obs == pred_data$pred) cat("整体交叉验证准确率:", round(overall_accuracy, 4), "\n") # 要是想看看每个折的准确率,可以用dplyr分组计算(需要先加载dplyr) library(dplyr) fold_accuracies <- pred_data %>% group_by(Resample) %>% summarise(Accuracy = round(mean(obs == pred), 4)) print(fold_accuracies)
这里的output$pred包含了交叉验证每一轮所有样本的预测细节,Resample列标记了样本属于哪个折,所以不管是整体还是单折的准确率都能轻松计算出来。
内容的提问来源于stack exchange,提问作者zesla
相关产品推荐
相关产品推荐

