Ich bin etwas verwirrt: Wie können sich die Ergebnisse eines trainierten Modells per Caret vom Modell in der Originalverpackung unterscheiden? Ich habe gelesen, ob vor der Vorhersage mit FinalModel von RandomForest mit Caret-Paket eine Vorverarbeitung erforderlich ist. aber ich benutze hier keine vorverarbeitung.
Ich habe verschiedene Zufallswälder trainiert, indem ich das Caret-Paket verwendet und für verschiedene mtry-Werte gestimmt habe.
> cvCtrl = trainControl(method = "repeatedcv",number = 10, repeats = 3, classProbs = TRUE, summaryFunction = twoClassSummary)
> newGrid = expand.grid(mtry = c(2,4,8,15))
> classifierRandomForest = train(case_success ~ ., data = train_data, trControl = cvCtrl, method = "rf", metric="ROC", tuneGrid = newGrid)
> curClassifier = classifierRandomForest
Ich fand mtry = 15 als den besten Parameter für die training_data:
> curClassifier
...
Resampling results across tuning parameters:
mtry ROC Sens Spec ROC SD Sens SD Spec SD
4 0.950 0.768 0.957 0.00413 0.0170 0.00285
5 0.951 0.778 0.957 0.00364 0.0148 0.00306
8 0.953 0.792 0.956 0.00395 0.0152 0.00389
10 0.954 0.797 0.955 0.00384 0.0146 0.00369
15 0.956 0.803 0.951 0.00369 0.0155 0.00472
ROC was used to select the optimal model using the largest value.
The final value used for the model was mtry = 15.
Ich habe das Modell mit einer ROC-Kurve und einer Verwirrungsmatrix bewertet:
##ROC-Curve
predRoc = predict(curClassifier, test_data, type = "prob")
myroc = pROC::roc(test_data$case_success, as.vector(predRoc[,2]))
plot(myroc, print.thres = "best")
##adjust optimal cut-off threshold for class probabilities
threshold = coords(myroc,x="best",best.method = "closest.topleft")[[1]] #get optimal cutoff threshold
predCut = factor( ifelse(predRoc[, "Yes"] > threshold, "Yes", "No") )
##Confusion Matrix (Accuracy, Spec, Sens etc.)
curConfusionMatrix = confusionMatrix(predCut, test_data$case_success, positive = "Yes")
Die resultierende Verwirrungsmatrix und Genauigkeit:
Confusion Matrix and Statistics
Reference
Prediction No Yes
No 2757 693
Yes 375 6684
Accuracy : 0.8984
....
Jetzt habe ich mit dem Basispaket randomForest einen Zufalls-Rorest mit denselben Parametern und denselben trainingsdaten trainiert:
randomForestManual <- randomForest(case_success ~ ., data=train_data, mtry = 15, ntree=500,keep.forest=TRUE)
curClassifier = randomForestManual
Wiederum habe ich Vorhersagen für dieselben Testdaten wie oben erstellt und die Verwirrungsmatrix mit demselben Code wie oben bewertet. Aber jetzt habe ich verschiedene Maßnahmen:
Confusion Matrix and Statistics
Reference
Prediction No Yes
No 2702 897
Yes 430 6480
Accuracy : 0.8737
....
Was ist der Grund? Was vermisse ich?
seeds
Argument vontrainControl
Antworten:
Ich denke, dass die Frage, während sie auf den ersten Blick etwas trivial und "programmatisch" ist, zwei Hauptthemen berührt, die in der modernen Statistik sehr wichtig sind:
Der Grund für die unterschiedlichen Ergebnisse ist, dass die beiden Verfahren unter Verwendung verschiedener zufälliger Samen trainiert werden. Zufällige Gesamtstrukturen verwenden eine zufällige Teilmenge aus den Variablen des vollständigen Datensatzes als Kandidaten für jeden Split (das ist das
mtry
Argument und bezieht sich auf die Methode des zufälligen Unterraums ) sowie Taschen (Bootstrap-Aggregate) des ursprünglichen Datensatzes, um die Varianz des Modells zu verringern. Diese beiden internen Zufallsstichprobenverfahren sind zwischen verschiedenen Läufen des Algorithmus nicht deterministisch. Die zufällige Reihenfolge, in der die Probenahme erfolgt, wird durch die verwendeten Zufallskeime gesteuert. Wenn die gleichen Samen verwendet würden, würde man in beiden Fällen, in denen dierandomForest
Routine aufgerufen wird, genau die gleichen Ergebnisse erzielen; beide intern incaret::train
sowie extern, wenn eine zufällige Gesamtstruktur manuell angepasst wird. Ich füge ein einfaches Code-Snippet bei, um dies zu demonstrieren. Bitte beachte, dass ich eine sehr kleine Anzahl von Bäumen verwende (Argument:)ntree
, um das Training schnell zu halten. Es sollte im Allgemeinen viel größer sein.Zu diesem Zeitpunkt wurden sowohl das
caret.train
ObjektfitRFcaret
als auch das manuell definierterandomForest
ObjektfitRFmanual
mit denselben Daten trainiert, wobei jedoch bei der Anpassung des endgültigen Modells die gleichen zufälligen Startwerte verwendet wurden. Wenn wir also versuchen, die Verwendung dieser Objekte vorherzusagen, und wenn wir unsere Daten nicht vorverarbeiten, erhalten wir dieselben genauen Antworten.Nur um dies später noch einmal zu verdeutlichen:
predict(xx$finalModel, testData)
undpredict(xx, testData)
wird anders sein, wenn man diepreProcess
Option bei der Verwendung setzttrain
. BeifinalModel
direkter Verwendung entspricht dies jedoch derpredict
Funktion des eingebauten Modells (predict.randomForest
hier) anstelle von zu verwendenpredict.train
. Es findet keine Vorverarbeitung statt. Offensichtlich sind in dem in der ursprünglichen Frage beschriebenen Szenario, in dem keine Vorverarbeitung durchgeführt wird, die Ergebnisse bei VerwendungfinalModel
des manuell angepasstenrandomForest
Objekts oder descaret.train
Objekts gleich.Ich würde Ihnen dringend empfehlen immer den von R, MATLAB oder einem anderen verwendeten Programm verwendeten Zufallsstartwert festlegen. Andernfalls können Sie die Reproduzierbarkeit der Ergebnisse nicht überprüfen (was in Ordnung ist, es könnte nicht das Ende der Welt sein) oder einen Fehler oder externen Faktor ausschließen, der die Leistung eines Modellierungsvorgangs beeinträchtigt (was ja, irgendwie scheiße ist). Viele der führenden ML-Algorithmen (z. B. Gradienten-Boosting, zufällige Wälder, extreme neuronale Netze) verwenden während ihrer Trainingsphasen bestimmte interne Resampling-Verfahren. Das Festlegen der zufälligen Startzustände vor (oder manchmal sogar innerhalb) ihrer Trainingsphase kann wichtig sein.
quelle
train
damit es genau gleichwertig istrandomForest
? Ich habe versucht,method="none"
aber nicht sicher, wie ich den Startwert auf den Einzelwert setzen soll. Vielen Dank.preProcess
oder wie dierandomForest
zu Beginn trainiert werden. Vorausgesetzt, wir haben keine Vorverarbeitungsschritte, müssen wir im Allgemeinen sicherstellen, dass sowohl das Saatgut als auch die (hier nurmtry
) verwendeten Hyperparameter gleich sind.Vorhersagen von stimmen
curClassifier
nicht mit Vorhersagen voncurClassifier$finalModel
Link überein . Sie haben das reproduziertfinalModel
und vergleichen es mit dempredict.train
Objekt.quelle
predict
sollten (und tun es tatsächlich) die gleichen Vorhersagen für den Fall geben, dass das OP untersucht. Ich erkläre diesen Punkt in meinem Beitrag etwas genauer.