2017-02-26 96 views
-5

我想建立一个分类模型。我在本地文件夹中有1000个文本文档。我想把他们分成训练集和测试集,分流比为70:30(70->训练和30->测试)这样做的更好方法是什么?我正在使用python。如何将文档分割为训练集和测试集?

注意: - 为了更好的理解,请提供解释为什么应该遵循该方法。

谢谢

更新: -几downvotes这个问题后。尽管我得到了近乎完美的答案,但我仍想简要回答这个问题。

我想通过编程的方式来分割训练集和测试集。首先阅读本地目录中的文件。其次,建立这些文件的清单并对其进行洗牌。第三,将它们分成训练集和测试集。

作为python的初学者和新手,我尝试了几种使用内置python关键字和函数的方法来失败。最后,我得到了接近它的想法。对于建筑物的一般分类模型,交叉验证也是一个很好的选择。感谢您的答案。

+0

Scikit学习有许多可用的功能做你想要什么样的例子。搜索网络,并在这里发帖,如果你发现在应用它们时遇到任何困难 –

+0

这个问题有什么问题?为什么会员贬低这个问题? –

+1

Stackoverflow不适用于收集意见。这是编程。你只是问而不显示任何努力。 –

回答

3

不确定究竟是你在追求什么,所以我会尽量全面。会有几个步骤:

  1. 获取文件的列表
  2. 随机化文件
  3. 分割文件到训练和测试设置
  4. 做的事

1.使用文件列表

让我们假设你的文件都有扩展名.data,它们都在文件夹/ml/data/。我们想要做的是获得所有这些文件的列表。这只需要使用os模块即可完成。我假设你没有子目录;如果有的话,这将会改变。

import os 

def get_file_list_from_dir(datadir): 
    all_files = os.listdir(os.path.abspath(datadir)) 
    data_files = list(filter(lambda file: file.endswith('.data'), all_files)) 
    return data_files 

所以,如果我们要调用get_file_list_from_dir('/ml/data'),我们还是会回到所有在该目录中.data文件列表(相当于在外壳的水珠/ml/data/*.data)。

2.随机化的文件

我们不想采样是可预测的,因为这被认为是一个贫穷的方式来训练的ML分类。

from random import shuffle 

def randomize_files(file_list): 
    shuffle(file_list) 

注意random.shuffle执行就地互换,以便它修改现有的列表。 (当然,这个功能是相当愚蠢的,因为你可以只调用shuffle而不是randomize_files;你可以写到另一个函数这使它更有意义。)

3.拆分文件到训练和测试设置

我会假设一个70:30的比率,而不是任何特定数量的文件。所以:

from math import floor 

def get_training_and_testing_sets(file_list): 
    split = 0.7 
    split_index = floor(len(file_list) * split) 
    training = file_list[:split_index] 
    testing = file_list[split_index:] 
    return training, testing 

4.做的事

这是你打开每个文件,做你的训练和测试步骤。我会留给你的!


交叉验证

出于好奇,你有没有考虑过使用cross-validation?这是一种分割数据的方法,以便您可以使用每个文档进行培训和测试。您可以自定义在每次“折叠”中使用多少文档进行培训。如果你喜欢,我可以更深入地了解这一点,但如果你不想这样做,我不会这样做。

编辑:好的,因为你要求我会多解释一下。

所以我们有一个1000个文档的数据集。交叉验证的想法是,您可以使用所有进行培训和测试 - 只是不要一次。我们将数据集分解成我们称之为“折叠”的东西。折叠次数决定了在任何给定时间点训练和测试集的大小。

比方说,我们想要一个10倍的交叉验证系统。这意味着训练和测试算法将运行十次。第一次将在文件1-100上进行训练并在101-1000上进行测试。第二轮将在101-200上进行训练,并在1-100和201-1000进行测试。

如果我们做了一个40倍的CV系统,第一次将在文档1-25上进行训练并在26-1000上进行测试,第二次将在26-40上进行训练并在1-25上进行测试, 51-1000,和。为了实现这样一个系统,我们仍然需要从上面进行步骤(1)和(2),但步骤(3)会有所不同。我们可以将函数变成一个generator - 我们可以像列表一样遍历一个函数,而不是分成两组(一个用于训练,一个用于测试)。

def cross_validate(data_files, folds): 
    if len(data_files) % folds != 0: 
     raise ValueError(
      "invalid number of folds ({}) for the number of " 
      "documents ({})".format(folds, len(data_files)) 
     ) 
    fold_size = len(data_files) // folds 
    for split_index in range(0, len(data_files), fold_size): 
     training = data_files[split_index:split_index + fold_size] 
     testing = data_files[:split_index] + data_files[split_index + fold_size:] 
     yield training, testing 

yieldyield关键字是什么使这个发电机。要使用它,你可以这样使用它:

def ml_function(datadir, num_folds): 
    data_files = get_file_list_from_dir(datadir) 
    randomize_files(data_files) 
    for train_set, test_set in cross_validate(data_files, num_folds): 
     do_ml_training(train_set) 
     do_ml_testing(test_set) 

再次,这取决于你实现你的ML系统的实际功能。

作为一个免责声明,我不是专家的任何手段,哈哈。但是,如果您对我在这里写的任何内容有任何疑问,请告诉我!

+0

我想将1000个文本文档(.txt)分解为用于实现tf-idf的训练和测试集,并应用算法来构建分类模型。根据我的目标,将文档分为两个独立的类。 –

+0

是的,我考虑过交叉验证。但作为一名初学者,我认为不要去追求它。我也请你解释一下。请。 –

+0

@BhabaniMohapatra我已经更新了底部,以解释您可能如何进行一些交叉验证。细节取决于你,但我写的应该可以帮助你正确加载数据。如果您有任何问题,请告诉我! –

0

只需使用os.listdir()制作一个文件名列表。使用collections.shuffle()洗牌的列表,然后training_files = filenames[:700]testing_files = filenames[700:]

1

如果使用numpy的,首先加载文件,并使其实现numpy的数组,然后这是相当简单:

import numpy as np 

docs = np.array([ 
    'one', 'two', 'three', 'four', 'five', 
    'six', 'seven', 'eight', 'nine', 'ten', 
    ]) 

idx = np.hstack((np.ones(7), np.zeros(3))) # generate indexes 
np.random.shuffle(idx) # shuffle to make training data and test data random 

train = docs[idx == 1] 
test = docs[idx == 0] 

print(train) 
print(test) 

结果:

['one' 'two' 'three' 'six' 'eight' 'nine' 'ten'] 
['four' 'five' 'seven'] 
相关问题