2011-02-04 3 views
34

Учитывая вектор оценок и вектор фактических ярлыков классов, как вы вычисляете показатель AUC с одним номером для бинарного классификатора на языке R или просто на английском?Рассчитать AUC в R?

Страница 9 из "AUC: a Better Measure...", кажется, требует знания метки класса, а вот an example in MATLAB где я не понимаю

R(Actual == 1)) 

Поскольку R (не следует путать с языком R) определяется вектор, но используется как функция?

+6

Для кого-то, кто не знает, по-видимому, ППК является «площадь под [рабочей характеристики приемника] (http://en.wikipedia.org/wiki/Receiver_operating_characteristic) Кривая» – Justin

ответ

29

Как уже отмечалось другими, вы можете вычислить АУК с помощью ROCR пакета. С пакетом ROCR вы также можете построить кривую ROC, кривую подъема и другие меры выбора модели.

Вы можете вычислить AUC напрямую, не используя какой-либо пакет, используя тот факт, что AUC равно вероятности того, что истинный положительный результат будет больше, чем истинный отрицательный.

Например, если pos.scores представляет собой вектор, содержащий оценку положительных примеров, и neg.scores представляет собой вектор, содержащий отрицательные примеры, то АУК аппроксимируется:

> mean(sample(pos.scores,1000,replace=T) > sample(neg.scores,1000,replace=T)) 
[1] 0.7261 

даст приближение AUC , Вы также можете оценить дисперсию ППК бутстрапом:

> aucs = replicate(1000,mean(sample(pos.scores,1000,replace=T) > sample(neg.scores,1000,replace=T))) 
+0

Для моих тестовых данных ваше реплицированное значение очень похоже на @ jonw's (0.8504, ваш 0.850591), за исключением того, что мне не нужно устанавливать pROC. Спасибо – Andrew

+5

@Andrew @eric Это ужасный ответ. Вы * НЕ * оцениваете дисперсию AUC - вы оцениваете только дисперсию процесса повторной дискретизации. Чтобы убедить себя, попробуйте изменить размер выборки в 'sample' ... разделите его на 10, ваша дисперсия умножается на 10. Умножьте его на 10, а ваша дисперсия делится на 10. Это, конечно, не является желаемым поведением для вычисления дисперсии AUC. – Calimo

+0

Кроме того, ответ должен учитывать, что оценка не хуже числа повторений. Идите в бесконечность, и вы получите фактическую AUC. – Calimo

32

The ROCR package рассчитает АУК среди других статистических данных:

auc.tmp <- performance(pred,"auc"); auc <- as.numeric([email protected]) 
+0

Я использовал ROCR для построения производительности, но я не вижу, как он вычисляет «показатель AUC с одним номером» (из исходного вопроса). – Andrew

+9

'auc.tmp <- performance (pred," auc "); auc <- as.numeric ([email protected]) ' – Itamar

26

С пакетом pROC вы можете использовать функцию auc() как в этом примере со страницы справки:

> data(aSAH) 
> 
> # Syntax (response, predictor): 
> auc(aSAH$outcome, aSAH$s100b) 
Area under the curve: 0.7314 

link to pROC

1

Обычно я использую функцию ROC из пакета DiagnosisMed. Мне нравится график, который он производит. AUC возвращается вместе с его доверительным интервалом, и он также упоминается на графике.

ROC(classLabels,scores,Full=TRUE) 
+1

По состоянию на 20 июля 2016 года эта ссылка https://cran.r-project.org/web/packages/DiagnosisMed/index.html говорит, что« Пакет » DiagnosisMed 'был удален из хранилища CRAN. – arun

+0

Мне тоже было жаль. –

2

Вдоль линий связи Erik, вы также должны быть в состоянии вычислить РПЦ непосредственно путем сравнения всех возможных пар значений из pos.scores и нег. Счет:

score.pairs <- merge(pos.scores, neg.scores) 
names(score.pairs) <- c("pos.score", "neg.score") 
sum(score.pairs$pos.score > score.pairs$neg.score)/nrow(score.pairs) 

Конечно менее эффективный, чем подход образца или Proc :: АУК, но более стабильный, чем первый, и требует меньше установки, чем последняя.

Относительно: когда я попробовал это, он дал аналогичные результаты для значения pROC, но не совсем то же самое (выключено на 0,02 или около того); результат был ближе к примерному подходу с очень высоким N. Если у кого-то есть идеи, почему это может быть интересно.

+3

Один источник неточности - дело со связями. Технически вы должны принять вероятность того, что положительный случайный балл будет строго больше отрицательной оценки + 1/2 * prob, если они равны. Если все баллы уникальны, это не будет проблемой. –

13

Без каких-либо дополнительных пакетов:

true_Y = c(1,1,1,1,2,1,2,1,2,2) 
probs = c(1,0.999,0.999,0.973,0.568,0.421,0.382,0.377,0.146,0.11) 

getROC_AUC = function(probs, true_Y){ 
    probsSort = sort(probs, decreasing = TRUE, index.return = TRUE) 
    val = unlist(probsSort$x) 
    idx = unlist(probsSort$ix) 

    roc_y = true_Y[idx]; 
    stack_x = cumsum(roc_y == 2)/sum(roc_y == 2) 
    stack_y = cumsum(roc_y == 1)/sum(roc_y == 1)  

    auc = sum((stack_x[2:length(roc_y)]-stack_x[1:length(roc_y)-1])*stack_y[2:length(roc_y)]) 
    return(list(stack_x=stack_x, stack_y=stack_y, auc=auc)) 
} 

aList = getROC_AUC(probs, true_Y) 

stack_x = unlist(aList$stack_x) 
stack_y = unlist(aList$stack_y) 
auc = unlist(aList$auc) 

plot(stack_x, stack_y, type = "l", col = "blue", xlab = "False Positive Rate", ylab = "True Positive Rate", main = "ROC") 
axis(1, seq(0.0,1.0,0.1)) 
axis(2, seq(0.0,1.0,0.1)) 
abline(h=seq(0.0,1.0,0.1), v=seq(0.0,1.0,0.1), col="gray", lty=3) 
legend(0.7, 0.3, sprintf("%3.3f",auc), lty=c(1,1), lwd=c(2.5,2.5), col="blue", title = "AUC") 

enter image description here

+0

Если вы скопируете этот код и получите «Ошибка в plot.window (...): нужны конечные значения« xlim », вероятно, потому, что ваши метки 0-1, а @AGS использует метки 1-2. – gentimouton

+1

Это не дает истинного AUC, если два наблюдения имеют одинаковую вероятность и порядок наблюдения не является случайным. В противном случае хороший и быстрый код. – MatthieuBizien

+0

Не знаю, почему это решение не работает с моими данными, мои проблемы не нормализованы в пределах [0,1] –

1

Объединяя код из ISL 9.6.3 ROC Curves, наряду с @J. Ответ Won на этот вопрос и еще несколько мест, следующие графики кривой ROC и печатает AUC в нижней правой части графика.

Ниже probs представляет собой числовой вектор прогнозируемых вероятностей для двоичной классификации и test$label содержит истинные метки тестовых данных.

require(ROCR) 
require(pROC) 

rocplot <- function(pred, truth, ...) { 
    predob = prediction(pred, truth) 
    perf = performance(predob, "tpr", "fpr") 
    plot(perf, ...) 
    area <- auc(truth, pred) 
    area <- format(round(area, 4), nsmall = 4) 
    text(x=0.8, y=0.1, labels = paste("AUC =", area)) 

    # the reference x=y line 
    segments(x0=0, y0=0, x1=1, y1=1, col="gray", lty=2) 
} 

rocplot(probs, test$label, col="blue") 

Это дает сюжет так:

enter image description here

3

Я нашел некоторые из решений здесь быть медленным и/или сбивает с толку (и некоторые из них не поддерживают связей правильно) так Я написал свою собственную data.table функцию auc_roc() в моем пакете R mltools.

library(data.table) 
library(mltools) 

preds <- c(.1, .3, .3, .9) 
actuals <- c(0, 0, 1, 1) 

auc_roc(preds, actuals) # 0.875 

auc_roc(preds, actuals, returnDT=TRUE) 
    Pred CountFalse CountTrue CumulativeFPR CumulativeTPR AdditionalArea CumulativeArea 
1: 0.9   0   1   0.0   0.5   0.000   0.000 
2: 0.3   1   1   0.5   1.0   0.375   0.375 
3: 0.1   1   0   1.0   1.0   0.500   0.875 
+1

Это решение намного быстрее, чем метод auc() в пакете pROC! Метод auc() в пакете pROC довольно медленный, если нужно вычислить оценки auc для многоуровневой или множественной проблемы регрессии вывода. –

1

В настоящее время верхний проголосовавший ответ неверен, поскольку он игнорирует связи. Когда положительные и отрицательные оценки равны, тогда AUC должно быть 0,5. Ниже приведен пример с исправлением.

computeAUC <- function(pos.scores, neg.scores, n_sample=100000) { 
    # Args: 
    # pos.scores: scores of positive observations 
    # neg.scores: scores of negative observations 
    # n_samples : number of samples to approximate AUC 

    pos.sample <- sample(pos.scores, n_sample, replace=T) 
    neg.sample <- sample(neg.scores, n_sample, replace=T) 
    mean(1.0*(pos.sample > neg.sample) + 0.5*(pos.sample==neg.sample)) 
} 
Смежные вопросы