我对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
以便执行随机森林模型,这将非常有帮助。最好的祝福
最佳答案
在?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
等引用的。