2016-05-29 10 views
2

Liebe die Geschwindigkeit des Ranger-Pakets für zufällige Waldmodell-Erstellung, kann aber nicht sehen, wie Mtry oder Anzahl der Bäume zu tunen. Mir ist klar, dass ich das über die caret's train() -Syntax machen kann, aber ich bevorzuge die Geschwindigkeitssteigerung, die von der Verwendung eines reinen Rangers ausgeht.Hyper-Parameter-Tuning mit reinem Ranger-Paket in R

Hier ist mein Beispiel grundlegender Modellerstellung Ranger mit (dem großen Werken):

library(ranger) 
data(iris) 

fit.rf = ranger(
    Species ~ ., 
    training_data = iris, 
    num.trees = 200 
) 

print(fit.rf) 

in der offiziellen Dokumentation der Suche nach Optimierungsoptionen, wie es scheint, die csrf() Funktion kann die Fähigkeit zum Abstimmen hyper liefern -parameter, aber ich kann die Syntax Recht nicht bekommen:

library(ranger) 
data(iris) 

fit.rf.tune = csrf(
    Species ~ ., 
    training_data = iris, 
    params1 = list(num.trees = 25, mtry=4), 
    params2 = list(num.trees = 50, mtry=4) 
) 

print(fit.rf.tune) 

Ergebnisse in:

Error in ranger(Species ~ ., training_data = iris, num.trees = 200) : 
    unused argument (training_data = iris) 

Und ich würde lieber mit dem regulären (lesen: nicht-csrf) RF-Algorithmus Ranger bietet tun. Irgendeine Idee bezüglich einer Hyper-Parameter-Tuning-Lösung für beide Pfad in Ranger? Vielen Dank!

Antwort

3

Ich denke, es gibt mindestens zwei Fehler:

Zuerst wird die Funktion ranger hat keinen Parameter training_data genannt. Ihre Fehlermeldung Error in ranger(Species ~ ., training_data = iris, num.trees = 200) : unused argument (training_data = iris) bezieht sich darauf. Sie können das sehen, wenn Sie ?ranger oder args(ranger) betrachten.

Zweitens hat die Funktion csrf dagegen training_data als Eingabe, benötigt aber auch test_data. Am wichtigsten ist, dass diese beiden Argumente keine Standardwerte haben, was bedeutet, dass Sie diese angeben müssen. Folgende Arbeiten ohne Probleme:

fit.rf = ranger(
    Species ~ ., data = iris, 
    num.trees = 200 
) 

fit.rf.tune = csrf(
Species ~ ., 
training_data = iris, 
test_data = iris, 
params1 = list(num.trees = 25, mtry=4), 
params2 = list(num.trees = 50, mtry=4) 
) 

Hier habe ich nur iris als Training und Test-Datensatz zur Verfügung gestellt. Das möchten Sie in Ihrer realen Anwendung natürlich nicht tun. Beachten Sie außerdem, dass ranger auch num.trees und mtry als Eingabe verwenden, also könnten Sie versuchen, es dort zu tunen.

+0

Fantastische info, danke! Nach Ihrer Kenntnis gibt es keine Non-csrf-Route zu Hyper-Parameter-Tuning in Ranger? Auch, Zheyuan, habe ich ursprünglich gefragt, ob eine non-csrf-Option verfügbar war (und nicht nur für eine Korrektur für die dokumentierte csrf-Implementierung). –

+0

Sehr großzügig, Leute, danke. Nur eine Anmerkung, coffeinjunky - obwohl die Fehlermeldung, die ich gepostet habe, ich die Ranger-Funktion verwendet hatte, hatte ich tatsächlich die csrf-Funktion verwendet (nicht sicher, ob Sie Ihre Antwort bearbeiten möchten). Ich werde Marvin Wright (der Betreuer) eine E-Mail darüber schreiben. Danke noch einmal! –

+0

Auch coffininjunky, wenn Sie bearbeiten, würde es Ihnen etwas ausmachen, ein Beispiel für Param1, Param2 Syntax für die Abstimmung mit Ranger-Funktion hinzuzufügen? Vielen Dank! –

4

Um meine (unklare) Frage zu beantworten, hat Ranger offenbar keine eingebaute CV/GridSearch-Funktionalität. Hier ist jedoch, wie Sie Hyper-Parameter-Tuning mit Ranger (über eine Rastersuche) außerhalb von Caret tun. Dank geht an Marvin Wright (der Betreuer von Ranger) für den Code. Stellt sich heraus, Caret CV mit Ranger war langsam für mich, weil ich die Formel-Schnittstelle (die vermieden werden sollte).

ptm <- proc.time() 
library(ranger) 
library(mlr) 

# Define task and learner 
task <- makeClassifTask(id = "iris", 
         data = iris, 
         target = "Species") 

learner <- makeLearner("classif.ranger") 

# Choose resampling strategy and define grid 
rdesc <- makeResampleDesc("CV", iters = 5) 
ps <- makeParamSet(makeIntegerParam("mtry", 3, 4), 
        makeDiscreteParam("num.trees", 200)) 

# Tune 
res = tuneParams(learner, task, rdesc, par.set = ps, 
      control = makeTuneControlGrid()) 

# Train on entire dataset (using best hyperparameters) 
lrn = setHyperPars(makeLearner("classif.ranger"), par.vals = res$x) 
m = train(lrn, iris.task) 

print(m) 
print(proc.time() - ptm) # ~6 seconds 

Für die Neugierigen, die caret entspricht

ptm <- proc.time() 
library(caret) 
data(iris) 

grid <- expand.grid(mtry = c(3,4)) 

fitControl <- trainControl(method = "CV", 
          number = 5, 
          verboseIter = TRUE) 

fit = train(
    x = iris[ , names(iris) != 'Species'], 
    y = iris[ , names(iris) == 'Species'], 
    method = 'ranger', 
    num.trees = 200, 
    tuneGrid = grid, 
    trControl = fitControl 
) 
print(fit) 
print(proc.time() - ptm) # ~2.4 seconds 

Insgesamt caret der schnellste Weg, um eine Rastersuche mit Ranger zu tun, wenn man die nicht-Formel-Schnittstelle verwendet.

0

Beachten Sie, dass mlr standardmäßig die interne Parallelisierung von Ranger deaktiviert.Stellen Sie Hyper num.threads auf die Anzahl der Kerne zur Verfügung mlr zu beschleunigen:

learner <- makeLearner("classif.ranger", num.threads = 4) 

Alternativ starten Sie eine parallele Backend über

parallelStartMulticore(4) # linux/osx 
parallelStartSocket(4) # windows 

vor dem Aufruf tuneParams die Abstimmung parallelisieren.