Ich bin neu in Caret, und ich möchte nur sicherstellen, dass ich vollständig verstehe, was es tut. Zu diesem Zweck habe ich versucht, die Ergebnisse zu reproduzieren, die ich von einem randomForest() -Modell mit der caret-Funktion train() für method = "rf" erhalten habe. Leider konnte ich keine übereinstimmenden Ergebnisse erzielen, und ich frage mich, was ich übersehe.Verschiedene Ergebnisse mit randomForest() und caret's randomForest (method = "rf")
Ich werde auch hinzufügen, dass RandomForest Bootstrapping benutzt, um Samples zu erzeugen, die zu jedem der ntrees passen, und den Fehler basierend auf Out-of-Bag-Vorhersagen schätzt, bin ich ein wenig unscharf über den Unterschied zwischen der Angabe von "oob "und" boot "im Aufruf der Funktion trainControl. Diese Optionen erzeugen unterschiedliche Ergebnisse, aber keines entspricht dem Modell randomForest().
Obwohl ich die Caret-Paket-Website (http://topepo.github.io/caret/index.html) gelesen habe, sowie verschiedene StackOverflow-Fragen, die möglicherweise relevant erscheinen, aber ich konnte nicht herausfinden, warum das Caret-Methode = "rf" -Modell zu unterschiedlichen Ergebnissen führt von randomForest(). Vielen Dank für Ihre Einblicke.
Hier ist ein replizierbares Beispiel, das den CO2-Datensatz aus dem MASS-Paket verwendet.
library(MASS)
data(CO2)
library(randomForest)
set.seed(1)
rf.model <- randomForest(uptake ~ .,
data = CO2,
ntree = 50,
nodesize = 5,
mtry=2,
importance=TRUE,
metric="RMSE")
library(caret)
set.seed(1)
caret.oob.model <- train(uptake ~ .,
data = CO2,
method="rf",
ntree=50,
tuneGrid=data.frame(mtry=2),
nodesize = 5,
importance=TRUE,
metric="RMSE",
trControl = trainControl(method="oob"),
allowParallel=FALSE)
set.seed(1)
caret.boot.model <- train(uptake ~ .,
data = CO2,
method="rf",
ntree=50,
tuneGrid=data.frame(mtry=2),
nodesize = 5,
importance=TRUE,
metric="RMSE",
trControl=trainControl(method="boot", number=50),
allowParallel=FALSE)
print(rf.model)
print(caret.oob.model$finalModel)
print(caret.boot.model$finalModel)
Erzeugt die folgenden:
print (rf.model)
Mean of squared residuals: 9.380421
% Var explained: 91.88
print (caret.oob.model $ finalModel)
Mean of squared residuals: 38.3598
% Var explained: 66.81
print (caret.boot.model $ finalModel)
Mean of squared residuals: 42.56646
% Var explained: 63.16
Und der Code mit variabler Bedeutung suchen:
importance(rf.model)
importance(caret.oob.model$finalModel)
importance(caret.boot.model$finalModel)
Short Ihrer aktuellen Daten verwenden und versuchen, die Modelle zu reproduzieren Sie Haben Sie das Verhalten der Caret und RandomForest Modelle untersucht? Wenn beide sehr ähnliche wichtige Prädiktoren mit ähnlichen Gewichten aufweisen, dann sind Sie vielleicht weniger besorgt über andere Variationen. –
Hallo Tim - Vielen Dank für Ihre Zeit und Eingabe. Ich habe mir die Wichtigkeit der Variablen angeschaut (ich habe den obigen Code aktualisiert, um dies widerzuspiegeln), und ich bekomme unterschiedliche Gewichte für die Prädiktoren. Selbst wenn die Gewichte nicht so unterschiedlich wären, würde ich trotzdem verstehen wollen, was die Unterschiede verursacht hat. Wenn ich etwas nicht erklären kann, mache ich mir immer Sorgen über das, was ich nicht weiß, dass ich es nicht weiß! – ej5607
Mithilfe der Formelschnittstelle im Zug werden die Faktoren in Dummy umgewandelt. Um mit randomForest zu vergleichen, sollten Sie die Nicht-Formel-Schnittstelle verwenden. Zum Beispiel 'train (CO2 [, -5], CO2 $ Aufnahme, method =" rf ", ...)' –