2011-02-04 35 views
34

Đưa ra một vectơ điểm số và một vectơ của các nhãn lớp thực tế, làm cách nào để tính số liệu AUC số đơn cho một bộ phân loại nhị phân bằng ngôn ngữ R hoặc bằng tiếng Anh đơn giản?Tính AUC trong R?

Trang 9 của "AUC: a Better Measure..." dường như đòi hỏi biết nhãn lớp, và đây là an example in MATLAB mà tôi không hiểu

R(Actual == 1)) 

Bởi vì R (không nên nhầm lẫn với các ngôn ngữ R) được định nghĩa một vector nhưng được sử dụng như một chức năng?

+6

Đối với bất kỳ ai khác không biết, rõ ràng AUC là "Diện tích Dưới [Đường cong ROC] (http://en.wikipedia.org/wiki/Receiver_operating_characteristic) Đường cong" – Justin

Trả lời

29

Như đã đề cập bởi những người khác, bạn có thể tính AUC bằng gói ROCR. Với gói ROCR, bạn cũng có thể vẽ đường cong ROC, đường cong nâng và các phương pháp lựa chọn mô hình khác.

Bạn có thể tính trực tiếp AUC mà không sử dụng bất kỳ gói nào bằng cách sử dụng thực tế là AUC bằng với xác suất dương thực được ghi lớn hơn âm thực.

Ví dụ, nếu pos.scores là một vector chứa một số điểm trong những ví dụ tích cực, và neg.scores là một vector chứa các ví dụ tiêu cực thì AUC là xấp xỉ bởi:

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

sẽ đưa ra một xấp xỉ của AUC . Bạn cũng có thể ước lượng phương sai của AUC bởi bootstrapping:

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

Đối với dữ liệu thử nghiệm của tôi thiết lập giá trị nhân rộng của bạn là rất tương tự như @ jonw (là 0,8504, 0,850591 của bạn), ngoại trừ tôi không cần phải cài đặt pROC. Cảm ơn bạn – Andrew

+5

@Andrew @eric Đây là một câu trả lời khủng khiếp. Bạn * NOT * ước tính phương sai của AUC - bạn chỉ ước tính phương sai của quá trình lấy mẫu lại. Để thuyết phục bản thân, hãy thử thay đổi kích thước mẫu trong 'mẫu' ... chia cho 10, phương sai của bạn được nhân với 10. Nhân với 10 và phương sai của bạn được chia cho 10. Đây chắc chắn không phải là hành vi mong muốn để tính toán phương sai của AUC. – Calimo

+0

Ngoài ra câu trả lời nên lưu ý rằng ước tính là tốt như số lượng bản sao. Đi đến vô cùng và bạn nhận được AUC thực tế. – Calimo

32

The ROCR package sẽ tính toán AUC trong thống kê khác:

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

Tôi đã sử dụng ROCR để vẽ biểu đồ, nhưng tôi không thấy cách tính toán "chỉ số AUC số đơn" (từ câu hỏi gốc). – Andrew

+9

'auc.tmp <- hiệu suất (trước," auc "); auc <- as.numeric ([email protected]) ' – Itamar

26

Với gói pROC bạn có thể sử dụng chức năng auc() như ví dụ này từ trang trợ giúp:

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

link to pROC

1

Tôi thường sử dụng hàm ROC từ gói DiagnosisMed. Tôi thích đồ thị nó tạo ra. AUC được trả về cùng với khoảng tin cậy của nó và nó cũng được đề cập trên biểu đồ.

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

Kể từ ngày 20 tháng 7 năm 2016, liên kết này https://cran.r-project.org/web/packages/DiagnosisMed/index.html nói 'Gói' DiagnosisMed 'đã bị xóa khỏi kho CRAN.' – arun

+0

Tôi cũng xin lỗi. –

2

Dọc theo dòng phản ứng erik, bạn cũng sẽ có thể tính toán ROC trực tiếp bằng cách so sánh tất cả các cặp có thể có của các giá trị từ pos.scores và neg. điểm số:

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) 

Chắc chắn kém hiệu quả hơn so với phương pháp tiếp cận mẫu hoặc pROC :: auc, nhưng ổn định hơn so với cài đặt trước và yêu cầu ít cài đặt hơn.

Liên quan: khi tôi thử điều này, nó cho kết quả tương tự với giá trị của pROC, nhưng không chính xác như nhau (giảm 0,02 hoặc hơn); kết quả là gần gũi hơn với phương pháp tiếp cận mẫu với rất cao N. Nếu có ai có ý tưởng tại sao có thể tôi sẽ được quan tâm.

+3

Một nguồn không chính xác là đối phó với các mối quan hệ. Về mặt kỹ thuật, bạn nên xác suất rằng điểm số dương tính là lớn hơn số điểm âm + 1/2 * prob chúng bằng nhau. Nếu tất cả các điểm là duy nhất thì điều này sẽ không thành vấn đề. –

13

Nếu không có bất kỳ gói thêm:

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

Nếu bạn sao chép và dán mã này và nhận 'Lỗi trong plot.window (...): cần giá trị 'xlim' hữu hạn', có thể do nhãn của bạn là 0-1, trong khi @AGS đang sử dụng nhãn 1-2. – gentimouton

+1

Nó không cung cấp cho AUC đúng nếu hai quan sát có cùng xác suất và thứ tự quan sát không phải là ngẫu nhiên. Nếu không thì mã đẹp và nhanh. – MatthieuBizien

+0

Không biết tại sao giải pháp này không hoạt động trên dữ liệu của tôi, các probs của tôi không được chuẩn hóa trong phạm vi [0,1] –

1

Kết hợp mã từ ISL 9.6.3 ROC Curves, cùng với @J. Câu trả lời của Won cho câu hỏi này và một vài địa điểm khác, các ô sau đây vẽ đường cong ROC và in AUC ở góc dưới cùng bên phải trên ô.

Dưới đây probs là một vectơ số của các xác suất được dự đoán để phân loại nhị phân và test$label chứa các nhãn thực sự của dữ liệu thử nghiệm.

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") 

này đưa ra một cốt truyện như thế này:

enter image description here

3

Tôi tìm thấy một số trong những giải pháp ở đây là chậm và/hoặc khó hiểu (và một số trong số họ không xử lý các mối quan hệ một cách chính xác) để Tôi đã viết hàm data.table của riêng mình auc_roc() trong gói R mltools của tôi.

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

Giải pháp này nhanh hơn nhiều so với phương thức auc() trong gói pROC! phương thức auc() trong gói pROC là khá chậm nếu ta phải tính điểm auc cho bài toán hồi quy nhiều lớp hoặc nhiều hồi quy. –

1

Câu trả lời bình chọn hàng đầu hiện tại không chính xác vì nó bỏ qua quan hệ. Khi điểm số dương và âm bằng nhau, thì AUC phải là 0,5. Dưới đây là ví dụ đã sửa.

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)) 
} 
Các vấn đề liên quan