【发布时间】:2020-07-11 16:12:03
【问题描述】:
我看过各种帖子,介绍如何使用 expand.grid 为模型选择自变量,然后根据该选择创建公式。但是,我事先准备好输入表并将它们存储在列表中。
library(ranger)
data(iris)
Input_list <- list(iris1 = iris, iris2 = iris) # let's assume these are different input tables
我很想为我的输入表列表尝试给定算法的所有可能超参数组合(此处:使用ranger 的随机森林)。我执行以下操作来设置网格:
hyper_grid <- expand.grid(
Input_table = names(Input_list),
Trees = c(10, 20),
Importance = c("none", "impurity"),
Classification = TRUE,
Repeats = 1:5,
Target = "Species")
> head(hyper_grid)
Input_table Trees Importance Classification Repeats Target
1 iris1 10 none TRUE 1 Species
2 iris2 10 none TRUE 1 Species
3 iris1 20 none TRUE 1 Species
4 iris2 20 none TRUE 1 Species
5 iris1 10 impurity TRUE 1 Species
6 iris2 10 impurity TRUE 1 Species
我的问题是,将这些值传递给模型的最佳方式是什么?目前我正在使用for loop:
for (i in 1:nrow(hyper_grid)) {
RF_train <- ranger(
dependent.variable.name = hyper_grid[i, "Target"],
data = Input_list[[hyper_grid[i, "Input_table"]]], # referring to the named object in the list
num.trees = hyper_grid[i, "Trees"],
importance = hyper_grid[i, "Importance"],
classification = hyper_grid[i, "Classification"]) # otherwise regression is performed
print(RF_train)
}
遍历网格的每一行。但是一方面,我现在必须告诉模型它是分类还是回归。我假设因子Species 被转换为数字因子水平,因此默认情况下会发生回归。有没有办法防止这种情况并使用例如apply 这个角色?这种迭代方式也会导致函数调用混乱:
Call:
ranger(dependent.variable.name = hyper_grid[i, "Target"], data = Input_list[[hyper_grid[i, "Input_table"]]], num.trees = hyper_grid[i, "Trees"], importance = hyper_grid[i, "Importance"], classification = hyper_grid[i, "Classification"])
第二:实际上,模型的输出显然没有打印出来,但我立即捕获了重要的结果(主要是RF_train$confusion.matrix)并将结果写入同一行的hyper_grid的扩展版本与输入参数。这种性能是否明智但代价高昂?因为如果我存储游侠对象,我会在某些时候遇到内存问题。
谢谢!
【问题讨论】:
标签: r grid-search