R 列函数中未使用的参数

R 列函数中未使用的参数,r,random-forest,hyperparameters,R,Random Forest,Hyperparameters,大家好 当我使用射频超参数调谐时,我的代码有问题。该算法(模拟退火)给了我4000的RMSE值。我不确定从何处执行此计算,因为在代码中我没有指定任何网格/值?下面是代码,最初用于SVM,但我为RF编辑 svm_obj <- function(param, maximize = FALSE) { mod <- train(Effort ~ ., data = tr, method = "rf", preProc = c("

大家好

当我使用射频超参数调谐时,我的代码有问题。该算法(模拟退火)给了我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

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

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

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)
               )
结果和最终模型不一致:

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,这是合理的。但是如果你在optim上尝试这个,一旦你在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
库(插入符号)
图书馆(森林)
ctrl=列车控制(方法=“cv”,重复次数=3)
#使用地铁车辆
tr=mtcars
#将mpg设置为“努力”,以便您的函数工作
colnames(tr)[1]=“努力”
TG=数据帧(mtry=1:10)
mod@Javed@Wolf

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

@Divide DN,代码最初用于SVM的参数(C和Sigma),我为RF编辑了这些参数。你认为我不应该用10的幂来表示mtry的值吗?这是正确的。Mtry告诉您树应该使用多少变量。我不知道你在用什么软件包——如果它是R的randomforest,那么它应该是一个介于1和numcol(x)之间的整数,但是其他软件包可能会在比率方面使用它,所以在0和1之间。嘿,它适合我。你犯了什么错误?你的Mtry应该在0到1之间。我在下面发布了类似于答案的内容,如果你能让它工作,请告诉我。非常感谢你的努力。然而,当我使用一些优化算法时,问题就出现了。我已经编辑了这个问题,请你看一下。在这一点上,我不确定这个算法(模拟退火)是如何计算结果的,因为mtry值在代码中的任何地方都没有初始化。它给了我答案,但我对此表示怀疑answer@JavedKhan,优化您现在的工作方式没有意义。1.mtry必须小于预测器的数量,并且必须是整数。如上所述,我不知道你的数据,但最好在一系列值上尝试tuneLength或tuneGrid,并考虑它们是否能够真正收敛,或给出错误收敛,最后,收敛是否有意义。嗨,StupidWolf,我的数据(因变量是努力)是一个连续数据,如234.5453.0,1111.26等等,根据你上面的陈述,如果我使用tuneLength,我只需要指定一个值,即15,如果使用tuneGrid,我需要使用expand.grid并指定expand.grid(mtry={1,3,5,7,9}这样的列表.但在这种情况下,我不确定以后如何在优化算法中使用这些信息,比如模拟退火算法,它有以下代码:san_res@JavedKhan,我的观点是,在mtry上进行optim没有什么好处。这真的没有意义。
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