这是我的建模工作流程中的功能的子集:
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.
我想在mae的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()
这有效。我看到每种模型类型和变体的平均水平。
我的问题是,而不是例如在模型列表中手动键入每个变体。
model_ranger_mtry_1 = model_ranger %>% filter(mtry == 1),
model_ranger_mtry_2 = model_ranger %>% filter(mtry == 2),
是否有聪明的捷径?在哪里,对于每个变体,我都会定义一个列表元素。从Ranger到xgboost,第一个使用mtry作为变体进行滤波,然后获取均值,而对于xgb则获取nround的每个变化,对该变化进行滤波,然后获取均值。等
还是我已经在做的最简单的方法?如果我更改任何调整参数,似乎是手动操作,容易出错。