使用R

时间:2016-05-29 20:24:50

标签: r model random-forest hyperparameters

喜欢随机森林模型创建的游侠包的速度,但不能看到如何调整mtry或树的数量。我意识到我可以通过插入符号的train()语法来实现这一点,但我更喜欢使用纯粹的游侠来提高速度。

这是我使用游侠创建基本模型的例子(效果很好):

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)

我更喜欢使用常规(读取:非csrf)rf算法游侠提供。对于游侠中任何一条路径的超参数调整解决方案有什么想法吗?谢谢!

5 个答案:

答案 0 :(得分:10)

要回答我(不清楚)的问题,显然游侠没有内置的CV / GridSearch功能。但是,这里是你如何使用插入符号外的游侠(通过网格搜索)进行超参数调整。感谢Marvin Wright(游侠的维护者)代码。因为我使用了公式界面(应该避免使用公式界面),因此使用游侠的插入符号对我来说很慢。

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

对于好奇的,插入符号是

quality

总的来说,如果使用非公式界面,插入符号是使用游侠进行网格搜索的最快方法。

答案 1 :(得分:6)

我认为至少有两个错误:

首先,函数ranger没有名为training_data的参数。您的错误消息Error in ranger(Species ~ ., training_data = iris, num.trees = 200) : unused argument (training_data = iris)指的是该消息。当您查看?rangerargs(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.treesmtry作为输入,因此您可以尝试在那里进行调整。

答案 2 :(得分:3)

请注意,默认情况下mlr会禁用游侠的内部并行化。将超参数num.threads设置为可用于加速mlr的核心数量:

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

或者,通过

启动并行后端
parallelStartMulticore(4) # linux/osx
parallelStartSocket(4)    # windows

在调用tuneParams并行调整之前。

答案 3 :(得分:3)

调整模型的另一种方法是创建手动网格,也许有更好的方法来训练模型,但这可能是另一种选择。

hyper_grid <- expand.grid(
  mtry       = 1:4,
  node_size  = 1:3,
  num.trees = seq(50,500,50),
  OOB_RMSE   = 0
)

system.time(
  for(i in 1:nrow(hyper_grid)) {
    # train model
    rf <- ranger(
      formula        = Species ~ .,
      data           = iris,
      num.trees      = hyper_grid$num.trees[i],
      mtry           = hyper_grid$mtry[i],
      min.node.size  = hyper_grid$node_size[i],
      importance = 'impurity')
    # add OOB error to grid
    hyper_grid$OOB_RMSE[i] <- sqrt(rf$prediction.error)
  })
user  system elapsed 
3.17    0.19    1.36

nrow(hyper_grid) # 120 models
position = which.min(hyper_grid$OOB_RMSE)
head(hyper_grid[order(hyper_grid$OOB_RMSE),],5)
     mtry node_size num.trees     OOB_RMSE
6     2         2        50 0.1825741858
23    3         3       100 0.1825741858
3     3         1        50 0.2000000000
11    3         3        50 0.2000000000
14    2         1       100 0.2000000000

# fit best model
rf.model <- ranger(Species ~ .,data = iris, num.trees = hyper_grid$num.trees[position], importance = 'impurity', probability = FALSE, min.node.size = hyper_grid$node_size[position], mtry = hyper_grid$mtry[position])
rf.model
Ranger result

Call:
 ranger(Species ~ ., data = iris, num.trees = hyper_grid$num.trees[position], importance = "impurity", probability = FALSE, min.node.size = hyper_grid$node_size[position], mtry = hyper_grid$mtry[position]) 

    Type:                             Classification 
Number of trees:                  50 
Sample size:                      150 
Number of independent variables:  4 
Mtry:                             2 
Target node size:                 2 
Variable importance mode:         impurity 
Splitrule:                        gini 
OOB prediction error:             5.33 % 

我希望它能为您服务。

答案 4 :(得分:0)

还有tuneRanger R软件包,该软件包是专为调整游侠而设计的,并使用预定义的调整参数,超参数空间和通过袋外观察来进行智能调整。

请注意,通常情况下,随机森林不是调整算法的重要部分。但这通常可以提高性能。