我有一个大数据集,想把它分成训练集(50%)和测试集(50%)。
假设输入文件中存储了 100 个示例,每行包含一个示例。我需要选择 50 行作为训练集,50 行作为测试集。
我的想法是首先生成一个长度为 100 的随机列表(值范围为 1 到 100),然后使用前 50 个元素作为 50 个训练示例的行号。测试集也是如此。
这在 Matlab 中很容易实现
fid=fopen(datafile);
C = textscan(fid, '%s','delimiter', '\n');
plist=randperm(100);
for i=1:50
trainstring = C{plist(i)};
fprintf(train_file,trainstring);
end
for i=51:100
teststring = C{plist(i)};
fprintf(test_file,teststring);
end
但我如何在 Python 中实现这一功能呢?我是 Python 的新手,不知道能否将整个文件读入一个数组,然后选择某些行。
下面的方法会产生更通用的 k 折交叉验证分割。您可以通过下面的 k=2
来实现 50-50 的分割,您只需从产生的两个分割中选择一个即可。注:我还没有测试过这段代码,但我很确定它应该有效。
import random, math
def k_fold(myfile, myseed=11109, k=3):
# Load data
data = open(myfile).readlines()
# Shuffle input
random.seed=myseed
random.shuffle(data)
# Compute partition size given input k
len_part=int(math.ceil(len(data)/float(k)))
# Create one partition per fold
train={}
test={}
for ii in range(k):
test[ii] = data[ii*len_part:ii*len_part+len_part]
train[ii] = [jj for jj in data if jj not in test[ii]]
return train, test
首先,Python 中不存在数组,Python 使用的是列表,这一点确实不同,我建议你使用 NumPy,这是一个相当不错的 Python 库,它增加了很多类似 Matlab 的功能。你可以从这里 Numpy for Matlab users 开始。