在caret中的交叉验证过程中计算模型校准?

3

第一次发帖,如有错误敬请谅解。

我在使用R中的caret包进行分类。我正在使用重复的10折交叉验证来拟合一些模型(GBM、线性SVM、NB、LDA)。使用自定义的trainControl,caret甚至为我提供了一整套模型性能指标,如ROC、Spec/sens、Kappa、Accuracy等。这真是太棒了。但是我还想要一个度量模型校准的指标。

我注意到caret中有一个函数,可以创建一个校准图,以估计模型在数据部分上性能的一致性。是否可以让caret在交叉验证模型构建过程中为每个测试折叠计算这个指标?或者它只能应用于我们正在进行预测的一些新保留数据上?

为了更好地理解,目前我的情况类似于:

fitControl <- trainControl(method = "repeatedcv", repeats=2, number = 10, classProbs = TRUE, summaryFunction = custom.summary)
gbmGrid <-  expand.grid(.interaction.depth = c(1,2,3),.n.trees = seq(100,800,by=100),.shrinkage = c(0.01))
gbmModel <- train(y= train_target, x = data.frame(t_train_predictors),
              method = "gbm",
              trControl = fitControl,
              tuneGrid = gbmGrid,
              verbose = FALSE)

如果有帮助的话,我使用了约25个数字预测器和N=2,200,在预测一个双分类因子。非常感谢您提前提供的任何帮助和建议。 Adam
1个回答

12

calibration函数接受任何给定的数据。您可以从train子对象pred中获取重新采样的值:

> set.seed(1)
> dat <- twoClassSim(2000)
> 
> set.seed(2)
> mod <- train(Class ~ ., data = dat, 
+              method = "lda",
+              trControl = trainControl(savePredictions = TRUE,
+                                       classProbs = TRUE))
> 
> str(mod$pred)
'data.frame':   18413 obs. of  7 variables:
 $ pred     : Factor w/ 2 levels "Class1","Class2": 1 2 2 1 1 2 1 1 2 1 ...
 $ obs      : Factor w/ 2 levels "Class1","Class2": 1 2 2 1 1 2 1 1 2 2 ...
 $ Class1   : num  0.631 0.018 0.138 0.686 0.926 ...
 $ Class2   : num  0.369 0.982 0.8616 0.3139 0.0744 ...
 $ rowIndex : int  1 3 4 10 12 13 18 22 25 27 ...
 $ parameter: Factor w/ 1 level "none": 1 1 1 1 1 1 1 1 1 1 ...
 $ Resample : chr  "Resample01" "Resample01" "Resample01" "Resample01" ...

那么你可以使用:

> cal <- calibration(obs ~ Class1, data = mod$pred)
> xyplot(cal)

请记住,对于许多重采样方法,单个训练集实例将被多次保留:

> table(table(mod$pred$rowIndex))

  2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17 
  2  11  30  77 135 209 332 314 307 231 185  93  48  16   6   4 
你可以平均每个rowIndex的类别概率,如果你愿意的话。
最大

哦,谢谢!这正是我想的 - 感谢您提供的解决方案。我想为您的解决方案投票,但我还没有声望。再次感谢您的帮助和出色的软件包,Max。 - Achekroud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接