【问题标题】:mtry in Caret cross validation Random Forest method插入符号交叉验证随机森林方法中的 mtry
【发布时间】:2018-06-12 03:24:36
【问题描述】:

我有一个包含 499 个观察值和 1412 个变量的数据框。我将我的数据框拆分为训练集和测试集,并通过随机森林方法在 Caret 5 折交叉验证中尝试训练集。我的问题是随机森林方法的交叉验证如何选择 mtry 的值?例如,如果你看一下情节,为什么程序不选择 30 作为 mtry 的统计值?

【问题讨论】:

    标签: r random-forest cross-validation r-caret


    【解决方案1】:

    要回答这个问题,需要查看train code 的射频模型。

    从链接的代码中可以清楚地看出,如果指定了网格搜索,插入符号将使用caret::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,则使用randomForest package 中的默认值:

    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
    

    与通过以下操作获得的 mtry 值相同:

    caret::var_seq(p = 999, 
                   classification = F, 
                   len = 3)
    

    指定随机搜索时:

    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))
    

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

    【讨论】:

    • 感谢您的回答,但我不明白这个 var_seq 函数如何找到 mtry 的值,我在 Caret 文档中找不到任何内容
    • @ch.elahe 你试过?caret::var_seq。在超过 500 个预测变量的情况下,使用以下命令生成序列:floor(2^seq(1, to = log(p, base = 2), length = len)
    • 是的,我检查了 ?caret::var_seq 但文档不完整问题是为什么这个序列结果是 mtry 的最佳值
    • 这些不是最佳值,这些只是从最小值到最大值的一些值,如果值更接近最小值,则可能具有更高的权重。最佳值只能根据经验确定每个数据集,因此我建议提供您自己的值。对于超过 1000 个的功能集,不是 3 个值,而是 10+ 个。
    猜你喜欢
    • 2015-06-15
    • 2018-09-03
    • 2014-04-16
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2019-09-15
    • 2021-07-05
    相关资源
    最近更新 更多