我正在尝试构建一个分类模型。我在本地文件夹中有1000个文本文档。我想以70:30的比例将它们分割成训练集和测试集(70%用于训练,30%用于测试)。有什么更好的方法来实现这一点?我使用的是Python。
我想要一种编程方式来分割训练集和测试集。首先读取本地目录中的文件。其次,构建这些文件的列表并打乱顺序。第三,将它们分割成训练集和测试集。
我尝试了几种方法,只使用Python内置的关键字和函数,但都失败了。最后,我找到了一个方法。另外,交叉验证也是构建通用分类模型时值得考虑的一个好选项。
回答:
这将包括几个步骤:
- 获取文件列表
- 随机化文件顺序
- 将文件分割成训练和测试集
- 执行操作
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)
再次强调,实现你的机器学习系统的实际功能取决于你自己。