2013-02-05 122 views
1

我有一个问题,但我觉得解决方案应该很简单。我正在构建一个模型,并希望通过10倍交叉验证来测试其准确性。为此,我必须将训练语料库90%/ 10%分成训练和测试部分,然后训练我的模型90%和测试10%。这个我想做10次,每次做不同的90%/ 10%的分割,这样最终每个比特的语料库都被用作测试数据。然后我会平均每个10%测试的结果。如何从数据文件中提取特定行

我试图编写一个脚本来提取10%的训练语料库并将其写入一个新文件,但到目前为止我没有得到它的工作。我所做的是计算文件中的总行数,然后将这个数字除以10以知道我想提取的十个不同测试集中每一个的大小。

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

for line in trainFile: 
    numberOfLines += 1 

lengthTest = numberOfLines/10 

对于我自己的培训文件,我发现它包含3638行,因此每个测试应该大致由363行组成。

如何将第1-363行,第364-726行等写入不同的测试文件?

+0

那么哪部分不适合你?我试过你的代码(用我自己的文本文件),它告诉我每个“测试块”的大小。您是否需要帮助编写部分内容:“如何将第1-363行,第364-726行等写入不同的测试文件?”就这样?或者在你到达那里之前还有其他的东西不适合你? –

回答

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 
+0

非常感谢您的帮助!它完美的作品。我也有一个相关的问题。每次我从训练文件中提取一块以将其保存为测试时,我需要创建一个伴随的新训练文件,从中删除该精确块(以便我可以在新训练文件上训练模型,然后使用其他文件来测试模型)。我一直在尝试编辑你的代码,但到目前为止它没有做我想做的事。我怎样才能扩展上面的代码来做到这一点? – Johanna

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 
+0

感谢您的帮助! – Johanna

1

如果你的文件不是很大,你可以把它分成90/10像这样:

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