L oop через все уровни и использовать каждое значение уровня в качестве фильтра для определения новой переменной - PullRequest
1 голос
/ 06 января 2020

Вот подмножество функций в моем рабочем процессе моделирования:

 model_ranger %>% select(splits, id, mtry, mae)
# A tibble: 10 x 4
   splits            id     mtry   mae
   <named list>      <chr> <dbl> <dbl>
 1 <split [72K/18K]> Fold1     1  261.
 2 <split [72K/18K]> Fold1     2  265.
 3 <split [72K/18K]> Fold2     1  278.
 4 <split [72K/18K]> Fold2     2  281.
 5 <split [72K/18K]> Fold3     1  258.
 6 <split [72K/18K]> Fold3     2  262.
 7 <split [72K/18K]> Fold4     1  291.
 8 <split [72K/18K]> Fold4     2  295.
 9 <split [72K/18K]> Fold5     1  289.
10 <split [72K/18K]> Fold5     2  295.

Это было для обучения случайного леса рейнджера в 5 сгибах с двумя значениями mtry, чтобы попробовать.

У меня есть несколько объектов, подобных приведенному выше, у меня есть похожий объект для модели, которую я пробовал в тех же сгибах, используя xgboost:

model_xgb %>% select(splits, id, nrounds, mae)
# A tibble: 15 x 4
   splits            id    nrounds   mae
   <named list>      <chr>   <dbl> <dbl>
 1 <split [72K/18K]> Fold1     100  262.
 2 <split [72K/18K]> Fold1     150  262.
 3 <split [72K/18K]> Fold1     200  262.
 4 <split [72K/18K]> Fold2     100  278.
 5 <split [72K/18K]> Fold2     150  278.
 6 <split [72K/18K]> Fold2     200  278.
 7 <split [72K/18K]> Fold3     100  258.
 8 <split [72K/18K]> Fold3     150  258.
 9 <split [72K/18K]> Fold3     200  258.
10 <split [72K/18K]> Fold4     100  291.
11 <split [72K/18K]> Fold4     150  291.
12 <split [72K/18K]> Fold4     200  291.
13 <split [72K/18K]> Fold5     100  290.
14 <split [72K/18K]> Fold5     150  290.
15 <split [72K/18K]> Fold5     200  290.

Я хотел бы сравнить каждую модель и каждый вариант каждой модели рядом сторона через 5 сгибов на Мэй.

То, что я сейчас делаю, это:

model_list <- list(
  model_ranger_mtry_1 = model_ranger %>% filter(mtry == 1),
  model_ranger_mtry_2 = model_ranger %>% filter(mtry == 2),
  model_xgb_nrounds_100 = model_xgb %>% filter(nrounds == 100),
  model_xgb_nrounds_150 = model_xgb %>% filter(nrounds == 150),
  model_xgb_nrounds_200 = model_xgb %>% filter(nrounds == 200)
)

# compare models
model_list %>% 
  imap(~tibble(
    model_name = .y,
    mae = mean(.x$mae),
    rmse = mean(.x$rmse)
  )) %>% 
  bind_rows()

Это работает. Я вижу среднее значение mae для каждого типа и варианта модели.

Мой вопрос заключается не в том, чтобы вручную вводить каждую вариацию в списке моделей, например:

  model_ranger_mtry_1 = model_ranger %>% filter(mtry == 1),
  model_ranger_mtry_2 = model_ranger %>% filter(mtry == 2),

Есть ли способ сделать это умным коротким способом? ? Где, для каждого варианта я бы определил элемент списка. От рейнджера до xgboost, где первый использует mtry в качестве варианта для фильтрации, затем получает среднее значение, в то время как для xgb один получает каждую вариацию nrounds, фильтрует эту вариацию и получает среднее. et c.

Или это то, что я уже делаю самым простым способом? Это кажется ручным и может привести к ошибке, если я внесу изменения в какие-либо параметры настройки.

1 Ответ

1 голос
/ 07 января 2020

Это можно сделать с помощью split. Полученные списки можно затем переименовать по мере необходимости.

model_list1 <- split(model_ranger, model_ranger$mtry)
names(model_list1) <- paste0("model_ranger_mtry_", names(model_list1))

model_list2 <- split(model_xgb, model_xgb$nrounds)
names(model_list2) <- paste0("model_xgb_nrounds_", names(model_list2))

> c(model_list1, model_list2)

$model_ranger_mtry_1
splits    id mtry mae
1 <split [72K/18K]> Fold1    1 261
3 <split [72K/18K]> Fold2    1 278
5 <split [72K/18K]> Fold3    1 258
7 <split [72K/18K]> Fold4    1 291
9 <split [72K/18K]> Fold5    1 289

$model_ranger_mtry_2
splits    id mtry mae
2  <split [72K/18K]> Fold1    2 265
4  <split [72K/18K]> Fold2    2 281
6  <split [72K/18K]> Fold3    2 262
8  <split [72K/18K]> Fold4    2 295
10 <split [72K/18K]> Fold5    2 295

$model_xgb_nrounds_100
splits    id nrounds mae
1  <split [72K/18K]> Fold1     100 262
4  <split [72K/18K]> Fold2     100 278
7  <split [72K/18K]> Fold3     100 258
10 <split [72K/18K]> Fold4     100 291
13 <split [72K/18K]> Fold5     100 290

$model_xgb_nrounds_150
splits    id nrounds mae
2  <split [72K/18K]> Fold1     150 262
5  <split [72K/18K]> Fold2     150 278
8  <split [72K/18K]> Fold3     150 258
11 <split [72K/18K]> Fold4     150 291
14 <split [72K/18K]> Fold5     150 290

$model_xgb_nrounds_200
splits    id nrounds mae
3  <split [72K/18K]> Fold1     200 262
6  <split [72K/18K]> Fold2     200 278
9  <split [72K/18K]> Fold3     200 258
12 <split [72K/18K]> Fold4     200 291
15 <split [72K/18K]> Fold5     200 290
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...