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

Raf*_* OR 3 r roc auc r-caret proc-r-package

我正在使用由caret软件包生成的SVM-RFE模型处理交叉验证数据(重复10倍,重复5次)。我知道该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)
Run Code Online (Sandbox Code Playgroud)

结果略有不同:

  auc_mean_pROC auc_sd_pROC auc_mean_ROCR auc_sd_ROCR
1     0.8755556   0.1524801     0.8488889   0.2072751
Run Code Online (Sandbox Code Playgroud)

我注意到,平均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
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用其他SVM-RFE模型,但是问题仍然存在。为什么会这样呢?难道我做错了什么?

Cal*_*imo 5

默认情况下,rocpROC中的函数尝试检测控件和案例观察的响应级别是什么(您可以通过设置levels参数来覆盖默认值)以及控件的值应比案例的高还是低。您尚未使用direction参数来设置后者。

当您对数据进行重新采样时,将对每个采样进行自动检测。而且,如果样本量较小或AUC接近0.5,则可能会发生某些ROC曲线以相反的方向生成,从而使平均值偏向更高的值。

因此,direction当您对ROC曲线或类似曲线重新采样时,您应该始终显式设置参数,例如:

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