首页
Preview

如何使用Python将数据集拆分为训练集和测试集

Photo by Siora Photography on Unsplash

在机器学习的背景下,将我们的建模数据集拆分为训练和测试样本可能是我们需要进行的最早的预处理步骤之一。创建不同的训练和测试样本有助于我们评估模型性能。

在本文中,我们将讨论在建模和模型训练的背景下训练和测试样本的目的。此外,我们将探讨三种使用 Python 和 pandas 创建这些样本的简单方法。更具体地说,我们将展示如何创建训练和测试样本:

  • 使用 scikit-learn(也称为 sklearn)的 train_test_split()
  • 使用 numpyrandn() 函数
  • 或使用内置的名为 sample()pandas 方法

为什么需要训练和测试样本

训练模型时非常常见的问题是 过拟合。这种现象发生在模型在用于训练的数据上表现非常好,但它无法很好地推广到新的、未见过的数据点上。这种情况发生的原因有很多——可能是数据中的噪声,也可能是模型学习预测特定输入而不是能够帮助它做出正确预测的预测参数。通常,模型的复杂度越高,过拟合的几率就越高。

另一方面,欠拟合 发生在模型在用于训练的数据上表现不佳的情况下。在大多数情况下,欠拟合是因为模型不适合你正在尝试解决的问题。通常,这意味着模型比所需的要简单,以便学习那些可以被证明是预测性的参数。

为训练和测试模型创建不同的数据样本是可以用于识别这些问题的最常见方法。这样,我们就可以使用训练集来训练我们的模型,然后将测试集作为一组数据点,帮助我们评估模型是否可以很好地推广到新的、未见过的数据。

将建模数据集拆分为训练和测试集的最简单方法是将 2/3 的数据点分配给前者,将剩余的三分之一分配给后者。因此,我们使用训练集训练模型,然后将模型应用于测试集。通过这种方式,我们可以评估我们的模型的性能。例如,如果训练精度非常高,而测试精度很差,那么这表明模型可能过拟合。

请注意,将数据集拆分为训练和测试集并不是避免过拟合等现象所必需的唯一操作。例如,如果训练集和测试集都包含在真实世界数据中不存在的模式,那么即使我们无法从性能评估中观察到它,模型的性能仍然会很差。

另外,你应该知道,有一些情况你应该考虑创建一个名为 验证 集的额外集合。当除了模型性能外,我们还需要在许多模型中进行选择并评估哪个模型表现更好时,通常需要验证集。

如何将数据集拆分为训练和测试集

在本节中,我们将探讨三种不同的方法,可以用于创建训练和测试集。在进入这些方法之前,让我们创建一个虚拟数据集,用于演示目的。在下面的示例中,我们将假设我们有一个存储在内存中的 pandas DataFrame 数据集。鸢尾花数据集包含 150 个数据点,每个数据点都有四个特征。

在下面的示例中,我们将假设我们需要 80:20 的比率进行训练:测试集。

使用 pandas

第一种选择是使用 pandas DataFrames 的方法 <a class="af ob" href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sample.html" rel="noopener ugc nofollow" target="_blank">sample()</a>

返回对象轴上的一些随机项目。

你可以使用 random_state 实现可重复性

我们最初通过从 pandas DataFrame 中的所有行中取样 0.8 的比例来创建训练集。请注意,我们还定义了 random_state,它对应于种子,以便结果是可重复的。随后,我们通过从原始 DataFrame 中删除现在包含在训练集中的相应索引来创建测试集。

正如我们所看到的,训练集包含 120 个示例,这与我们在对原始建模 DataFrame 进行抽样时请求的比例相符。其余的 30 个示例被打包到测试集中。

使用 scikit-learn

第二个选择——也可能是最常用的——是使用 sklearn 的方法,称为 train_test_split()

将数组或矩阵拆分为随机的训练和测试子集

我们可以通过将建模 DataFrame 以及应该包含在测试集中的示例的比例传递给 train_test_split(),以一行代码创建训练和测试集。与以前一样,我们还设置了 random_state,以便结果是可重复的,也就是说,每次运行代码时,相同的实例都将分别包含在训练和测试集中。该方法返回一个包含训练和测试示例的 DataFrame 的元组。

使用 numpy

最后,一种不太常用的创建测试和训练样本的方法是使用 numpy 的方法randn():

从“标准正态”分布中返回一个样本(或多个样本)。

首先,我们创建了一个numpy数组mask,其中包含通过将0到1之间的随机浮点数与我们想要保留的训练集分数进行比较所计算出的布尔值。随后,我们通过相应地过滤数据框来创建训练和测试样本。然而请注意,这种方法将大约给出80:20的比例,这意味着包含在训练和测试样本中的示例数量不一定像我们在本文中讨论的两种方法那样准确。

接下来是什么?

现在,你已经从原始建模数据集中创建了训练和测试集,你可能还需要进行进一步的预处理步骤,例如缩放或归一化。但是,你在这样做时必须小心,因为你需要避免将未来信息引入到你的训练集中。这意味着某些操作需要首先应用于训练集,然后使用从该步骤学习的参数来将其应用于测试集。有关此主题的更全面的解释,你可以阅读下面的文章。

Feature Scaling and Normalisation in a nutshell

结论

在本文中,我们探讨了将初始建模数据集拆分为训练和测试样本的重要性。此外,我们讨论了这些集合如何帮助我们确定我们的模型是否过度拟合或欠拟合。最后,我们看到了如何使用Python和pandas以三种不同的方式进行此拆分;使用pandas.sample()sklearn.traing_test_split()numpy.randn()

译自:https://towardsdatascience.com/how-to-split-a-dataset-into-training-and-testing-sets-b146b1649830

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
alivne
复杂的问题简单化

评论(0)

添加评论