【问题标题】:unused argument in train functiontrain 函数中未使用的参数
【发布时间】:2020-03-29 07:59:00
【问题描述】:

祝大家今天好

我在使用 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

【问题讨论】:

  • 嘿,它对我有用。你得到了什么错误?你的 Mtry 应该在 0 到 1 之间。
  • 我在下面发布了类似答案的内容,请告诉我您是否可以使用它

标签: r random-forest hyperparameters


【解决方案1】:

嗯,我不知道你用什么值调用你的函数,所以很难发现错误。

但是,mtry 是一个需要介于 1 和列数之间的值,而在我看来,您可能会将其设置为 10 的幂次方 - 这很可能超出范围 :)

【讨论】:

  • @Divide DN,代码本来是为SVM(C和Sigma)的参数,我为RF编辑的。你认为我不应该使用 10 的幂来计算 mtry 的值吗?
  • 没错。 Mtry 告诉你你的树应该使用多少个变量。我不知道您使用的是什么包 - 如果它是 R 的随机森林,那么它应该是 1 和 numcol(x) 之间的整数,但其他包可能会按照比率使用它,因此介于 0 和 1 之间。
【解决方案2】:

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 这样的东西是你能得到的最好的 mtry。

【讨论】:

  • 非常感谢您的努力。但是,当我使用一些优化算法时,问题就出现了。我已经编辑了这个问题,如果你能看一下。在这一点上,我不确定这个算法(模拟退火)是如何计算结果的,因为 mtry 值没有在他的代码中的任何地方初始化。它给了我答案,但我怀疑这个答案
  • @JavedKhan,优化你现在做的方式没有意义。 1. mtry 必须小于预测变量的数量,并且必须是整数。见上文
  • 我不知道你的数据,但最好在一系列值上尝试 tuneLength 或 tuneGrid,并考虑它们是否真的可以收敛,或者给出错误的收敛,最后,收敛是否有意义。
  • 嗨 StupidWolf,我的数据(因变量是 Effort)是一个连续数据,如 234.5、453.0、1111.26 等。所以根据你上面的陈述,如果我使用 tuneLength,我只指定一个值,即 15如果使用 tuneGrid,我需要使用 expand.grid 并指定像 expand.grid(mtry={1,3,5,7,9} 这样的列表。但在这种情况下,我不确定如何使用这些信息后面的优化算法如模拟退火,代码如下:san_res
  • @JavedKhan,我的意思是,在 mtry 上做 optim 并没有什么好处。这真的没有意义。
【解决方案3】:

@Javed @Wolf

请注意 id 确实对调整 mtry 有意义。 mtry 将影响您生长的树之间的相关性(因此模型的方差),并且它是非常特定于问题的,因此最佳值可能会根据您拥有的特征数量和它们之间的相关性而改变。 然而,调整与偏差相关的超参数(最大深度和其他停止/修剪规则)是毫无用处的。这需要很长时间,而且效果通常并不显着。

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 2018-03-16
    • 2023-03-16
    • 2020-02-24
    • 2018-02-13
    • 2020-03-14
    • 2015-10-01
    • 2014-05-23
    相关资源
    最近更新 更多