2016-05-13 9 views
8

Ich würde gerne wissen, ob es eine Möglichkeit gibt, die durchschnittliche ROC-Kurve aus den Kreuzvalidierungsdaten eines mit dem caret-Paket erzeugten SVM-RFE-Modells zu plotten.Plot-ROC-Kurve aus Kreuzvalidierungs- (Trainings-) Daten in R

Meine Ergebnisse sind: ROC curve from training data in caret

optSize <- svmRFE_NG2$optsize 
selectedIndices <- svmRFE_NG2$pred$Variables == optSize 
plot.roc(svmRFE_NG2$pred$obs[selectedIndices], 
     svmRFE_NG2$pred$LUNG[selectedIndices]) 

Aber diese Lösung scheint (der resultierende AUC-Wert ist ganz anders), nicht zu arbeiten:

Recursive feature selection 

Outer resampling method: Cross-Validated (10 fold, repeated 5 times) 

Resampling performance over subset size: 

Variables ROC Sens Spec Accuracy Kappa ROCSD SensSD SpecSD AccuracySD KappaSD Selected 
     1 0.6911 0.0000 1.0000 0.5900 0.0000 0.2186 0.0000 0.0000  0.0303 0.0000   
     2 0.7600 0.3700 0.8067 0.6280 0.1807 0.1883 0.3182 0.2139  0.1464 0.3295   
     3 0.7267 0.4233 0.8667 0.6873 0.3012 0.2020 0.3216 0.1905  0.1516 0.3447   
     4 0.6989 0.3867 0.8600 0.6680 0.2551 0.2130 0.3184 0.1793  0.1458 0.3336   
     5 0.7000 0.3367 0.8600 0.6473 0.2006 0.2073 0.3359 0.1793  0.1588 0.3672   
     6 0.7167 0.3833 0.8200 0.6427 0.2105 0.1909 0.3338 0.2539  0.1682 0.3639   
     7 0.7122 0.3767 0.8333 0.6487 0.2169 0.1784 0.3226 0.2048  0.1642 0.3702   
     8 0.7144 0.4233 0.7933 0.6440 0.2218 0.2017 0.3454 0.2599  0.1766 0.3770   
     9 0.8356 0.6533 0.7867 0.7300 0.4363 0.1706 0.3415 0.2498  0.1997 0.4209   
     10 0.8811 0.6867 0.8200 0.7647 0.5065 0.1650 0.3134 0.2152  0.1949 0.4053  * 
     11 0.8700 0.6933 0.8133 0.7627 0.5046 0.1697 0.3183 0.2147  0.1971 0.4091   
     12 0.8678 0.6967 0.7733 0.7407 0.4682 0.1579 0.3153 0.2559  

... 
The top 5 variables (out of 10): 
    SumAverage_GLCM_R1SC4NG2, Variance_GLCM_R1SC4NG2, HGZE_GLSZM_R1SC4NG2, LGZE_GLSZM_R1SC4NG2, SZLGE_GLSZM_R1SC4NG2 

ich mit der Lösung, die hier erwähnt versucht habe. Ich habe die Ergebnisse des Trainingsprozesses in die 50 Kreuzvalidierungssätze aufgeteilt, wie in der vorherigen Antwort erwähnt, aber ich weiß nicht, was ich als nächstes tun soll.

resamples<-split(svmRFE_NG2$pred,svmRFE_NG2$pred$Variables) 
resamplesFOLD<-split(resamples[[optSize]],resamples[[optSize]]$Resample) 

Irgendwelche Ideen?

Antwort

10

Wie Sie bereits haben können Sie a) aktivieren savePredictions = T im trainControl Parameter von caret::train, dann, b) aus dem trainierten Modellobjekt, verwenden Sie die pred Variable - die alle Prognosen über alle Partitionen und Resampling enthält - zu berechnen, je nachdem, was ROC Kurve, die du gerne sehen würdest. Sie haben nun mehrere Möglichkeiten, von denen ROC dies sein kann, zum Beispiel:

Sie bei alle Prognosen über alle Partitionen und Resampling auf einmal aussehen könnte:

plot(roc(predictor = modelObject$pred$CLASSNAME, response = modelObject$pred$obs)) 

Oder Sie könnten dies tun über einzelne Partitionen und/oder resamples (das ist, was Sie oben versuchten). Das folgende Beispiel berechnet die ROC-Kurve pro Partition und resample, so mit 10 Partitionen und 5 Wiederholungen in 50 ROC-Kurven führen:

library(plyr) 
l_ply(split(modelObject$pred, modelObject$pred$Resample), function(d) { 
    plot(roc(predictor = d$CLASSNAME, response = d$obs)) 
}) 

auf Ihren Daten und je nach Modell, letztere wird geben Sie bestimmen Varianz in den resultierenden ROC-Kurven und AUC-Werten. Sie können die gleiche Varianz in den AUC und SD Werten caret für Ihre individuellen Partitionen und Resamples berechnet sehen, so dass dies aus Ihren Daten und Modell und ist korrekt.

BTW: Ich habe die pROC::roc Funktion für die Berechnung der obigen Beispiele verwendet, aber Sie könnten hier jede geeignete Funktion verwenden. Und wenn caret::train verwendet wird, ist das Erhalten der ROC immer gleich, unabhängig vom Modelltyp.