如何用R语言的sample()函数创建多个训练子集
用R语言实现无放回抽样创建指定训练子集
核心逻辑:因为要求无放回抽样,绝不能单独对每个子集调用sample(),否则会出现样本重复。正确做法是先一次性抽取所有需要的样本索引,再拆分到各个子集,确保所有子集的观测值互不重叠。
具体实现步骤与代码
假设你的原始训练数据集名为train_data(包含60000条观测),按以下步骤操作:
确认总抽取量
总需抽取样本数 = 3×500 + 3×1000 + 3×2000 = 10500,远小于60000,完全满足无放回抽样条件。一次性抽取所有所需索引
先获取原始数据集的行索引,再无放回抽取10500个索引:# 获取原始数据集的行索引 all_indices <- seq_len(nrow(train_data)) # 无放回抽取所有需要的索引 sampled_indices <- sample(all_indices, size = 10500, replace = FALSE)拆分索引到对应子集
按需求把抽取的索引分成9组:# 拆分3个500条的子集索引 subset_500_1 <- sampled_indices[1:500] subset_500_2 <- sampled_indices[501:1000] subset_500_3 <- sampled_indices[1001:1500] # 拆分3个1000条的子集索引 subset_1000_1 <- sampled_indices[1501:2500] subset_1000_2 <- sampled_indices[2501:3500] subset_1000_3 <- sampled_indices[3501:4500] # 拆分3个2000条的子集索引 subset_2000_1 <- sampled_indices[4501:6500] subset_2000_2 <- sampled_indices[6501:8500] subset_2000_3 <- sampled_indices[8501:10500]从原始数据提取子集
用拆分好的索引提取对应子集:# 创建500条的子集 train_sub500_1 <- train_data[subset_500_1, ] train_sub500_2 <- train_data[subset_500_2, ] train_sub500_3 <- train_data[subset_500_3, ] # 创建1000条的子集 train_sub1000_1 <- train_data[subset_1000_1, ] train_sub1000_2 <- train_data[subset_1000_2, ] train_sub1000_3 <- train_data[subset_1000_3, ] # 创建2000条的子集 train_sub2000_1 <- train_data[subset_2000_1, ] train_sub2000_2 <- train_data[subset_2000_2, ] train_sub2000_3 <- train_data[subset_2000_3, ]
验证抽样有效性
可以通过以下代码检查子集是否存在重复观测:
# 合并所有子集的索引,检查重复值 all_sub_indices <- c(subset_500_1, subset_500_2, subset_500_3, subset_1000_1, subset_1000_2, subset_1000_3, subset_2000_1, subset_2000_2, subset_2000_3) # 检查是否有重复索引 any(duplicated(all_sub_indices))
返回FALSE则说明所有子集观测值唯一,符合无放回抽样要求。
内容的提问来源于stack exchange,提问作者amatof
相关产品推荐
相关产品推荐

