如何在caret软件包中指定的网格中进行随机搜索?

3

我想知道是否可以在预定义的网格中使用随机搜索。例如,我的网格对于glmnet方法有alphalambda。其中,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)
1个回答

6

一种方法是定义网格并使用 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参数提供。

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


有道理。我怎么没想到呢。不管怎样,谢谢你的帮助。 - Reiso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接