You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在caret中实现分层Bootstrap重采样,解决嵌套CV性能指标缺失警告

解决caret中Bootstrap重采样缺失类别导致的性能指标NA问题

一、实现分层Bootstrap确保每个重采样包含所有目标类别

你可以通过自定义分层Bootstrap重采样方法彻底解决这个问题,利用CreateDataPartition的分层抽样能力,保证每次重采样的训练/测试集都包含所有目标类别:

  1. 编写自定义分层Bootstrap生成函数:
stratified_bootstrap <- function(data, times = 500, p = 0.632, ...) {
  y <- data[[ncol(data)]] # 获取目标变量列
  # 循环生成times次分层抽样索引
  indices <- lapply(1:times, function(i) {
    CreateDataPartition(y, p = p, list = FALSE, times = 1)
  })
  # 转换为caret要求的重采样结构(train/test索引对)
  out <- lapply(indices, function(idx) {
    list(train = idx, test = setdiff(1:nrow(data), idx))
  })
  names(out) <- paste0("Bootstrap", 1:times)
  class(out) <- c("boot", "resample") # 指定caret识别的类
  out
}
  1. 在训练控制中使用该自定义方法:
ctrl <- trainControl(
  method = "boot",
  number = 500,
  resample = stratified_bootstrap, # 绑定自定义重采样函数
  savePredictions = TRUE,
  classProbs = TRUE # 若需计算ROC等概率类指标必须开启
)

# 训练模型时传入控制参数
knn_model <- train(
  x = your_predictors,
  y = your_response,
  method = "knn",
  trControl = ctrl,
  tuneLength = 5 # 其他模型参数按需调整
)

这种方式会强制按类别比例抽样,避免测试集中出现类别缺失,从根源上消除敏感性、ROC指标的NA问题。

二、若已出现NA值,如何处理模型性能对比

如果已经生成含NA的重采样结果,或无法使用分层Bootstrap,可通过以下方式处理:

  • 过滤无效重采样:直接剔除包含NA的重采样记录,基于有效结果计算性能:
# 提取模型重采样性能数据
perf_data <- knn_model$resample
# 移除含NA的行
valid_perf <- na.omit(perf_data)
# 计算平均性能
avg_performance <- colMeans(valid_perf)
  • 合理填充NA值:根据指标含义替换NA:

    • 若测试集缺失某类别,敏感性(Sensitivity)可设为0(无该类样本则无法正确识别);
    • ROC类指标若因类别缺失无法计算,可采用该模型其他有效重采样的ROC均值填充,或直接排除该重采样。
  • 更换鲁棒性指标:选用不受单一类别缺失影响的指标,比如Kappa系数、准确率(Accuracy),或使用精确率-召回率相关指标(通过summaryFunction = prSummary在trainControl中设置),这类指标在类别不平衡场景下稳定性更强。

内容的提问来源于stack exchange,提问作者amr95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:45:46