2016-12-15 5 views
1

Es scheint Unterschiede zwischen der ROC/Sens/Spec, die beim Abstimmen des Modells erzeugt wird, zu den tatsächlichen Vorhersagen zu geben, die vom Modell für denselben Datensatz gemacht werden. Ich benutze Caret, das kernlab ksvm verwendet. Ich habe dieses Problem mit Glm nicht.Kreuzvalidierungs-Vorhersagen für Caret und SVM

data(iris) 
library(caret) 
iris <- subset(iris,Species == "versicolor" | Species == "setosa") # we need only two output classess 
iris$noise <- runif(nrow(iris)) # add noise - otherwise the model is too "perfect" 
iris$Species <- factor(iris$Species) 
fitControl <- trainControl(method = "repeatedcv",number = 10, repeats = 5, savePredictions = TRUE, classProbs = TRUE, summaryFunction = twoClassSummary) 

ir <- train(Species ~ Sepal.Length + noise, data=iris,method = "svmRadial", preProc = c("center", "scale"), trControl=fitControl,metric="ROC") 
confusionMatrix(predict(ir), iris$Species, positive = "setosa") 
getTrainperf(ir) # same as in the model summary 

Worauf beruht diese Diskrepanz? Welche sind die "echten" post-cross-validation-Vorhersagen?

Antwort

1

Es scheint die Funktion getTrainPerf gibt die mittlere Leistung Ergebnisse der am besten abgestimmten Parameter im Durchschnitt über die wiederholten Kreuz Validierungen Falten.

Hier ist, wie getTrainPerf Werke:

getTrainPerf(ir) 
# TrainROC TrainSens TrainSpec method 
#1 0.9096  0.844  0.884 svmRadial 

, die auf folgende Weise erreicht:

ir$results 
#  sigma C ROC Sens Spec  ROCSD SensSD SpecSD 
#1 0.7856182 0.25 0.9064 0.860 0.888 0.09306044 0.1355262 0.1222911 
#2 0.7856182 0.50 0.9096 0.844 0.884 0.08882360 0.1473023 0.1218229 
#3 0.7856182 1.00 0.8968 0.836 0.884 0.09146071 0.1495026 0.1218229 
ir$bestTune 
#  sigma C 
#2 0.7856182 0.5 
merge(ir$results, ir$bestTune) 
#  sigma C ROC Sens Spec  ROCSD SensSD SpecSD 
#1 0.7856182 0.5 0.9096 0.844 0.884 0.0888236 0.1473023 0.1218229 

, die auch von den Performance-Ergebnisse auf der Kreuzvalidierung erhalten werden kann Falten (10 Falten, 5 Wiederholungen, 10 * 5 = 50 Gesamtwerte für jede der Leistungsmessungen).

colMeans(ir$resample[1:3]) 
#  ROC Sens Spec 
# 0.9096 0.8440 0.8840 

Daher getTrainPerf gibt nur die Zusammenfassung der Kreuzvalidierung Leistungen auf den Daten Falten für die Validierung zu unterschiedlichen Zeiten statt-out (nicht auf der gesamten Trainingsdaten) mit den besten optimierten Parameter (Sigma, C) .

Wenn Sie jedoch Ihren gesamten Trainingsdatensatz vorhersagen möchten, müssen Sie die Funktion predict mit dem abgestimmten Modell verwenden.