R: Почему pmap не работает, а map2 работает? - PullRequest
1 голос
/ 16 мая 2019

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

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

"Ошибка в рейнджере (Вид ~., Данные = .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 в этом случае, чтобы модели случайных лесов выполнялись.

С уважением

1 Ответ

2 голосов
/ 16 мая 2019

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

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 и т. Д.

...