Python:如何将数据采样到测试和训练数据集中?
我一直在使用CSV数据来实现我的脚本,并希望将数据采样到两个数据集中:Python:如何将数据采样到测试和训练数据集中?,python,csv,random-sample,Python,Csv,Random Sample,我一直在使用CSV数据来实现我的脚本,并希望将数据采样到两个数据集中: 测试数据 列车数据 我想在85%和15%分区中对数据集进行采样,并想输出两个CSV文件Test.CSV和Train.CSV 我希望它在基本Python中运行,不希望使用任何其他外部模块,如Numpy、SciPy、Pandas或Scikitlearn。有谁能帮我按百分比随机抽取数据吗。此外,我将提供的数据集,可能有随机数的观察。到目前为止,我刚刚阅读了熊猫和其他各种模块,以百分比为基础对数据进行采样,但还没有针对我的问题找到任
此外,我想在两个文件中保留CSV的标题。因为标题将使每一行都可访问,并可用于进一步分析。使用
随机。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的解决方案将更加有效。使用中的函数获得0
和1
之间的均匀分布随机数
如果是.85
写入训练数据,否则写入测试数据。看
你的职位很广泛。详细说明您已经尝试过的内容。用问号明确你在问什么问题。@MartinCowie我刚学过网络搜索。到目前为止还没有尝试过任何东西。正在搜索逻辑,我想从现有文件创建两个文件
Test.csv
和Train.csv
来自主文件data.csv
我希望85%的数据应该在Test.csv
中,其余15%的数据应该在Train.csv
中,为什么您希望85%的数据作为测试数据,15%作为培训数据?很可能您需要85%的数据用于培训,剩下的数据作为测试数据。您所说的“CSV数据”是什么意思?你没有在问题中提到如何存储数据,所以我只是假设数据
是一系列观察结果。如果我没有提到,我很抱歉。但到目前为止,我的数据是CSV格式的,我希望对数据进行相应的采样。但无论如何,谢谢@你的CSV文件有多大?这要求它们同时都在内存中。@PeterWood CSV文件可能以GB为单位,也就是说,它可能包含一百万个或更多条目。CSV.writer没有名为“write”的对象,我想应该是writerows?hatsoff!但数据也包含标题。标题在一个文件中,不在第二个文件中。有没有办法在这两个文件中保留标题files@desmond.carros:csv.DictReader
和csv.DictWriter
在这种情况下可能很有用。我也这么想@desmond.carros将其放入问题中,或询问/搜索另一个问题。
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)