如何将文档分割成训练集和测试集?

我正在尝试构建一个分类模型。我在本地文件夹中有1000个文本文档。我想以70:30的比例将它们分割成训练集和测试集(70%用于训练,30%用于测试)。有什么更好的方法来实现这一点?我使用的是Python。


我想要一种编程方式来分割训练集和测试集。首先读取本地目录中的文件。其次,构建这些文件的列表并打乱顺序。第三,将它们分割成训练集和测试集。

我尝试了几种方法,只使用Python内置的关键字和函数,但都失败了。最后,我找到了一个方法。另外,交叉验证也是构建通用分类模型时值得考虑的一个好选项。


回答:

这将包括几个步骤:

  1. 获取文件列表
  2. 随机化文件顺序
  3. 将文件分割成训练和测试集
  4. 执行操作

1. 获取文件列表

假设你的文件都具有.data扩展名,并且它们都在/ml/data/文件夹中。我们想要获取所有这些文件的列表。这可以通过os模块简单地完成。我假设你没有子目录;如果有的话,这会有所不同。

所以,如果我们调用get_file_list_from_dir('/ml/data'),我们将得到该目录中所有.data文件的列表(在shell中等同于glob /ml/data/*.data)。

2. 随机化文件顺序

我们不希望抽样是可预测的,因为这被认为是训练机器学习分类器的糟糕方法。

from random import shuffledef randomize_files(file_list):    shuffle(file_list)

请注意,random.shuffle执行的是原地打乱,所以它会修改现有列表。(当然,这个函数有点傻,因为你可以直接调用shuffle而不是randomize_files;你可以将其写成另一个函数,让它更有意义。)

3. 将文件分割成训练和测试集

我假设使用70:30的比例,而不是任何特定数量的文档。所以:

from math import floordef 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. 执行操作

这是你打开每个文件并进行训练和测试的步骤。我将这部分留给你!


交叉验证

出于好奇,你有没有考虑使用交叉验证?这是一种分割数据的方法,使你可以使用每份文档进行训练和测试。你可以自定义每“折”中用于训练的文档数量。如果你喜欢,我可以更深入地解释这一点,但如果你不想这样做,我就不说了。

好吧,既然你要求了,我就再多解释一点。

所以我们有一个包含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)会有所不同。不是只分割成两个集合(一个用于训练,一个用于测试),我们可以将函数变成一个生成器——一个我们可以像列表一样迭代的函数。

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

那个yield关键字在末尾使得这是一个生成器。要使用它,你可以这样做:

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)

再次强调,实现你的机器学习系统的实际功能取决于你自己。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注