如何从数据文件中提取特定行

1 投票
3 回答
803 浏览
提问于 2025-04-17 14:51

我遇到了一个问题,但我觉得解决起来应该很简单。我正在建立一个模型,想通过10折交叉验证来测试它的准确性。为此,我需要把我的训练数据分成90%和10%,分别作为训练部分和测试部分。然后我会用90%的数据来训练模型,用10%的数据来测试。这一过程我想重复十次,每次都用不同的90%和10%的数据分割,这样每一部分数据最终都能作为测试数据。最后,我会把每次测试的结果平均起来。

我尝试写一个脚本来提取训练数据的10%,并把它写入一个新文件,但到目前为止我还没搞定。我做的事情是先计算文件中的总行数,然后把这个数字除以十,以知道我想提取的十个不同测试集的大小。

trainFile = open("danish.train")
numberOfLines = 0

for line in trainFile:
    numberOfLines += 1

lengthTest = numberOfLines / 10

我发现我的训练文件总共有3638行,所以每个测试集大约应该有363行。

我该如何把第1到第363行、第364到第726行等等写入不同的测试文件呢?

3 个回答

1

这个还没经过测试,但我可以给你讲讲基本的想法:

def getNthSeg(fpath, n, segSize):
    """Get the nth segment of segSize many lines"""
    answer = []
    with open(fpath) as f:
        for i,line in enumerate(f):
            if (segSize-1)*n <= i < segSize*n:
                answer.append(line)
    return answer

def getFolds(fpath, k):
    """ In your case, k is 10"""
    with open(fpath) as f:
        numLines = len(f.readlines())
    segSize = numLines/k
    answer = []
    for n in xrange(k):
        fold = getNthSeg(fpath, n, segSize)
        answer.append(fold)
    return answer
1

如果你的文件不大,你可以把它分成90%和10%这样:

trainFile = open("danish.train")
lines = list(trainFile)
N = len(lines)
testing = lines[:N/10]
training = lines[N/10:]
1

一旦你统计好了行数,就回到文件的开头,开始把行复制到 danish.train.part-01 这个文件里。当行号是10%测试集大小的倍数时,就打开一个新文件来存放下一部分。

#!/usr/bin/env python2.7

trainFile = open("danish.train")
numberOfLines = 0

for line in trainFile:
    numberOfLines += 1

lengthTest = numberOfLines / 10

# rewind file to beginning
trainFile.seek(0)

numberOfLines = 0
file_number = 0
for line in trainFile:
    if numberOfLines % lengthTest == 0:
        file_number += 1
        output = open('danish.train.part-%02d' % file_number, 'w')

    numberOfLines += 1
    output.write(line)

在这个输入文件上(抱歉,我不会说丹麦语!):

one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
thirteen
fourteen
fifteen
sixteen
seventeen
eighteen
nineteen
twenty
twenty-one
twenty-two
twenty-three
twenty-four
twenty-five
twenty-six
twenty-seven
twenty-eight
twenty-nine
thirty

这样会创建一些文件

danish.train.part-01
danish.train.part-02
danish.train.part-03
danish.train.part-04
danish.train.part-05
danish.train.part-06
danish.train.part-07
danish.train.part-08
danish.train.part-09
danish.train.part-10

比如第5部分包含:

thirteen
fourteen
fifteen

撰写回答