2016-04-18 4 views
8

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) 
+0

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. –

+0

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

+1

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 ", ...)' –

Antwort

5

Mit Formel-Schnittstelle in Zug Faktoren Dummy umwandelt. Um Ergebnisse von caret mit randomForest zu vergleichen, sollten Sie die Nicht-Formel-Schnittstelle verwenden.

In Ihrem Fall sollten Sie einen Samen innerhalb trainControl bereitstellen, um das gleiche Ergebnis wie in randomForest zu erhalten.

Section training in Caret-Webseite gibt es einige Hinweise zur Reproduzierbarkeit, wo es erklärt, wie man Samen verwendet.

library("randomForest") 
set.seed(1) 
rf.model <- randomForest(uptake ~ ., 
         data = CO2, 
         ntree = 50, 
         nodesize = 5, 
         mtry = 2, 
         importance = TRUE, 
         metric = "RMSE") 

library("caret") 
caret.oob.model <- train(CO2[, -5], CO2$uptake, 
         method = "rf", 
         ntree = 50, 
         tuneGrid = data.frame(mtry = 2), 
         nodesize = 5, 
         importance = TRUE, 
         metric = "RMSE", 
         trControl = trainControl(method = "oob", seed = 1), 
         allowParallel = FALSE) 

Wenn Sie Resampling tun, sollten Sie Samen für jede Resampling Iteration und eine zusätzliche eine für das endgültige Modell bieten. Beispiele in ?trainControl zeigen, wie Sie sie erstellen.

Im folgenden Beispiel ist der letzte Seed für das endgültige Modell und ich setze es auf 1.

seeds <- as.vector(c(1:26), mode = "list") 

# For the final model 
seeds[[26]] <- 1 

caret.boot.model <- train(CO2[, -5], CO2$uptake, 
          method = "rf", 
          ntree = 50, 
          tuneGrid = data.frame(mtry = 2), 
          nodesize = 5, 
          importance = TRUE, 
          metric = "RMSE", 
          trControl = trainControl(method = "boot", seeds = seeds), 
          allowParallel = FALSE) 

Definig richtig die Nicht-Formel-Schnittstelle mit caret und Samen in trainControl erhalten Sie die gleichen Ergebnisse in allen drei Modellen erhalten:

rf.model 
caret.oob.model$final 
caret.boot.model$final 
+0

Danke, Lluís! Das hat perfekt funktioniert! – ej5607

+0

Der Mittelwert der quadrierten Residuen und die Varianz, die durch das Modell erklärt werden, stimmen jetzt exakt zwischen den Modellen randomForest und Caret überein. Die% IncMSE Prädiktor-Wichtigkeitsschätzungen bleiben jedoch unterschiedlich, selbst bei der Nicht-Formel-Schnittstelle. Was könnte das erklären? – ej5607

+0

Ich bekomme die gleichen Ergebnisse in 'Wichtigkeit (rf.model)', 'Wichtigkeit (caret.oob.model $ finalModel)' und 'Wichtigkeit (caret.boot.model $ finalModel)'. –

Verwandte Themen