绘制自举插入符号模型的 ROC 曲线

Kes*_*v M 5 r r-caret

我有一个如下所示的模型:

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"
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

请指教。

谢谢!

mis*_*use 3

首先解释一下:

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

fitControl <-
  trainControl(
    method = "boot632",
    number = 10,
    classProbs = T,
    savePredictions = "final",
    summaryFunction = twoClassSummary
  )
Run Code Online (Sandbox Code Playgroud)

运行模型后:

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

感兴趣的结果在model$pred

在这里你可以检查每次重新采样测试了多少个样本(我设置了25次重复)

nrow(model$pred[model$pred$Resample == "Resample01",]) 
#83
Run Code Online (Sandbox Code Playgroud)

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

nrow(my_data) #208
Run Code Online (Sandbox Code Playgroud)

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

现在构建 ROC 曲线。您可以在此处选择多个选项:

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

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

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

我将向您展示第二种方法:

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

for_lift = data.frame(Class = model$pred$obs,  xgbTree = model$pred$R)
Run Code Online (Sandbox Code Playgroud)

绘制 ROC:

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

在此输入图像描述

您也可以使用 ggplot 来完成此操作,为此我发现使用插入符函数制作提升对象是最简单的lift

lift_obj = lift(Class ~ xgbTree, data = for_lift, class = "R")
Run Code Online (Sandbox Code Playgroud)

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

library(ggplot2)

ggplot(lift_obj$data)+
  geom_line(aes(1-Sp , Sn, color = liftModelVar))+
  scale_color_discrete(guide = guide_legend(title = "method"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述