You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用系统抽样法划分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%}")

逻辑说明

  1. 确定训练集规模:根据总样本量和80%的比例,计算出训练集需要的样本数量。
  2. 计算抽样间隔:用总样本数除以训练集大小得到间隔step,保证选取的样本数量刚好匹配目标比例。
  3. 生成训练集索引:从0开始按间隔生成索引,转成整数避免浮点误差,同时去重防止重复选取。
  4. 补全训练集:如果浮点计算导致训练集数量略少,直接补充末尾样本确保比例准确。
  5. 生成测试集:用总索引集合减去训练集索引,得到测试集的所有样本索引。

关于train_test_split的说明

train_test_split是随机抽样逻辑,无法实现系统抽样的固定间隔选取要求,因此不能直接用它来满足你的需求,必须基于系统抽样逻辑实现划分。

内容的提问来源于stack exchange,提问作者Caspar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:40:37