2015-06-30 14 views
15

Sử dụng dấu mũ gói R, làm cách nào tôi có thể tạo đường cong ROC dựa trên kết quả xác thực chéo của hàm train()?Đường cong ROC từ dữ liệu huấn luyện trong dấu mũ

Nói, tôi làm như sau:

chức năng
data(Sonar) 
ctrl <- trainControl(method="cv", 
    summaryFunction=twoClassSummary, 
    classProbs=T) 
rfFit <- train(Class ~ ., data=Sonar, 
    method="rf", preProc=c("center", "scale"), 
    trControl=ctrl) 

Việc đào tạo đi qua một loạt các thông số mtry và tính toán các ROC AUC. Tôi muốn xem đường cong ROC liên quan - làm cách nào để làm điều đó?

Lưu ý: nếu phương pháp được sử dụng để lấy mẫu là LOOCV, thì rfFit sẽ chứa khung dữ liệu không trống trong khe rfFit$pred, dường như chính xác những gì tôi cần. Tuy nhiên, tôi cần điều đó cho phương thức "cv" (xác nhận k-fold) thay vì LOO.

Ngoài ra: không, roc chức năng được sử dụng để bao gồm trong phiên bản cũ của dấu mũ không phải là câu trả lời - đây là chức năng cấp thấp, bạn không thể sử dụng nó nếu bạn không có khả năng dự đoán cho mỗi mẫu được xác thực chéo.

+0

http://www.inside-r.org/packages/cran/caret/docs/roc – Frash

+0

Không, đây không phải là câu trả lời. Đầu tiên, phiên bản hiện đại của dấu mũ không có chức năng. Thứ hai, hàm cần một "biến để cắt dọc" - cụ thể là các xác suất dự đoán, nhưng làm thế nào để tôi nhận được các hàm này từ đối tượng được hàm train() trả về? – January

Trả lời

22

Có chỉ là savePredictions = TRUE lập luận thiếu từ ctrl (điều này cũng làm việc cho các phương pháp lấy mẫu khác):

library(caret) 
library(mlbench) 
data(Sonar) 
ctrl <- trainControl(method="cv", 
        summaryFunction=twoClassSummary, 
        classProbs=T, 
        savePredictions = T) 
rfFit <- train(Class ~ ., data=Sonar, 
       method="rf", preProc=c("center", "scale"), 
       trControl=ctrl) 
library(pROC) 
# Select a parameter setting 
selectedIndices <- rfFit$pred$mtry == 2 
# Plot: 
plot.roc(rfFit$pred$obs[selectedIndices], 
     rfFit$pred$M[selectedIndices]) 

ROC

lẽ tôi đang thiếu một cái gì đó, nhưng một mối quan tâm nhỏ là train luôn là ước tính các giá trị AUC hơi khác so với plot.rocpROC::auc (chênh lệch tuyệt đối < 0,005), mặc dù twoClassSummary sử dụng pROC::auc để ước tính AUC. Chỉnh sửa: Tôi giả định điều này xảy ra vì ROC từ train là mức trung bình của AUC sử dụng các bộ CV riêng biệt và ở đây chúng tôi tính AUC trên tất cả các mẫu đồng thời để có được AUC tổng thể.

Cập nhật Vì đây là nhận được một chút của sự chú ý, đây là một giải pháp sử dụng plotROC::geom_roc() cho ggplot2:

library(ggplot2) 
library(plotROC) 
ggplot(rfFit$pred[selectedIndices, ], 
     aes(m = M, d = factor(obs, levels = c("R", "M")))) + 
    geom_roc(hjust = -0.4, vjust = 1.5) + coord_equal() 

ggplot_roc

+4

Nhận xét của bạn về tính trung bình nhiều AUC so với số được tạo ra từ các mẫu OOB là chính xác. Chúng sẽ hơi khác một chút. – topepo

+0

có thể trích xuất finalModel mtry với 'rfFit $ finalModel $ mtry' –

8

Ở đây, tôi đang thay đổi cốt truyện của @ thei1e mà những người khác có thể tìm thấy hữu ích.

tàu mô hình và đưa ra dự đoán

library(caret) 
library(ggplot2) 
library(mlbench) 
library(plotROC) 

data(Sonar) 

ctrl <- trainControl(method="cv", summaryFunction=twoClassSummary, classProbs=T, 
        savePredictions = T) 

rfFit <- train(Class ~ ., data=Sonar, method="rf", preProc=c("center", "scale"), 
       trControl=ctrl) 

# Select a parameter setting 
selectedIndices <- rfFit$pred$mtry == 2 

Cập nhật đường cong ROC cốt truyện

g <- ggplot(rfFit$pred[selectedIndices, ], aes(m=M, d=factor(obs, levels = c("R", "M")))) + 
    geom_roc(n.cuts=0) + 
    coord_equal() + 
    style_roc() 

g + annotate("text", x=0.75, y=0.25, label=paste("AUC =", round((calc_auc(g))$AUC, 4))) 

enter image description here

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