【问题标题】:How to random search in a specified grid in caret package?如何在插入符号包中的指定网格中随机搜索?
【发布时间】:2019-05-12 00:15:39
【问题描述】:

我想知道是否可以在预定义的网格中使用随机搜索。例如,我的网格有alphalambda 用于glmnet 方法。 alpha 介于 0 和 1 之间,lambda 介于 -10 和 10 之间。我想使用随机搜索 5 次来随机尝试此范围内的点。我为网格搜索编写了以下代码,它工作正常,但我无法修改它以进行随机搜索。

rand_ctrl <- trainControl(method = "repeatedcv", repeats = 5,
                          search = "random")
grid <- expand.grid(alpha=seq(0,1,0.1),lambda=seq(-10,10,1)) # I think this should be modified
rand_search <- train(Response ~ ., data = train_dat,
                     method = "glmnet",
                     ## Create 20 random parameter values
                     metric = "RMSE",
                     tuneLength = 5,
                     preProc = c("scale"),
                     tuneGrid = grid,
                     trControl = rand_ctrl)

【问题讨论】:

    标签: r regression r-caret training-data hyperparameters


    【解决方案1】:

    一种方法是定义一个网格并使用sample 选择几个随机行:

    set.seed(1)
    samp <- sample(1:nrow(grid), 5)
    grid[samp,]
    #output
        alpha lambda
    62    0.6     -5
    86    0.8     -3
    132   1.0      1
    208   0.9      8
    46    0.1     -6
    

    然后将此子集用作tuneGrid 参数

    另一种方法是使用runif,它根据由下限和上限定义的均匀分布生成随机数:

    set.seed(1)
    data.frame(alpha = runif(5, 0 , 1),
               lambda = runif(5, -10, 10))
    #output
          alpha    lambda
    1 0.2655087  7.967794
    2 0.3721239  8.893505
    3 0.5728534  3.215956
    4 0.9082078  2.582281
    5 0.2016819 -8.764275
    

    并将其作为tuneGrid 参数提供。

    第二种方法不是从网格中选择随机元素,而是在定义的最小值和最大值之间选择随机数。

    【讨论】:

    • 有道理。我怎么想不到这一点。无论如何,感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-07-30
    • 2022-01-04
    • 2015-10-24
    • 1970-01-01
    • 2022-01-14
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多