R: Почему pmap не работает, а map2 работает?

Я новичок в R и обучаюсь некоторым методам машинного обучения. В настоящее время я работаю над настройкой гиперпараметров и, чтобы лучше разобраться в этом вопросе, я стараюсь выполнять задачи больше вручную, чем это необходимо. Итак, я использую таблицу со столбцами списка, где каждая строка содержит, среди прочего, свертывание перекрестной проверки обучающего набора и определенные значения гиперпараметров алгоритма случайного леса. Вся сетка содержит все их уникальные комбинации в указанном диапазоне. Модели должны быть построены путем повторения функции ranger по всем строкам (т. Е. Комбинаций сворачивания / параметров), а затем сохранены в столбце списка. Для этой цели я использую семейство функций карты пакета purrr.

Проблема в том, что этот подход работает только при отображении данных и одного единственного параметра (mtry) на функцию ranger с помощью map2. Я знаю, что мне нужно использовать pmap при сопоставлении более двух элементов функции. Но это, в отличие от случая с двумя элементами, описанного ранее, не работает для меня с данными и двумя параметрами (mtry и min.node.size) в качестве элементов. Функция pmap каким-то образом не может сопоставить третий элемент (min.node.size) в качестве аргумента функции ranger, и я получаю следующую ошибку:

«Ошибка в рейнджере (виды ~., data = .x, mtry = .y, min.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 в этом случае, чтобы выполнялись случайные модели леса.

С наилучшими пожеланиями


person francesco    schedule 15.05.2019    source источник


Ответы (1)


На странице справки ?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 и т. Д.

person Artem Sokolov    schedule 15.05.2019
comment
Большое спасибо! Это было чрезвычайно полезно. - person francesco; 16.05.2019