Рассчитать AUC в R?
Учитывая вектор оценок и вектор фактических ярлыков классов, как вы вычисляете показатель AUC с одним номером для бинарного классификатора на языке R или просто на английском?
Страница 9 of "AUC: Лучшая мера..." , кажется, требует знания ярлыков классов, а вот пример в MATLAB, где я не понимаю
R(Actual == 1))
Поскольку R (не путать с R-языком) определяется вектор, но используется как функция?
Ответы
Ответ 1
Как уже упоминалось другими, вы можете вычислить AUC с помощью пакета ROCR. С пакетом ROCR вы также можете построить кривую ROC, кривую подъема и другие меры выбора модели.
Вы можете вычислить AUC напрямую, не используя какой-либо пакет, используя тот факт, что AUC равна вероятности того, что истинный положительный результат будет больше, чем истинный отрицательный.
Например, если pos.scores
- вектор, содержащий оценку положительных примеров, а neg.scores
- вектор, содержащий отрицательные примеры, то AUC приближается:
> mean(sample(pos.scores,1000,replace=T) > sample(neg.scores,1000,replace=T))
[1] 0.7261
даст приближение AUC. Вы также можете оценить дисперсию AUC путем начальной загрузки:
> aucs = replicate(1000,mean(sample(pos.scores,1000,replace=T) > sample(neg.scores,1000,replace=T)))
Ответ 2
Пакет ROCR рассчитает AUC среди других статистических данных:
auc.tmp <- performance(pred,"auc"); auc <- as.numeric([email protected])
Ответ 3
С пакетом pROC
вы можете использовать функцию auc()
, как этот пример, на странице справки:
> data(aSAH)
>
> # Syntax (response, predictor):
> auc(aSAH$outcome, aSAH$s100b)
Area under the curve: 0.7314
ссылка на pROC
Ответ 4
Без каких-либо дополнительных пакетов:
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]()
Ответ 5
Я нашел некоторые из решений здесь медленными и/или запутанными (и некоторые из них не обрабатывают связи правильно), поэтому я написал свою собственную функцию 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
Ответ 6
В соответствии с ответами erik вы также можете рассчитывать ROC напрямую, сравнивая все возможные пары значений из pos.scores и neg.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:: auc, но более стабилен, чем первый, и требует меньше установки, чем последний.
Связано: когда я попробовал это, он дал похожие результаты для значения pROC, но не совсем то же самое (выключено на 0,02 или около того); результат был ближе к примерному подходу с очень высоким N. Если у кого есть идеи, почему это может быть интересно?
Ответ 7
Обычно я использую функцию ROC из пакета DiagnosisMed. Мне нравится график, который он производит. AUC возвращается вместе с этим доверительным интервалом, и он также упоминается на графике.
ROC(classLabels,scores,Full=TRUE)
Ответ 8
Сочетание кода ISL 9.6.3 Кривые ROC, а также @J. Выиграл. ответ на этот вопрос и еще несколько мест, следующие графики кривой 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")
Это дает такой график:
![введите описание изображения здесь]()
Ответ 9
В настоящее время верхний проголосовавший ответ неверен, поскольку он игнорирует связи. Когда положительные и отрицательные оценки равны, тогда 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))
}