为什么我们对训练和测试数据使用 80-20 划分?

2025 年 1 月 5 日 | 阅读 20 分钟

在开发机器学习模型时,将数据分为两部分至关重要:训练和测试。训练数据的主要目的是帮助理解和掌握模型的假设,而测试数据用于评估模型的效率和性能。

这种数据划分可以防止过拟合,过拟合是指模型变得过于复杂且严重依赖训练数据,从而损害其在新未见过的数据上表现良好的能力。为避免此类问题,建议使用大约 70-80% 的数据进行训练,其余 20-30% 用于测试。

这种划分基于经验研究,表明遵循这种特定比例可以获得最佳结果。通过分配更大比例的数据用于训练,我们确保模型有大量的学习信息来提高其性能。反之,较小比例的数据保留用于测试,确保模型对新数据的泛化能力得到彻底评估。

为什么我们对数据使用 80-20 划分?

在机器学习中,训练和测试数据常使用 80-20 划分有几个原因。

帕累托原则

80-20 划分源于帕累托原则,通常称为 80/20 法则。该原则表明大约 80% 的结果来自 20% 的因素。尽管并非绝对确定,但该原则适用于许多现实生活中的情况,例如数据的稀释。

对训练数据采用 80-20 划分使模型能够理解数据中的大多数模式和连接,而无需其全部数据。

训练与测试之间的平衡

80-20 的划分在彻底检查示例和获取足够信息进行公正分析之间取得了平衡。通过将 80% 的数据用于教育目的,模型获得了充足的样本以充分涵盖各个方面和特征。相反,剩余的 20% 包含全新的数据,可以更精确地评估模型预测未知信息的能力。

实用性和效率

这种分离简单且计算高效,特别是对于大型数据集。在测试过程中减少数据点可以减少样本分析所需的时间和资源。

此外,许多机器学习库和程序包含涉及 80-20 分割的功能组合,使执行易于访问和简单。

简单易懂

80-20 的划分是一个简单而完美的理念,使新手更容易理解和阐明数据用于训练和测试的用途。这种实现的直截了当和简单性是其在该领域广泛接受的关键。

缩放定律

在机器学习中,划分数据结构的普遍方法是使用 80/20 比例。这种技术需要将数据分为 80% 用于训练目的,其余 20% 用于测试。缩放定律出现在数学中,用于理解各种变量及其相互影响之间的相关性。通过分析这些缩放定律,我们可以获得关于模型在机器学习过程中数据集大小变化时的持续性能的宝贵知识。

盖恩的缩放定律

伊莎贝尔·盖恩于 1997 年引入了统计缩放原则。该定律的主要目的是指导训练和神经网络的数据分布,以测试和避免过拟合。与帕累托原则相比,盖恩定律意味着模型划分基于样本中可调参数的数量。

根据该定律,可调参数数量的平方根应与分配给验证集的数据集部分成反比。因此,随着模型难度的增加,应将更大比例的数据分配给验证集以防止过拟合。

为什么我们需要划分数据集?

为了准确识别机器学习模型的行为,有必要包含在训练期间未使用的其他模型。如果不这样做可能会导致对模型的评估产生偏差。

  • 使用训练示例来评估模型就像给一群学生一系列问题,而在期末考试中只测试少数几个。不清楚学生是理解了主题还是只是抓到了一些细节。
  • 最简单的方法是将整个数据集分成两组。随后,一组用于训练,另一组用于模型分析。这种技术通常被称为保留技术。让我们首先了解数据子集的含义。
  • 我们利用这些观察结果来训练我们的机器学习模型。我们利用这些观察结果在学习阶段调整模型的参数。
  • 训练阶段完成后,我们通过使用测试集中的观测值来评估机器学习模型。这使我们能够衡量模型在面对新观测值时的性能。值得注意的是,训练集和测试集都必须表现出相同的分布。
  • 通过采用留出技术,我们可以减少与数据泄露或过拟合相关的风险。因此,我们可以保证我们训练的模型能够有效地将其知识应用于未知数据。

训练集划分评估

使用训练集划分方法进行评估包括通过将数据分成不同部分来衡量机器学习模型的有效性。随后,您在这些子集上训练和评估您的模型。这一步在机器学习中具有极其重要的意义,因为它减少了过拟合,并确保您的模型能够有效地评估不熟悉的数据。

Why We Use an 80-20 Split for Training and Test Data?

最简单的方法是训练-测试划分来划分数据,包括将数据集分成两组。

  1. 通常,大约 60-80% 的数据用于训练模型。
  2. 第二个任务是进行训练集划分练习,以评估模型在未见过数据上的性能。通常,分配 20% 到 40% 的数据用于此评估。
    这提供了对模型泛化能力的基本评估,但它可能容易受到由初始划分的不可预测性引起的变化的影响。
  3. 验证集:过去,标准程序是在模型训练期间调整模型的超参数并定期评估其有效性。此过程通常涉及使用一部分数据,约占 10-20%。此验证集的主要目的是防止过拟合,并获得比简单的训练-测试划分更可靠的评估。k 折交叉验证方法涉及将数据集分成 k 个大小相同的折叠。
  • k-1 个集合用于训练。然而,剩余的组被分配用于测试。
  • 上述过程重复 k 次,其中每个数据点可以分配到测试集一次。这种方法确保了统计上可靠的模型性能评估,显著优于单阶段训练测试。
  • 无论分类方法如何,使用特定标准评估模型的有效性都很重要。传统的评估标准包括准确率,它指的是正确预测的百分比。
  • 准确率定义了准确正向预测的比例。
  • 召回率定义了正确预测的真实阳性实例的比例。
  • F1 分数是使用调和平均数结合精确率和召回率度量的指标。

如何划分数据集?

当我们试图找到训练数据和测试数据之间的最佳比例时,最初的结果是 80:20。我们将 80% 的可用数据分配用于训练,而剩余部分用于测试。过去,较早的参考文献和教科书建议 70:30 甚至 50:50 的划分。

Why We Use an 80-20 Split for Training and Test Data?

然而,专注于深度学习或大数据来源的资料表明,划分已显著转向 99:1。值得注意的是,与机器学习中的其他挑战类似,这个问题缺乏明确的解决方案。当训练数据不足时,参数的估计变得高度不可预测。相反,测试数据的短缺会导致性能评估的显著差异。

导入数据集

我们将使用印度住房数据集。在导入数据集之前,您可以使用 Pandas 将数据导入到数据框中。pip 命令将帮助您安装 pandas 库。

现在,将数据集合并到 Python 的 Pandas 数据框中。


Why We Use an 80-20 Split for Training and Test Data?

假设“卧室”列是输出 (Y)。

同时,我们必须从数据集中删除该列以形成输入向量。

现在,使用 Pandas 的 .head() 方法查看输入和输出的样子。


Why We Use an 80-20 Split for Training and Test Data?

输出

0    3
1    4
2    6	
3    8
4    6
Name: Bedrooms, dtype: int64

使用 sklearn 划分数据

我们将使用 sklearn 库中的 train_test_split 函数来划分数据。要执行此任务,请使用 pip 命令安装 sklearn 库。在命令提示符中输入以下命令以成功安装。

给定的比例会随机将您的数据分成训练集和测试集。现在,让我们仔细看看 Python 的实现。

我们目前正在采用 80:20 的划分比例。剩余的 0.2 表示测试数据集,占 20%。

运行以下代码以获取和比较不同训练集和测试集的结构。

输出

shape of original dataset : (10, 4)
shape of input - training set (8, 3)
shape of output - training set (8,)
shape of input - testing set (2, 3)
shape of output - testing set (2,)

完整代码

说明

在上面的代码中,我们首先导入 pandas 库来处理数据,并将名为“india_housing.csv”的 CSV 文件读取到 DataFrame 中。然后,它显示前几行以预览数据。接下来,它将用于预测的目标变量(卧室数量)与其他特征分开。之后,它将数据集分成训练集和测试集,其中 80% 用于训练,20% 用于测试。因此,它打印出原始数据集和分割数据集的形状。

什么时候需要使用训练-测试划分?

  1. 训练-测试划分概念的实现可以轻松解决预测建模问题。当有足够的数据将数据集划分为训练和测试子集时,这种方法变得流行。训练和测试数据集准确地反映了问题数据集,使其成为理想的解决方案。原始训练分割数据集必须有效地代表问题数据集。
  2. 如果存在足够多的记录,涵盖典型和不常见的情况,则问题数据集将得到适当的描绘。这可能涉及现实生活中观察到的各种输入因子组合。可能需要大量的示例,从数千到数百万。相反,如果数据集有限,则训练-测试方法不适用。一旦分割成训练集和测试集,训练数据集将缺乏足够的信息,使模型无法有效地将输入与输出相关联。此外,测试集将没有足够的数据来准确评估模型的性能。估计的性能可能会过高或过低。
  3. 针对信息不足的可行替代模型评估技术是 k 折交叉验证技术。采用训练-测试划分评估过程的优势超越了数据集的规模,包括提高计算效率。
  4. 当涉及到特定模型昂贵的训练时,重复评估的过程在各种其他过程中被证明是无效的。一个例子可能是深度神经网络模型。在这种情况下,典型的方法是利用训练-测试方法。另一方面,一个项目可能拥有庞大的数据集和高效的模型,但需要对模型的性能进行快速评估。在这种情况下,再次采用训练-测试划分过程。随机选择将原始训练数据集中的样本分成两个子集。

配置训练-测试划分集

在此过程的领域中,存在一个主要的设置因素。它根据训练集和测试集的大小是不允许的。这通常称为 0 到 1 之间的比率,表示训练集和测试集的比例。您必须选择一个满足项目需求的划分比率,包括以下元素:

  • 训练集代表性
  • 评估模型的计算成本
  • 测试集代表性
  • 训练模型的计算成本

常见的划分百分比包括

训练测试
80%20%
67%33%
50%50%

Scikit-Learn 中训练-测试划分的过程

Scikit-Learning 是 Python 机器学习领域中一个非常流行的库,它允许我们使用一个方法来查找训练和测试之间的划分,即 train_test_split() 函数。此函数使用作为输入的数据集,从而将数据集分成两个集合。

此外,原始数据集可以分为两部分,一部分用于输入 (x),另一部分用于输出 (y)。然后,您可以调用一个函数,该函数生成这两个数组并正确分离训练、测试和验证子集。

如果您希望指示划分大小,可以使用“test_size”参数。此参数可以接受多行(整数)或介于 0 到 1 之间的比例(浮点数)。后一种选项更常用,典型值如 0.33。在这种情况下,33% 的数据集将分配给测试集,而其余 67% 将分配给训练集。

我将展示一个用于分类目的的一千个项目的示例数据集。此后,您将找到完整的样本集合的全面概述。

运行示例时,数据集被分成训练集和测试集。下面,您可以找到新数据集的大小。如前所述,显然有 330 个示例(33%)分配给测试集,而 670 个示例(67%)分配给训练集。

输出

(670, 2) (330, 2) (670,) (330,)

说明

上述代码正在解释用于机器学习任务的数据集。它使用 make_blobs() 函数生成 1000 个数据点。它正在创建不同形状和大小的簇。然后,它使用 33% 的测试大小将此数据集分成训练集和测试集。之后,它显示每个集合的大小,为您提供有关训练和测试数据集中样本和特征数量的信息。

此外,train_size 参数,它可以是整数行数或原始数据集的 0 到 1 的分布,例如 0.67 代表 67 百分位数,允许数据集的划分。

什么是可重复的训练测试数据?

使用机器学习技术,一致的训练测试划分保证了用于训练和测试模型的信息即使在重复划分执行后也不会继续改变。这确保您可以重复您的工作并在不同模型之间比较相同的准确性。

它是如何工作的?

  1. 首先,您需要划分数据。数据分割产生两个子集,称为训练集和评估集。评估过程衡量模型在未见过数据上的有效性,而训练过程识别模型。
  2. 第二步是随机性。分离通常是可选的。这意味着当处理分离时,训练集和测试集将各自拥有不同的数据集。
  3. 作为最后一个选项,使其可重复。为了模拟裂缝,它们必须填充所需的特征。这可以通过随机元素来完成。该过程从一个随机数生成器开始,其精确值被称为随机化元素。通过创建一个随机化元素,指示计算机每次执行划分时都使用相同的随机数序列。因此,无论您使用多少部分,您将始终看到相同的训练和测试。

您可以通过将一个整数分配给 random_state 来实现此目的。它不是一个可调的超参数,因此任何值都可以。

以下示例描绘了这一概念,演示了两个数据集划分的结果是相同的。

输出

[[ 9.51341402 -3.47126511]
 [-8.14017839 -3.59592016]
 [-8.65321875  4.04931456]
 [ 8.9036352  -2.71056751]
 [ 9.56697901 -3.65027215]]
[[ 9.51341402 -3.47126511]
 [-8.14017839 -3.59592016]
 [-8.65321875  4.04931456]
 [ 8.9036352  -2.71056751]
 [ 9.56697901 -3.65027215]]

说明

下面的 Python 代码使用 sklearn.datasets 模块中的 make_blobs 函数生成合成数据,生成一个包含 100 个观测值的数据集。然后它使用 sklearn.model_selection 模块中的 train_test_split 函数将数据集分成训练测试集,分配 33% 的数据用于测试,同时保持固定的随机性为 1 以实现可重复性。该代码指的是训练集中特征矩阵的前五个字母。但是,代码中多次调用 train_test_split 函数两次,参数相同,导致训练例程的相同部分被两次暴露,无论是用于参考还是故障排除目的。

分层训练测试划分

分层划分是一种特殊的训练-测试划分,用于机器学习中处理不平衡数据集。数据集中的不平衡发生在不同类别的分布不均时。例如,我们训练一个模型来检测电子邮件是否是垃圾邮件。如果 99% 的电子邮件是垃圾邮件,典型的训练-测试划分可能会导致一个擅长分类垃圾邮件但识别非垃圾邮件表现不佳的模型。

分层训练-测试划分工作程序

  1. 排序数据:根据类别标签而不是随机序列组织数据集对于确保公平公正地描绘每个类别至关重要。此排序过程保证了所有类别在数据集中的均匀分布。
  2. 折叠数据:排列后,您可以将其分成不同的段或分区。通常,分区的数量由您的 k 折交叉验证技术决定。
  3. 拆分训练和测试数据:为了完成任务,每次迭代都使用考试集,而其余迭代则使用准备集。此迭代过程对每次迭代重复。

要使用上述方法,您可以将给定数据集的 y 分量分配给 stratify 参数。通过这样做,train_test_split() 函数将确保在训练和测试子集中保持给定 y 数组中每个类的示例分布。

我们可以将数据集分成训练集和测试集,而无需使用 stratify 参数。下面,您可以看到完整的代码示例。

输出

Counter({0: 94, 1: 6})
Counter({0: 45, 1: 5})
Counter({0: 49, 1: 1})

说明

上面声明的程序描述了一个包含 100 个观测值的数据集,其中一个类别占 94%,另一个类别占 6%。它将数据集分成两个集合,一个训练集和一个测试集,所有样本都被分配到测试集进行类别分布分析。然后,我们确定了原始数据集、训练集(空集)和测试集中每个类别的样本数量,以根据类别参数构建不平衡图像,并展示机器学习中如何管理数据集多样性不平衡。

下一步,我们现在可以通过划分训练集和测试集之间的数据来比较数组。

输出

Counter({0: 94, 1: 6})
Counter({0: 47, 1: 3})
Counter({0: 47, 1: 3})

说明

该程序创建了一个具有奇数类分布(94%-6%)的合成数据集,并定义了一种在为机器学习分类数据时保留此分布的方法。接下来,我们创建了这个数据集,然后将其分为训练测试集。学习前后频率反映了类不平衡的持久性,这是成功模型训练和分析的关键因素。

现在我们已经熟悉了 train_test_split 函数。接下来,深入评估机器学习模型的性能。

使用训练测试划分评估机器学习模型

在本节中,我们将探讨应用训练-测试划分技术来评估回归和传统分类任务的预测建模数据集上的机器学习模型。

在此演示中,我们将通过使用训练-测试划分技术在声纳数据集上评估随机森林算法。声纳数据集是机器学习中广泛使用的数据集,包含 208 个数据实例。它包含 60 个数值输入变量和一个具有两个不同类别值的目标变量,从而实现二元分类。

该数据集的目的是确定声纳回波是否表示存在巨石或模拟爆炸装置。

输出

(208, 60) (208,)

说明

上述 Python 代码使用 Pandas 库从给定的 URL 读取 CSV 文件。它将数据集加载到名为 dataframe 的 DataFrame 中,不假设存在列标题,因为“header=None”。因此,它将 DataFrame 中的值提取到名为“data”的 NumPy 数组中。然后,代码将特征 (X) 与目标变量 (y) 分开,其中“X”包含所有行和除最后一列之外的所有列,“y”包含“data”的最后一列。然后,它打印特征矩阵“X”和目标数组“y”的形状。

首先,让我们通过划分训练和测试来评估模型。导入的数据将分为输入和输出两部分。

输出

(208, 60) (208, )

代码

输出

Training data: (70, 2) (70,)
Testing data: (30, 2) (30,)

说明

在上面的代码示例中,我们使用 NumPy 库生成了一个合成数据集,包含 100 个样本和两个特征。目标变量“y”使用随机整数 0 或 1 创建。然后,使用 scikit-learn 库中的 train_test_split 函数将数据集分成训练集和测试集,其中 30% 的数据保留用于测试,70% 用于训练。最后一步,代码打印训练和测试数据集的维度。

接下来,我们有一个选项,将数据集分成 67% 用于训练模型,33% 用于评估模型。这种划分是随机进行的。

输出

(139, 60) (69, 60) (139,) (69, )

接下来,我们可以使用专门用于训练目的的数据集来完成和调整模型。

之后,我们使用训练好的模型生成预测,并通过测量分类准确率性能指标来评估结果。

完整代码

运行完整代码

输出

(208, 60) (208,)
(139, 60) (69, 60) (139,) (69,)
Accuracy: 0.783

说明

在上面提供的代码部分中,我们使用随机森林分类器预测从 URL 检索到的数据集的目标标签。接下来,数据从 URL 读取到 pandas DataFrame 中并转换为 NumPy 数组,将特征 (X) 与目标变量 (y) 分开。打印 X 和 y 的维度以了解数据集的形状。然后,使用 train_test_split 函数将数据集分成训练集和测试集,其中 33% 的数据保留用于测试,通过 random_state=1 确保可重现性。实例化随机森林分类器,在训练数据上进行训练,然后用于预测测试集的标签。使用 accuracy_score 函数通过比较预测标签与测试集中的实际标签来计算模型的准确性,并打印结果进行评估。

回归的训练测试划分

本节将描述使用训练-测试划分技术在住房数据集上评估随机森林算法的过程。住房数据集包括 506 个数据条目,每个条目包含 13 个数值输入变量和一个数值目标变量。该数据集作为标准机器学习数据集。其目的是根据各种房屋特征预测印度房屋的价格。

成功获取和导入数据集后。下面是其结构的摘要,在示例中呈现,从而建立了一个 Pandas DataFrame。

输出

(506, 14)

现在可以通过训练-测试划分来评估模型。最初,已上传的数据集必须分离为输入和输出组件。

之后,我们将划分数据集,其中 67% 用于训练模型,剩余的 33% 用于评估模型。这种划分是随机进行的。

之后,我们定义并使用训练数据集拟合模型。

现在,利用训练模型生成预测,并使用平均绝对误差 (MAE) 性能指标评估结果。

运行完整代码

输出

(506, 13) (506,)
(339, 13) (167, 13) (339,) (167,)
MAE: 2.171

说明

在上述代码中,我们创建了一个随机森林回归器,用于根据从 URL 检索到的数据集预测栖息地价值。接下来,从给定 URL 读取数据到 pandas DataFrame 中并转换为 NumPy 数组。然后,使用 train_test_split 函数将数据集分成训练测试,其中 33% 的数据保留用于测试,并且 random_state=1 确保了给定随机森林回归器实例化的可重现性,它在训练数据上进行训练,并用于预测测试集的定居点价值。使用 mean_absolute_error() 函数计算预测和实际栖息地价值之间的平均绝对误差 (MAE)。

结论

训练和测试数据按功能划分为 80-20 在机器学习和数据分析领域获得了广泛的欢迎。这种有效的方法可以轻松处理模型的训练和测试性能。划分数据集降低了过拟合的风险,并能够对模型有效性进行可靠评估。80-20 的划分保持了有用的平衡,提供了高效快速的采样和可靠的预测结果。