Разница в среднем расчете 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"))