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

时间:2016-03-15 11:21:23

标签: python csv random-sample

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

  1. 测试数据
  2. 训练数据
  3. 我想以85%和15%的分区对数据集进行采样,并希望输出两个CSV文件Test.csv和Train.csv

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

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

2 个答案:

答案 0 :(得分:2)

使用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的解决方案会更有效率。

答案 1 :(得分:2)

使用random中的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)