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)
我想从我的数据集中制作一个随机训练样本和测试样本(大约 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)