R - 样本同时仍然保持某些分类变量的相同比例

R - Sample while still keeping the same proportion of some categorical variable

我想从我的数据集中制作一个随机训练样本和测试样本(大约 80%-20%)。但是,我有一个分类变量,它是 0 或 1,并且希望在两个样本中保持 1 与 0 的比例相同。我尝试了几种不同的方法,例如 sample_frac,但没有成功。

怎么能做出这样的事情?

一定有更短的方法,但这对你有用。我以 mtcars 为例。在第一个版本中,我只是从整个事物中采样,我们在 'am' 因子(二进制,0/1)中看到不同的大小,在第二个实例中,我将数据帧一分为二并使用 sample_n 从每行中取出 x 行,然后重新组合。

mtcars <- mtcars

sampled <- sample(nrow(mtcars), nrow(mtcars) * 0.5)
sampled

mtcars_sampled <- mtcars[sampled,]
mtcars_sampled
  
nrow(mtcars_sampled)

mtcars_sampled %>%
  group_by(am) %>%
  summarize(count = length(am))

mtcars_group_one <- mtcars %>% 
  filter(am == 1)

mtcars_group_two <- mtcars %>% 
  filter(am == 0)

sampled_one <- sample_n(mtcars_group_one, size = 8)
sampled_one

sampled_two <- sample_n(mtcars_group_two, size = 8)
sampled_two

sampled_even_weight <- bind_rows(sampled_one, sampled_two)
nrow(sampled_even_weight)

sampled_even_weight %>%
  group_by(am) %>%
  summarize(count = length(am))

最后,为了将数据拆分为 test/train,我会这样做:

  train.rows <- sample(nrow(sampled_even_weight), nrow(sampled_even_weight) * 0.8)
  mtcars_train <- sampled_even_weight[train.rows,]
  mtcars_test <- sampled_even_weight[-train.rows,]

这个的技术术语是 'stratified sampling',RStudio 的人们为此目的制作了 rsample。使用 initial_split() 函数并将 strata = 设置为您希望在集合中具有均匀比例的分类变量。在初始拆分上使用 training() 来访问您的训练集,同样使用 testing():

library(rsample)

set.seed(2021)
split <- rsample::initial_split(iris, prop = 0.8, strata = Species)

training_set <- rsample::training(split)
testing_set <- rsample::testing(split)