Вот подмножество функций в моем рабочем процессе моделирования:
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.
Или это то, что я уже делаю самым простым способом? Это кажется ручным и может привести к ошибке, если я внесу изменения в какие-либо параметры настройки.