Python: 如何将数据采样到测试和训练数据集中?

Python: How to sample data into Test and Train datasets?

我一直在使用 CSV 数据来实现我的脚本,并希望将数据采样到两个数据集中:

  1. 测试数据
  2. 训练数据

我想以 85% 和 15% 的比例对数据集进行采样,并希望输出两个 CSV 文件 Test.csv 和 Train.csv

我希望它在基础 Python 中执行并且不想使用任何其他外部模块,如 Numpy、SciPy、Pandas 或 Scikitlearn。谁能帮我按百分比随机抽样数据。此外,我将获得可能具有随机观测值的数据集。到目前为止,我刚刚阅读了有关 Pandas 和其他各种模块以按百分比对数据进行采样的信息,但还没有针对我的问题找到任何具体的解决方案。

此外,我想在两个文件中保留 CSV 的 headers。因为 headers 将使每一行都可访问并可用于进一步分析。

使用 random.shuffle 创建数据集的随机排列并根据需要对其进行切片:

import random
random.shuffle(data)
train = data[:int(len(data)*0.85)]
test = data[len(train):]

由于您请求了一个特定的解决方案来将一个可能很大的 CSV 文件分成两个文件用于训练和测试数据,我还将展示如何使用类似于上述一般方法的类似方法来完成此操作:

import random

# Count lines
with open('data.csv','r') as csvf:
    linecount = sum(1 for lines in csvf if line.strip() != '')

# Create index sets for training and test data
indices = list(range(linecount))
random.shuffle(indices)
ind_test = set(indices[:int(linecount*0.15)])
del indices

# Partition CSV file
with open('data.csv','r') as csvf, open('train.csv','w') as trainf, open('test.csv','w') as testf:
    i = 0
    for line in csvf:
        if line.strip() != '':
            if i in ind_test:
                testf.write(line.strip() + '\n')
            else:
                trainf.write(line.strip() + '\n')

因此,我假设 CSV 文件每行包含一个观察值。

这将创建一个准确的 85:15 拆分。如果不太准确的分区对您来说没问题,Peter Wood 的解决方案会更有效。

使用random function in the random module得到一个在01之间均匀分布的随机数。

如果是 > .85 写入训练数据,否则写入测试数据。参见 How do I simulate flip of biased coin in python?

import random

with open(input_file) as data:
    with open(test_output, 'w') as test:
        with open(train_output, 'w') as train:
            header = next(data)
            test.write(header)
            train.write(header)
            for line in data:
                if random.random() > 0.85:
                    train.write(line)
                else:
                    test.write(line)