遍历所有级别并将每个级别值用作定义新变量的过滤器

时间:2020-01-06 20:45:35

标签: r purrr

这是我的建模工作流程中的功能的子集:

 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的每个变化,对该变化进行滤波,然后获取均值。等

还是我已经在做的最简单的方法?如果我更改任何调整参数,似乎是手动操作,容易出错。

0 个答案:

没有答案