2012-07-13 33 views
21

Có thể ai đó giải thích cho tôi xin vui lòng làm thế nào để vẽ một đường cong ROC với ROCR. Tôi biết rằng tôi lần đầu tiên nên chạy:Đường cong ROC trong R sử dụng gói ROCR

prediction(predictions, labels, label.ordering = NULL) 

và sau đó:

performance(prediction.obj, measure, x.measure="cutoff", ...) 

Tôi chỉ không rõ ràng có nghĩa là gì với dự đoán và nhãn. Tôi tạo ra một mô hình với ctree và cforest và tôi muốn các đường cong ROC cho cả hai người trong số họ để so sánh nó ở cuối. Trong trường hợp của tôi thuộc tính lớp là y_n, mà tôi cho rằng nên được sử dụng cho các nhãn. Nhưng còn những dự đoán thì sao? Dưới đây là các bước của những gì tôi làm (dataset name = bank_part):

pred<-cforest(y_n~.,bank_part) 
tablebank<-table(predict(pred),bank_part$y_n) 
prediction(tablebank, bank_part$y_n) 

Sau khi chạy dòng cuối cùng tôi nhận được lỗi này:

Error in prediction(tablebank, bank_part$y_n) : 
Number of cross-validation runs must be equal for predictions and labels. 

Cảm ơn trước!

Dưới đây là một ví dụ khác: Tôi có bộ dữ liệu huấn luyện (bank_training) và kiểm tra dữ liệu (bank_testing) và tôi chạy một randomForest như sau:

bankrf<-randomForest(y~., bank_training, mtry=4, ntree=2,  
keep.forest=TRUE,importance=TRUE) 
bankrf.pred<-predict(bankrf, bank_testing, type='response') 

Bây giờ bankrf.pred là một đối tượng yếu tố với các nhãn c = ("0", "1"). Tuy nhiên, tôi không biết làm thế nào để vẽ ROC, khiến tôi bị kẹt vào phần dự đoán. Dưới đây là những gì tôi làm

library(ROCR) 
pred<-prediction(bankrf.pred$y, bank_testing$c(0,1) 

Nhưng điều này vẫn không chính xác, vì tôi nhận được thông báo lỗi

Error in bankrf.pred$y_n : $ operator is invalid for atomic vectors 
+5

Nếu bạn đã cung cấp một ví dụ hoàn toàn được thổi, bạn có thể có được đối tượng rộng hơn có thể giúp bạn. Xem http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example để biết một số mẹo về cách thực hiện điều đó. –

Trả lời

23

Các dự đoán này dự đoán liên tục của bạn phân loại, nhãn là sự thật nhị phân cho mỗi biến.

Vì vậy, một cái gì đó như sau nên làm việc:

> pred <- prediction(c(0.1,.5,.3,.8,.9,.4,.9,.5), c(0,0,0,1,1,1,1,1)) 
> perf <- performance(pred, "tpr", "fpr") 
> plot(perf) 

để tạo ra một ROC.

EDIT: Có thể hữu ích khi bạn bao gồm mã có thể tái sản xuất mẫu trong câu hỏi (Tôi đang gặp khó khăn trong việc đưa ra nhận xét của bạn).

Không có mã mới ở đây, nhưng ... đây là một chức năng tôi sử dụng khá thường xuyên vì âm mưu một ROC:

plotROC <- function(truth, predicted, ...){ 
    pred <- prediction(abs(predicted), truth)  
    perf <- performance(pred,"tpr","fpr") 

    plot(perf, ...) 
} 
+0

[sửa] Tôi vẫn không hiểu. Dưới đây là một ví dụ khác: Tôi có tập dữ liệu đào tạo (bank_training) và bộ dữ liệu thử nghiệm (bank_testing) và tôi đã chạy randomForest như sau: bankrf <-randomForest (y ~., Bank_training, mtry = 4, ntree = 2, keep .forest = TRUE, tầm quan trọng = TRUE) bankrf.pred <-predict (bankrf, bank_testing) thư viện (ROCR) trước <-prediction (bankrf.pred $ y, bank_testing $ y) Nhưng điều này vẫn không đúng, vì tôi nhận được thông báo lỗi có lỗi trong định dạng dự đoán. – spektra

0

Vấn đề có thể mà bạn muốn chạy các chức năng dự đoán trên nhiều chạy cho ví dụ để xác thực chéo.

Trong trường hợp này để dự đoán (dự đoán, nhãn, nhãn.ordering = NULL) hoạt động, lớp của các biến "dự đoán" và "nhãn" phải là danh sách hoặc ma trận.

7

Giống như @Jeff cho biết, dự đoán của bạn cần phải liên tục cho chức năng prediction của ROCR. require(randomForest); ?predict.randomForest cho thấy rằng, theo mặc định, predict.randomForest trả về một dự đoán trên quy mô ban đầu (nhãn lớp, trong phân loại), trong khi predict.randomForest(..., type = 'prob') trả về xác suất của mỗi lớp.Vì vậy:

require(ROCR) 
data(iris) 
iris$setosa <- factor(1*(iris$Species == 'setosa')) 
iris.rf <- randomForest(setosa ~ ., data=iris[,-5]) 
summary(predict(iris.rf, iris[,-5])) 
summary(iris.preds <- predict(iris.rf, iris[,-5], type = 'prob')) 
preds <- iris.preds[,2] 
plot(performance(prediction(preds, iris$setosa), 'tpr', 'fpr')) 

cung cấp cho bạn những gì bạn muốn. Các gói phân loại khác nhau yêu cầu các lệnh khác nhau để có được xác suất dự đoán - đôi khi nó là predict(..., type='probs'), predict(..., type='prob')[,2], v.v., vì vậy chỉ cần kiểm tra các tệp trợ giúp cho từng chức năng bạn đang gọi.

1

Vấn đề là, như được chỉ ra bởi những người khác, dự đoán trong ROCR mong đợi các giá trị số. Nếu bạn đang chèn dự đoán từ randomForest (làm đối số đầu tiên vào dự đoán trong ROCR), dự đoán đó cần được tạo bởi type='prob' thay vì type='response', là mặc định. Ngoài ra, bạn có thể lấy kết quả type='response' và chuyển đổi thành số (nghĩa là, nếu câu trả lời của bạn là 0/1). Nhưng khi bạn vẽ nó, ROCR tạo ra một điểm có ý nghĩa duy nhất trên đường cong ROC. Để có nhiều điểm trên đường cong ROC, bạn thực sự cần xác suất được kết hợp với từng dự đoán - tức là sử dụng type='prob' khi tạo dự đoán.

4

Đây là cách bạn có thể làm điều đó:

có dữ liệu của chúng tôi trong một tập tin csv, ("data_file.csv") nhưng bạn có thể cần phải cung cấp đường dẫn đầy đủ ở đây. Trong tệp đó có tiêu đề cột, ở đây tôi sẽ sử dụng "default_flag", "var1", "var2", "var3", trong đó default_flag là 0 hoặc 1 và các biến khác có bất kỳ giá trị nào. Mã R:

rm(list=ls()) 
df <- read.csv("data_file.csv") #use the full path if needed 
mylogit <- glm(default_flag ~ var1 + var2 + var3, family = "binomial" , data = df) 

summary(mylogit) 
library(ROCR) 

df$score<-predict.glm(mylogit, type="response") 
pred<-prediction(df$score,df$default_flag) 
perf<-performance(pred,"tpr", "fpr") 
plot(perf) 
auc<- performance(pred,"auc") 
auc 

Lưu ý rằng điểm df $ sẽ cho bạn xác suất mặc định. Trong trường hợp bạn muốn sử dụng logit này (cùng hệ số hồi quy) để kiểm tra trong dữ liệu khác df2 đặt ra cho kiểm chứng chéo, sử dụng

df2 <- read.csv("data_file2.csv") 

df2$score<-predict.glm(mylogit,newdata=df2, type="response") 

pred<-prediction(df2$score,df2$default_flag) 
perf<-performance(pred,"tpr", "fpr") 
plot(perf) 
auc<- performance(pred,"auc") 
auc 
0

Hãy thử điều này một:

library(ROCR) pred<-ROCR::prediction(bankrf.pred$y, bank_testing$c(0,1)

Dự đoán chức năng là hiện tại là nhiều gói. Bạn nên xác định rõ ràng (ROCR: :) để sử dụng một trong ROCR. Cái này làm việc cho tôi.

Các vấn đề liên quan