火车函数中未使用的参数

时间:2019-12-04 13:36:39

标签: r random-forest hyperparameters

大家好!

使用RF超参数调整时,我在代码中遇到问题。该算法(模拟退火)为我提供了4000的RMSE值。我不确定从何处执行此计算,因为在代码中我未指定任何网格/值?下面的代码最初是用于SVM的,但是我为RF编辑过。

svm_obj <- function(param, maximize = FALSE) {
  mod <- train(Effort ~ ., data = tr,
               method = "rf",
               preProc = c("center", "scale", "zv"),
               metric = "MAE",
               trControl = ctrl,
               tuneGrid = data.frame(mtry = 10^(param[1])))
               ##, sigma = 10^(param[2])))
  if(maximize)
    -getTrainPerf(mod)[, "TrainRMSE"] else
      getTrainPerf(mod)[, "TrainRMSE"]
}

## Simulated annealing from base R
set.seed(45642)
san_res <- optim(par = c(0), fn = svm_obj, method = "SANN",
                 control = list(maxit = 10))

The answer I get is: $value
[1] 4487.821

$counts
function gradient 
      10       NA 

$convergence
[1] 0

$message
NULL

3 个答案:

答案 0 :(得分:0)

好吧,我不知道您使用什么值调用函数,因此很难发现错误。

但是,mtry的值必须在1到列数之间,而在我看来,您可能将其设置为10以表示某种力量-这很可能超出范围:)

答案 1 :(得分:0)

mtry是rf用来拆分树的变量数,它不能超过预测变量的列数。

让我们做一个不起作用的模型:

  mod <- train(Effort ~ ., data = tr,
               method = "rf",
               preProc = c("center", "scale", "zv"),
               metric = "RMSE",
               trControl = ctrl,
               tuneGrid = data.frame(mtry = ncol(tr)+1)
               )

您看到警告:

There were 11 warnings (use warnings() to see them)

结果与最终模型不同:

mod$results

 mtry     RMSE  Rsquared      MAE   RMSESD RsquaredSD     MAESD
1   12 2.203626 0.9159377 1.880211 0.979291  0.1025424 0.7854203

 mod$finalModel

Call:
 randomForest(x = x, y = y, mtry = param$mtry)
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 10

          Mean of squared residuals: 6.088637
                    % Var explained: 82.7

因此,尽管您指定了mtry = 12,但是默认的randomForest函数将其降低到10,这是明智的。但是,如果过分乐观,那么一旦经过ncol(tr)-1,您将永远无法获得有意义的东西。

如果没有太多变量,则使用tuneLength或指定要使用的mtry会容易得多。让我们从仅指定mtry的预期结果开始:

library(caret)
library(randomForest)

ctrl = trainControl(method="cv",repeats=3)
#use mtcars
tr = mtcars
# set mpg to be Effort so your function works
colnames(tr)[1] = "Effort"

TG =  data.frame(mtry=1:10)
mod <- train(Effort ~ ., data = tr,
               method = "rf",
               preProc = c("center", "scale", "zv"),
               metric = "RMSE",
               trControl = ctrl,
               tuneGrid = TG)

mod$results
   mtry     RMSE  Rsquared      MAE   RMSESD RsquaredSD    MAESD
1     1 2.725944 0.8895202 2.384232 1.350958  0.1592133 1.183400
2     2 2.498627 0.9012830 2.192391 1.276950  0.1375281 1.200895
3     3 2.506250 0.8849148 2.168141 1.229709  0.1562686 1.173904
4     4 2.503700 0.8891134 2.170633 1.249049  0.1478276 1.168831
5     5 2.480846 0.8837597 2.148329 1.250889  0.1540574 1.191068
6     6 2.459317 0.8872104 2.126315 1.196187  0.1554423 1.128351
7     7 2.493736 0.8736399 2.165258 1.158384  0.1766644 1.082568
8     8 2.530672 0.8768546 2.199941 1.224193  0.1681286 1.127467
9     9 2.547422 0.8757422 2.196878 1.222921  0.1704655 1.130261
10   10 2.514791 0.8720315 2.184602 1.224944  0.1740556 1.093184

也许最好的尝试是6。

答案 2 :(得分:0)

@Javed @狼

请注意,id确实可以调整mtry。 mtry将影响您生长的树之间的相关性(因此模型的差异),并且它是非常特定于问题的,因此最佳值可能会根据您拥有的特征数量及其之间的相关性而变化。 但是,调整与偏差相关的超参数(最大深度和其他停止/修剪规则)非常没用。这会花费很多时间,而且效果通常并不明显。