如何用系统抽样法划分CSV数据集为训练集和测试集?(Python)
用系统抽样划分训练集(80%)和测试集(20%)
要同时满足系统抽样和80/20的划分比例,你可以改造系统抽样逻辑,直接生成训练集和测试集的索引,无需分开使用两段代码。以下是完整实现方案:
完整代码实现
import numpy as np import pandas as pd def split_with_systematic_sampling(df, train_ratio=0.8): total_samples = len(df) train_size = int(total_samples * train_ratio) # 计算抽样间隔,确保训练集数量匹配目标比例 step = total_samples / train_size # 生成训练集索引:从0开始按间隔选取,转成整数索引 train_indexes = np.arange(0, total_samples, step).astype(int) # 处理浮点计算可能导致的重复索引 train_indexes = np.unique(train_indexes) # 若训练集数量不足,补充末尾样本保证比例准确 if len(train_indexes) < train_size: remaining = train_size - len(train_indexes) train_indexes = np.concatenate([train_indexes, np.arange(total_samples - remaining, total_samples)]) # 测试集索引为所有不在训练集内的索引 test_indexes = np.setdiff1d(np.arange(total_samples), train_indexes) # 提取对应数据集 df_train = df.iloc[train_indexes] df_test = df.iloc[test_indexes] return df_train, df_test # 使用示例 df = pd.read_csv("your_dataset.csv") # 替换为你的CSV文件路径 df_train, df_test = split_with_systematic_sampling(df) # 验证划分比例 print(f"训练集占比: {len(df_train)/len(df):.2%}") print(f"测试集占比: {len(df_test)/len(df):.2%}")
逻辑说明
- 确定训练集规模:根据总样本量和80%的比例,计算出训练集需要的样本数量。
- 计算抽样间隔:用总样本数除以训练集大小得到间隔
step,保证选取的样本数量刚好匹配目标比例。 - 生成训练集索引:从0开始按间隔生成索引,转成整数避免浮点误差,同时去重防止重复选取。
- 补全训练集:如果浮点计算导致训练集数量略少,直接补充末尾样本确保比例准确。
- 生成测试集:用总索引集合减去训练集索引,得到测试集的所有样本索引。
关于train_test_split的说明
train_test_split是随机抽样逻辑,无法实现系统抽样的固定间隔选取要求,因此不能直接用它来满足你的需求,必须基于系统抽样逻辑实现划分。
内容的提问来源于stack exchange,提问作者Caspar
相关产品推荐
相关产品推荐

