使用ROCR和pROC(R)计算平均AUC的差异

3
我正在处理使用 SVM-RFE 模型生成的交叉验证数据(10倍重复 5 次),该模型使用 caret 包。我知道在计算指标时,caret 包与 pROC 包一起使用,但我需要使用 ROCR 包来获取平均 ROC。然而,当我使用每个包时,注意到平均 AUC 值不同,因此我不确定是否应该无差别地使用这两个包。
证明的代码如下:
predictions_NG3<-list()
labels_NG3<-list()

optSize <- svmRFE_NG3$optsize

resamples<-(split(svmRFE_NG3$pred,svmRFE_NG3$pred$Variables))
resamplesFOLD<-(split(resamples[[optSize]],resamples[[optSize]]$Resample))

auc_pROC <- vector()
auc_ROCR <- vector()

for (i in 1:50){
  predictions_NG3[[i]]<-resamplesFOLD[[i]]$LUNG
  labels_NG3[[i]]<-resamplesFOLD[[i]]$obs

  #WITH pROC
  rocCurve <- roc(response = labels_NG3[[i]],
                  predictor = predictions_NG3[[i]],
                  levels = c("BREAST","LUNG")) #LUNG POSITIVE

  auc_pROC <- c(auc_pROC,auc(rocCurve))

  #WITH ROCR
  pred_ROCR <- prediction(predictions_NG3[[i]], labels_NG3[[i]],
                          label.ordering = c("BREAST","LUNG")) #LUNG POSITIVE

  auc_ROCR <- c(auc_ROCR,performance(pred_ROCR,"auc")@y.values[[1]])

}

auc_mean_pROC <- mean(auc_pROC)
auc_sd_pROC <- sd(auc_pROC)
auc_mean_ROCR <- mean(auc_ROCR)
auc_sd_ROCR <- sd(auc_ROCR)

结果略有不同:
  auc_mean_pROC auc_sd_pROC auc_mean_ROCR auc_sd_ROCR
1     0.8755556   0.1524801     0.8488889   0.2072751

我注意到在很多情况下,平均AUC计算给出的结果是不同的,比如在[5][22][25]中:

> auc_pROC
 [1] 0.8333333 0.8333333 1.0000000 1.0000000 0.6666667 0.8333333 0.3333333 0.8333333 1.0000000 1.0000000 1.0000000 1.0000000
[13] 0.8333333 0.5000000 0.8888889 1.0000000 1.0000000 1.0000000 0.8333333 0.8333333 0.8333333 0.6666667 0.6666667 0.8888889
[25] 0.8333333 0.6666667 1.0000000 0.6666667 1.0000000 0.6666667 1.0000000 1.0000000 0.8333333 0.8333333 0.8333333 1.0000000
[37] 0.8333333 1.0000000 0.8333333 1.0000000 0.8333333 1.0000000 1.0000000 0.6666667 1.0000000 1.0000000 1.0000000 1.0000000
[49] 1.0000000 1.0000000
> auc_ROCR
 [1] 0.8333333 0.8333333 1.0000000 1.0000000 0.3333333 0.8333333 0.3333333 0.8333333 1.0000000 1.0000000 1.0000000 1.0000000
[13] 0.8333333 0.5000000 0.8888889 1.0000000 1.0000000 1.0000000 0.8333333 0.8333333 0.8333333 0.3333333 0.6666667 0.8888889
[25] 0.1666667 0.6666667 1.0000000 0.6666667 1.0000000 0.6666667 1.0000000 1.0000000 0.8333333 0.8333333 0.8333333 1.0000000
[37] 0.8333333 1.0000000 0.8333333 1.0000000 0.8333333 1.0000000 1.0000000 0.6666667 1.0000000 1.0000000 1.0000000 1.0000000
[49] 1.0000000 1.0000000

我尝试使用其他SVM-RFE模型,但问题仍然存在。为什么会出现这种情况?我有做错什么吗?

1个回答

5

默认情况下,pROC 中的 roc 函数会尝试检测控制组和实验组观察结果的响应水平(您可以通过设置 levels 参数来覆盖默认设置),以及是否应该使控制组高于或低于实验组。您没有使用 direction 参数来设置后者。

当重新取样数据时,每个样本都会发生自动检测。如果您的样本量较小,或您的 AUC 接近 0.5,将会出现一些 ROC 曲线方向相反的情况,这会导致您的平均值偏向更高的值。

因此,无论何时重新取样 ROC 曲线或类似曲线,您都应该明确设置 direction 参数,例如:

rocCurve <- roc(response = labels_NG3[[i]],
                predictor = predictions_NG3[[i]],
                direction = "<",
                levels = c("BREAST","LUNG")) 

1
谢谢!你的解决方案很有效! 你知道在使用caret包计算SVM-RFE模型时,是否有办法设置direction参数吗?因为rfe函数自动计算的平均AUC值是错误的。 - Rafa OR

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