2015-06-30 37 views
15

Usando il punto di inserimento del pacchetto R, come è possibile generare una curva ROC in base ai risultati della convalida incrociata della funzione treno()?Curva ROC dai dati di allenamento nell'accurpitura

': Io effettuare le seguenti operazioni:

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

La formazione va oltre una serie di parametri mtry e calcola il ROC AUC. Mi piacerebbe vedere la curva ROC associata: come faccio?

Nota: se il metodo utilizzato per il campionamento è LOOCV, quindi rfFit conterrà un frame di dati non nullo nello slot rfFit$pred, che sembra essere esattamente ciò di cui ho bisogno. Tuttavia, ho bisogno di questo per il metodo "cv" (k-fold validation) piuttosto che LOO.

Inoltre: no, la funzione roc che prima era inclusa nelle precedenti versioni di caret non è una risposta: questa è una funzione di basso livello, non è possibile utilizzarla se non si dispone delle probabilità di previsione per ciascuna campione con convalida incrociata.

+0

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

+0

No, questa non è la risposta. Innanzitutto, la versione moderna del punto di inserimento non ha la funzione. Secondo, la funzione ha bisogno di una "variabile da tagliare", in particolare delle probabilità di previsione, ma come ottenerle dall'oggetto restituito dalla funzione train()? – January

risposta

22

C'è solo l'argomento savePredictions = TRUE manca ctrl (questo funziona anche per altri metodi di ricampionamento):

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

Forse mi manca qualcosa, ma una piccola preoccupazione è che train stima sempre valori di AUC leggermente diversi da plot.roc e pROC::auc (differenza assoluta < 0,005), sebbene twoClassSummary utilizzi pROC::auc per stimare l'AUC. Modifica: Presumo che ciò si verifichi perché il ROC da train è la media dell'AUC che utilizza i set di CV separati e qui stiamo calcolando l'AUC su tutti i campioni contemporaneamente per ottenere l'AUC globale.

aggiornamento Dal momento che questo sta diventando un po 'di attenzione, ecco una soluzione che utilizza plotROC::geom_roc() per 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

Il commento sulla media di molti AUC rispetto a quello creato dai campioni OOB è corretto. Saranno in qualche modo diversi. – topepo

+0

può estrarre finalModel mtry con 'rfFit $ finalModel $ mtry' –

8

Qui, sto modificando la trama di @ thei1e che altri possono trovare utile.

treno modello e fare previsioni

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 

curva ROC Aggiornato trama

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