【问题标题】:Plot ROC curve for bootstrapped caret model绘制自举插入符号模型的 ROC 曲线
【发布时间】:2018-07-06 16:25:13
【问题描述】:

我有一个类似下面的模型:

library(mlbench)
data(Sonar)

library(caret)
set.seed(998)

my_data <- Sonar

fitControl <-
  trainControl(
    method = "boot632",
    number = 10,
    classProbs = T,
    savePredictions = T,
    summaryFunction = twoClassSummary
  )


model <- train(
  Class ~ .,
  data = my_data,
  method = "xgbTree",
  trControl = fitControl,
  metric = "ROC"
)

如何绘制此模型的 ROC 曲线?据我了解,必须保存概率(我在 trainControl 中做过),但是由于引导程序使用随机抽样来生成“测试”集,我不确定插入符号如何计算 ROC 值以及如何生成曲线。

为了隔离最佳性能参数的类概率,我正在这样做:

for (a in 1:length(model$bestTune))       
{model$pred <-
        model$pred[model$pred[, paste(colnames(model$bestTune)[a])] == model$bestTune[1, a], ]}

请指教。

谢谢!

【问题讨论】:

    标签: r r-caret


    【解决方案1】:

    先解释一下:

    如果您不打算检查每个重新采样中每个样本的每个可能的超参数组合如何预测,您可以在trainControl 中设置savePredictions = "final" 以节省空间:

    fitControl <-
      trainControl(
        method = "boot632",
        number = 10,
        classProbs = T,
        savePredictions = "final",
        summaryFunction = twoClassSummary
      )
    

    运行模型后:

    model <- train(
      Class ~ .,
      data = my_data,
      method = "xgbTree",
      trControl = fitControl,
      metric = "ROC"
    )
    

    感兴趣的结果在model$pred

    在这里你可以查看每个re-sample中测试了多少个样本(我设置了25次重复)

    nrow(model$pred[model$pred$Resample == "Resample01",]) 
    #83
    

    插入符号始终提供模型构建中未使用的行的预测。

    nrow(my_data) #208
    

    83/208 对boot632 的测试样本有意义

    现在构建 ROC 曲线。您可以在这里选择几个选项:

    -平均每个样本的概率并使用它(这对于 CV 来说很常见,因为所有样本都重复了相同的次数,但也可以通过 boot 完成)。

    -按原样绘制所有内容,不进行平均

    -绘制每个重新采样的 ROC。

    我会告诉你第二种方法:

    创建类别概率和真实结果的数据框:

    for_lift = data.frame(Class = model$pred$obs,  xgbTree = model$pred$R)
    

    绘制 ROC:

    pROC::plot.roc(pROC::roc(response = for_lift$Class,
                             predictor = for_lift$xgbTree,
                             levels = c("M", "R")),
               lwd=1.5) 
    

    您也可以使用 ggplot 执行此操作,这样做我发现使用插入符号函数 lift 制作升降对象最简单

    lift_obj = lift(Class ~ xgbTree, data = for_lift, class = "R")
    

    指定使用哪个类的概率^。

    library(ggplot2)
    
    ggplot(lift_obj$data)+
      geom_line(aes(1-Sp , Sn, color = liftModelVar))+
      scale_color_discrete(guide = guide_legend(title = "method"))
    

    【讨论】:

    • 谢谢!是否可以减少每个重采样的“测试”集?在这个例子中,它大约是 40%,但在我的实际数据集中要小得多,40% 会太高。
    • 使用“boot632”时不能减少(它使用 arround 63% 用于训练,其余用于测试)但如果您使用“cv”,例如设置number = 10,则可以减少method = cv 你将执行 10 倍交叉验证,其中 90% 的数据用于模型构建,10% 用于评估。
    • 我喜欢 boot632 的随机选择方面,这就是我选择它的原因。是否可以在每次重新采样时随机分配 cv 上的折叠?
    • 您可以手动指定将在每次迭代中执行训练和测试的索引检查 ?trainControl 和 index/IndexOut 参数
    • @missuse 在 ggplot2 图上注释 AUC 值的最简单方法是什么?谢谢!
    猜你喜欢
    • 2020-05-05
    • 2019-03-08
    • 1970-01-01
    • 2012-07-29
    • 2016-02-04
    • 2015-09-17
    • 2019-02-27
    • 2020-09-01
    • 2021-03-03
    相关资源
    最近更新 更多