大家好!
使用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
答案 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将影响您生长的树之间的相关性(因此模型的差异),并且它是非常特定于问题的,因此最佳值可能会根据您拥有的特征数量及其之间的相关性而变化。 但是,调整与偏差相关的超参数(最大深度和其他停止/修剪规则)非常没用。这会花费很多时间,而且效果通常并不明显。