在机器学习的背景下,将建模数据集拆分为训练集和测试集可能是我们需要进行的最早的预处理步骤之一。创建不同的训练集和测试集有助于我们评估模型性能。
在本文中,我们将讨论在建模和模型训练的背景下训练和测试样本的目的。此外,我们将探讨三种使用Python和pandas创建这些样本的简单方法。具体而言,我们将展示如何创建训练集和测试集:
- 使用
scikit-learn
(又名sklearn
)的train_test_split()
- 使用
numpy
的randn()
函数 - 或使用内置的名为
sample()
的pandas
方法
为什么我们需要训练和测试样本
训练模型时一个非常常见的问题是过度拟合。这种现象发生在模型在我们用于训练它的数据上表现良好,但是在新的、未见过的数据点上表现不佳。这种情况可能有很多原因,可能是由于数据中的噪声,也可能是模型学习预测特定输入而不是可以帮助它进行正确预测的预测参数。通常,模型的复杂度越高,过度拟合的可能性就越大。
另一方面,欠拟合发生在模型在用于训练它的数据上表现不佳的情况下。在大多数情况下,欠拟合是因为模型不适用于你尝试解决的问题。通常,这意味着模型比所需的更简单,无法学习那些可以被证明具有预测能力的参数。
为训练和测试模型创建不同的数据样本是可以用于识别这些问题的最常见方法。通过这种方式,我们可以使用训练集来训练模型,然后将测试集视为一组数据点,这些数据点将帮助我们评估模型是否能够很好地推广到新的、未见过的数据。
将建模数据集拆分为训练集和测试集的最简单方法是将2/3的数据点分配给前者,剩余的1/3分配给后者。因此,我们使用训练集来训练模型,然后将模型应用于测试集。通过这种方式,我们可以评估我们的模型性能。例如,如果训练精度非常高,而测试精度较低,则这是模型可能过度拟合的一个很好的指标。
请注意,将数据集拆分为训练集和测试集并不是避免过度拟合等现象所需的唯一操作。例如,如果训练集和测试集都包含在真实世界数据中不存在的模式,则即使我们无法从性能评估中观察到它,模型的性能仍然很差。
另外,你应该知道,在某些情况下,你应该考虑创建一个额外的称为验证集的集合。当除了模型性能外,我们还需要在许多模型之间进行选择并评估哪个模型表现更好时,通常需要验证集。
如何将数据集拆分为训练和测试集
在本节中,我们将探讨三种不同的方法,可以用于创建训练和测试集。在深入探讨这些方法之前,让我们创建一个虚拟数据集,用于演示目的。在下面的示例中,我们将假设我们有一个作为pandas DataFrame存储在内存中的数据集。iris数据集包含150个数据点,每个数据点都有四个特征。
在下面的示例中,我们将假设我们需要一个80:20的比例用于训练:测试集。
使用pandas
第一个选项是使用pandas DataFrame的 sample()
方法:
返回对象轴上的随机样本。
你可以使用 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范围内的随机浮点数与我们想要保留的训练集分数进行比较而计算出的布尔值。随后,我们通过相应地过滤DataFrame来创建训练和测试样本。但是请注意,这种方法将大约给出80:20的比例,这意味着包括在训练和测试样本中的示例数量不一定像我们在本文中讨论的两种方法那样准确。
结论
在本文中,我们探讨了将初始建模数据集拆分为训练和测试样本的重要性。此外,我们还讨论了这些集合如何帮助我们确定我们的模型是否过度拟合或欠拟合。最后,我们看到了如何使用Python和pandas以三种不同的方式进行此拆分;使用pandas.sample()
、sklearn.traing_test_split()
和numpy.randn()
。
译自:https://towardsdatascience.com/how-to-split-a-dataset-into-training-and-testing-sets-b146b1649830
评论(0)