插入符号交叉验证随机森林法中的mtry

插入符号交叉验证随机森林法中的mtry,r,random-forest,cross-validation,r-caret,R,Random Forest,Cross Validation,R Caret,我有一个包含499个观察值和1412个变量的数据框。我将数据帧拆分为训练集和测试集,并使用随机森林方法在插入符号5倍交叉验证中尝试训练集。我的问题是,随机森林法交叉验证如何选择mtry值?例如,如果查看绘图,为什么程序不选择30作为mtry的stating值 要回答这个问题,需要检查rf型号的 从链接的代码可以清楚地看出,如果指定了网格搜索,则插入符号将使用插入符号::var_seq函数生成mtry mtry = caret::var_seq(p = ncol(x),

我有一个包含499个观察值和1412个变量的数据框。我将数据帧拆分为训练集和测试集,并使用随机森林方法在插入符号5倍交叉验证中尝试训练集。我的问题是,随机森林法交叉验证如何选择mtry值?例如,如果查看绘图,为什么程序不选择30作为mtry的stating值


要回答这个问题,需要检查rf型号的

从链接的代码可以清楚地看出,如果指定了网格搜索,则插入符号将使用
插入符号::var_seq
函数生成mtry

mtry = caret::var_seq(p = ncol(x), 
                      classification = is.factor(y), 
                      len = len)
从函数的帮助中可以看出,如果预测器的数量小于500,则在2和p之间生成一个简单的长度len值序列。对于较大数量的预测器,使用log2步骤创建序列

例如:

caret::var_seq(p = 1412, 
               classification = T, 
               len = 3)
#output
[1]    2   53 1412
如果指定了
len=1
,则将使用来自的默认值:

mtry = if (!is.null(y) && !is.factor(y))
       max(floor(ncol(x)/3), 1) else floor(sqrt(ncol(x)))
如果指定了随机搜索,则插入符号将mtry计算为:

unique(sample(1:ncol(x), size = len, replace = TRUE)
换句话说,对于您的情况:

unique(sample(1:1412 , size = 3, replace = TRUE))
#output
[1] 857 181  64
以下是一个例子:

library(caret)
#some data
z <- matrix(rnorm(100000), ncol = 1000)
colnames(z) = paste0("V", 1:1000)
#specify model evaluation
ctrl <- trainControl(method = "repeatedcv",
                     number = 10,
                     repeats = 1)
#train
fit_rf <- train(V1 ~.,
            data = z,
            method = "rf",
            tuneLength = 3,
            trControl = ctrl)
fit_rf$results
#output
  mtry      RMSE   Rsquared       MAE    RMSESD RsquaredSD     MAESD
1    2 0.8030665 0.11101385 0.5889436 0.2824439 0.09644324 0.1650381
2   44 0.8146023 0.09481331 0.6014367 0.2821711 0.10082099 0.1665926
3  998 0.8420705 0.03190199 0.6375570 0.2503089 0.03205335 0.1550021
指定随机搜索时:

ctrl <- trainControl(method = "repeatedcv",
                     number = 10,
                     repeats = 1,
                     search = "random")

fit_rf <- train(V1 ~.,
                data = z,
                method = "rf",
                tuneLength = 3,
                trControl = ctrl)
fit_rf$results
#output
  mtry      RMSE   Rsquared       MAE    RMSESD RsquaredSD      MAESD
1  350 0.8571330 0.10195986 0.6214896 0.1637944  0.1385415 0.09904165
2  826 0.8644918 0.07775553 0.6286101 0.1725390  0.1264605 0.10587076
3  855 0.8636692 0.07025535 0.6232729 0.1754164  0.1332580 0.10438083

要将mtry固定到所需的值,最好提供您自己的搜索网格。可以找到有关如何执行此操作以及更多操作的教程。

谢谢您的回答,但我不明白此var_seq函数如何查找mtry的值,我在插入符号中找不到任何内容documentations@ch.elahe您是否尝试过
?插入符号::var_seq
。如果预测值超过500个,则使用以下方法生成序列:
floor(2^seq(1,to=log(p,base=2),length=len)
yes I checked?caret::var_seq但文档不完整问题是为什么这个序列是mtry的最佳值这些不是最佳值,这些只是一些从最小值到最大值的值,如果这些值接近最小值,则权重可能更高。最佳值只能根据经验确定因此,我建议每个数据集提供您自己的值。对于超过1000的功能集,不是3个值,而是10+。
ctrl <- trainControl(method = "repeatedcv",
                     number = 10,
                     repeats = 1,
                     search = "random")

fit_rf <- train(V1 ~.,
                data = z,
                method = "rf",
                tuneLength = 3,
                trControl = ctrl)
fit_rf$results
#output
  mtry      RMSE   Rsquared       MAE    RMSESD RsquaredSD      MAESD
1  350 0.8571330 0.10195986 0.6214896 0.1637944  0.1385415 0.09904165
2  826 0.8644918 0.07775553 0.6286101 0.1725390  0.1264605 0.10587076
3  855 0.8636692 0.07025535 0.6232729 0.1754164  0.1332580 0.10438083
unique(sample(1:999 , size = 3, replace = TRUE))