使用R中sample()生成多次6:2:2 train/val/test拆分的相关问题咨询
问题1:test集观测数波动的原因
你的数据集总共只有10行,预期test占20%即2条的前提是固定每个分组的样本量,但你当前的实现逻辑是对每一行独立按0.6/0.2/0.2的概率分配到train/val/test分组,属于独立随机抽样:
- 10个样本中最终落入test集的数量服从参数为
n=10, p=0.2的二项分布,经计算出现1条的概率约27%、出现2条的概率约30%、出现3条的概率约20%,因此观测到数量波动属于正常现象。 - 这种抽样逻辑是按概率比例分配,仅在样本量极大时各组占比才会无限接近预设比例,小样本下必然出现波动。
问题2:sample()的replace参数作用与设置建议
replace参数的作用
replace参数控制抽样是否允许重复:
- 设为
TRUE为有放回抽样:同一个值可以被多次抽取,你当前的代码中待抽样的向量是1:3,要抽取10次(和数据行数一致),必须开有放回抽样才能实现给每一行分配分组标签的逻辑。 - 设为
FALSE为无放回抽样:每个值只能被抽一次,你当前的场景下待抽样的向量只有3个元素,抽样次数大于向量长度,直接会触发报错,因此你当前的代码不能将replace设为FALSE。
实现固定分组样本量的修改方案
如果你需要每次拆分都严格保证train 6条、val 2条、test 2条,可以改用以下实现逻辑:
library(dplyr) tbl <- tibble(id = 1:10) train = list() val = list() test = list() for (run in 1:5) { # 先打乱全量样本的索引 shuffled_idx <- sample(nrow(tbl), size = nrow(tbl), replace = FALSE) # 按位置切分固定数量的样本 train[[run]] <- tbl[shuffled_idx[1:6], ] val[[run]] <- tbl[shuffled_idx[7:8], ] test[[run]] <- tbl[shuffled_idx[9:10], ] }
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

