如何将数据随机分成训练集和测试集?

我有一个大数据集,想把它分成训练集(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 的新手,不知道能否将整个文件读入一个数组,然后选择某些行。

解决办法

在 Python 中也可以使用列表来完成类似的操作(注意,整个列表是就地洗牌的)。

import random

with open("datafile.txt", "rb") as f:
    data = f.read().split('\n')

random.shuffle(data)

train_data = data[:50]
test_data = data[50:]
评论(3)

下面的方法会产生更通用的 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      
评论(0)

首先,Python 中不存在数组,Python 使用的是列表,这一点确实不同,我建议你使用 NumPy,这是一个相当不错的 Python 库,它增加了很多类似 Matlab 的功能。你可以从这里 Numpy for Matlab users 开始。

评论(1)