我对R相当陌生,正在自学一些机器学习技术。目前,我正在着手进行超参数调整,以更好地理解该问题,我尝试以手动方式完成任务,而不是需要做的事情。因此,我使用带有列表列的小标题,其中每一行除其他外还包含训练集交叉验证折叠和随机森林算法的某些超参数值。整个网格包含指定范围内的所有这些唯一组合。
应通过在所有行(即折叠/参数组合)上迭代ranger
函数来构建模型,然后将其保存到列表列中。为此,我使用purrr包的map函数系列。
问题在于,该方法仅在使用ranger
将数据和一个参数( mtry )映射到map2
函数时才有效。我知道将两个以上的元素映射到一个函数时需要使用pmap
。但是,这与前面介绍的两个元素的情况不同,它不适用于以数据和两个参数( mtry和min.node.size )作为元素的情况。 pmap
函数无法将第三个元素( min.node.size )作为参数映射到ranger
函数,并且出现以下错误:
”游侠错误(物种〜。,数据= .x,mtry = .y,最小node.size = .z): 找不到对象“ .z””
这是我使用虹膜数据集的代码:
### used packages
library(tidyverse)
library(ranger)
library(rsample)
### data preparation
set.seed(123)
initial_split_data <- initial_split(iris, prop = 0.8)
training <- training(initial_split_data)
testing <- testing(initial_split_data)
cv_split <- vfold_cv(training, v = 3)
cv_data <- cv_split %>%
mutate(train = map(.x = splits, .f = ~training(.x)),
validate = map(.x = splits, .f = ~testing(.x)),
validate_species = map(.x = validate, .f = ~.x$Species))
### modeling
## two elements being mapped works:
random_forest_model_mtry <- cv_data %>%
crossing(mtry = seq(2,4,1)) %>%
mutate(model = map2(.x = train, .y = mtry,
.f = ~ranger(Species ~., data = .x, mtry = .y)))
## three elements being mapped does not work:
random_forest_model_mtry_minnode <- cv_data %>%
crossing(mtry = seq(2,4,1),
min.node.size = seq(1,5,1)) %>%
mutate(model = pmap(list(.x = train, .y = mtry, .z = min.node.size),
.f = ~ranger(Species ~., data = .x, mtry = .y, min.node.size = .z)))
在这种情况下,如果有人可以告诉我如何正确使用pmap
以便执行随机森林模型,这将非常有帮助。
最诚挚的问候
答案 0 :(得分:2)
在?pmap
帮助页面上:
.f: A function, formula, or vector (not necessarily atomic). If a *function*, it is used as is. If a *formula*, e.g. ‘~ .x + 2’, it is converted to a function. There are three ways to refer to the arguments: • For a single argument function, use ‘.’ • For a two argument function, use ‘.x’ and ‘.y’ • For more arguments, use ‘..1’, ‘..2’, ‘..3’ etc
对于多个参数,我们需要将.x
,.y
等替换为..1
,..2
等。
random_forest_model_mtry_minnode <- cv_data %>%
crossing(mtry = seq(2,4,1),min.node.size = seq(1,5,1)) %>%
mutate(model = pmap(list(train, mtry, min.node.size),
.f = ~ranger(Species ~., data = ..1,
mtry = ..2, min.node.size = ..3)))
请注意,参数列表(在您的情况下为list(train, mtry, min.node.size)
)的元素可以未命名。重要的是它们的顺序,因为..1
,..2
等被引用。