Python: 如何将数据采样到测试和训练数据集中?
Python: How to sample data into Test and Train datasets?
我一直在使用 CSV 数据来实现我的脚本,并希望将数据采样到两个数据集中:
- 测试数据
- 训练数据
我想以 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得到一个在0
和1
之间均匀分布的随机数。
如果是 > .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)
我一直在使用 CSV 数据来实现我的脚本,并希望将数据采样到两个数据集中:
- 测试数据
- 训练数据
我想以 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得到一个在0
和1
之间均匀分布的随机数。
如果是 > .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)