如何创建嵌套的训练集和测试集?

4

我正在使用R中的ChickWeight数据集进行工作。 我想为每只小鸡创建多个模型,每个模型都是针对单个小鸡进行训练的。因此,我正在将数据嵌套以便为每个小鸡创建一个数据框,并将其存储在列表列中。

以下是开始:

library(tidyverse)
library(datasets)
data("ChickWeight")

ChickWeightNest <- ChickWeight %>% 
  group_by(Chick) %>% 
  nest()

从这里开始,同时在所有数据帧上训练线性回归模型非常容易,只需构建该模型作为函数,然后变异一个新列并映射即可。但是,构建更复杂的模型(例如xgboost)需要首先将数据分成测试集和训练集。我该如何一次将所有嵌套的数据框拆分为训练集和测试集,以便可以同时训练多个模型?

顺便说一下,我在研究中发现训练/调整多个模型的信息似乎相对稀少,非常感谢任何相关资源或过去的堆栈问题。


2
请查看此Tidymodels嵌套重采样教程 - Desmond
2个回答

1
也许您想要像这样的东西,首先在新列中随机抽样每只小鸡的训练或测试数据,以便稍后使用,并再次分组以将数据嵌套到每个组中:
library(dplyr)
library(tidyr)
library(datasets)
data("ChickWeight")

ChickWeight %>% 
  group_by(Chick) %>% 
  rowwise() %>%
  mutate(split = sample(c("train", "test"), n(), replace = FALSE)) %>%
  group_by(Chick) %>%
  nest() 
#> # A tibble: 50 × 2
#> # Groups:   Chick [50]
#>    Chick data             
#>    <ord> <list>           
#>  1 1     <tibble [12 × 4]>
#>  2 2     <tibble [12 × 4]>
#>  3 3     <tibble [12 × 4]>
#>  4 4     <tibble [12 × 4]>
#>  5 5     <tibble [12 × 4]>
#>  6 6     <tibble [12 × 4]>
#>  7 7     <tibble [12 × 4]>
#>  8 8     <tibble [11 × 4]>
#>  9 9     <tibble [12 × 4]>
#> 10 10    <tibble [12 × 4]>
#> # … with 40 more rows

本文由reprex软件包 (v2.0.1)于2022年06月29日创建


1
关键在于意识到嵌套数据的每一行都是一个列表,因此您必须对其使用列表函数,例如来自基本R的lapply或来自purrr的map
以下是使用rsample包进行拆分(75%用于训练)的示例。
ChickWeightNest_example<- ChickWeightNest %>%
  mutate(data_split = purrr::map(data,
                       ~rsample::initial_split(.x, prop = .75))) %>%
  mutate(data_training_only= purrr::map(data_split,
                             ~rsample::training(.x)),
         data_testing_only= purrr::map(data_split, 
                             ~rsample::testing(.x))
  )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接