2016-05-29 7 views
2

Любите скорость пакета рейнджеров для создания случайной модели леса, но не можете увидеть, как настроить mtry или количество деревьев. Я понимаю, что могу сделать это с помощью синтаксиса traint's(), но я предпочитаю увеличение скорости, которое происходит от использования чистого рейнджера.Гиперпараметрическая настройка с использованием пакета чистого рейнджера в R

Вот мой пример основного создания модели с использованием рейнджер (который прекрасно работает):

library(ranger) 
data(iris) 

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

print(fit.rf) 

Глядя на официальную документацию для параметров настройки, похоже, функция CSRF() может предоставить возможность настроить гипер- -параметров, но я не могу получить правильный синтаксис:

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) 

Результаты в:

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

И я бы предпочел настроить его с помощью регулярного (read: non-csrf) rf-алгоритма, который предоставляет ranger. Любая идея относительно решения настройки гиперпараметра для любого пути в рейнджере? Спасибо!

ответ

3

Я думаю, что есть по крайней мере две ошибки:

Во-первых, функция ranger не имеет параметр, называемый training_data. Это сообщение об ошибке Error in ranger(Species ~ ., training_data = iris, num.trees = 200) : unused argument (training_data = iris). Вы можете видеть это, когда смотрите ?ranger или args(ranger).

Во-вторых, функция csrf, с другой стороны, имеет training_data в качестве входных данных, но также требует test_data. Самое главное, эти два аргумента не имеют никаких значений по умолчанию, подразумевая, что вы должны их предоставить. Следующие работы без проблем:

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

Вот, я только при условии, iris и как обучение и тест-набора данных. Очевидно, вы не хотели бы этого делать в своем реальном приложении. Кроме того, обратите внимание, что ranger также принимают num.trees и mtry в качестве входных данных, поэтому вы можете попробовать его настроить там.

+0

Фантастическая информация, спасибо! Насколько вам известно, нет пути не-csrf для настройки гиперпараметров в рейнджере? Кроме того, Zheyuan, я действительно спрашивал, доступен ли параметр non-csrf (а не только для исправления документированной реализации csrf). –

+0

Очень щедро, ребята, спасибо. Просто примечание, coffeinjunky - хотя сообщение об ошибке, которое я написал, сказал, что я использовал функцию рейнджера, я фактически использовал функцию csrf (не уверен, хотите ли вы отредактировать ответ). Я отправлю письмо Марвину Райт (сопровождающему) об этом. Еще раз спасибо! –

+0

Кроме того, coffeinjunky, если вы редактируете, не могли бы вы добавить пример синтаксиса param1, param2 для настройки с функцией Ranger? Благодаря! –

4

Чтобы ответить на мой (непонятный) вопрос, очевидно, что рейнджер не имеет встроенной функции CV/GridSearch. Однако, вот как вы выполняете настройку гиперпараметров с помощью рейнджера (через поиск сетки) вне каретки. Спасибо за Марвина Райт (хранителя рейнджера) за код. Оказывается, CV с рейнджером был медленным для меня, потому что я использовал интерфейс формулы (чего следует избегать).

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 

Для любознательных, каретка эквивалент

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 

В целом, каретка это самый быстрый способ сделать поиск сетки с рейнджером, если использовать не-формула интерфейса.

0

Обратите внимание, что mlr по умолчанию отключает внутреннюю распараллеливание рейнджера.Набор гиперпараметра num.threads к количеству ядер, доступных для ускорения mlr вверх:

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

В качестве альтернативы, начать параллельный бэкенд перед вызовом tuneParams распараллеливать настройку с помощью

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

.