Разница в среднем расчете AUC с использованием ROCR и pROC (R)

Я работаю с данными перекрестной проверки (10-кратное повторение 5 раз) из модели SVM-RFE, созданной с помощью caret пакет. я знаю это caret пакет работает с pROC пакет при вычислении показателей, но мне нужно использовать ROCR пакет для получения среднего РПЦ. Однако я заметил, что средние значения 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 ответ

Решение

По умолчанию roc Функция в pROC пытается определить, каков уровень реакции контроля и наблюдений за случаями (вы переопределяете значения по умолчанию, устанавливая levels аргумент) и должны ли элементы управления иметь более высокие или более низкие значения, чем случаи. Вы не использовали direction аргумент, чтобы установить последний.

При повторной выборке данных это автоопределение будет происходить для каждой выборки. И если размер вашей выборки низкий или ваш AUC близок к 0,5, это может произойти и произойдет, что некоторые кривые ROC будут сгенерированы в противоположном направлении, смещая ваше среднее значение к более высоким значениям.

Поэтому вы всегда должны устанавливать direction явный аргумент при повторной выборке кривых ROC или аналогичных, например:

rocCurve <- roc(response = labels_NG3[[i]],
                predictor = predictions_NG3[[i]],
                direction = "<",
                levels = c("BREAST","LUNG")) 
Другие вопросы по тегам