为什么我们对训练和测试数据使用 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 年引入了统计缩放原则。该定律的主要目的是指导训练和神经网络的数据分布,以测试和避免过拟合。与帕累托原则相比,盖恩定律意味着模型划分基于样本中可调参数的数量。 根据该定律,可调参数数量的平方根应与分配给验证集的数据集部分成反比。因此,随着模型难度的增加,应将更大比例的数据分配给验证集以防止过拟合。 为什么我们需要划分数据集?为了准确识别机器学习模型的行为,有必要包含在训练期间未使用的其他模型。如果不这样做可能会导致对模型的评估产生偏差。
训练集划分评估使用训练集划分方法进行评估包括通过将数据分成不同部分来衡量机器学习模型的有效性。随后,您在这些子集上训练和评估您的模型。这一步在机器学习中具有极其重要的意义,因为它减少了过拟合,并确保您的模型能够有效地评估不熟悉的数据。 ![]() 最简单的方法是训练-测试划分来划分数据,包括将数据集分成两组。
如何划分数据集?当我们试图找到训练数据和测试数据之间的最佳比例时,最初的结果是 80:20。我们将 80% 的可用数据分配用于训练,而剩余部分用于测试。过去,较早的参考文献和教科书建议 70:30 甚至 50:50 的划分。 ![]() 然而,专注于深度学习或大数据来源的资料表明,划分已显著转向 99:1。值得注意的是,与机器学习中的其他挑战类似,这个问题缺乏明确的解决方案。当训练数据不足时,参数的估计变得高度不可预测。相反,测试数据的短缺会导致性能评估的显著差异。 导入数据集我们将使用印度住房数据集。在导入数据集之前,您可以使用 Pandas 将数据导入到数据框中。pip 命令将帮助您安装 pandas 库。 现在,将数据集合并到 Python 的 Pandas 数据框中。 ![]() 假设“卧室”列是输出 (Y)。 同时,我们必须从数据集中删除该列以形成输入向量。 现在,使用 Pandas 的 .head() 方法查看输入和输出的样子。 ![]() 输出 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% 用于测试。因此,它打印出原始数据集和分割数据集的形状。 什么时候需要使用训练-测试划分?
配置训练-测试划分集在此过程的领域中,存在一个主要的设置因素。它根据训练集和测试集的大小是不允许的。这通常称为 0 到 1 之间的比率,表示训练集和测试集的比例。您必须选择一个满足项目需求的划分比率,包括以下元素:
常见的划分百分比包括
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 百分位数,允许数据集的划分。 什么是可重复的训练测试数据?使用机器学习技术,一致的训练测试划分保证了用于训练和测试模型的信息即使在重复划分执行后也不会继续改变。这确保您可以重复您的工作并在不同模型之间比较相同的准确性。 它是如何工作的?
您可以通过将一个整数分配给 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% 的电子邮件是垃圾邮件,典型的训练-测试划分可能会导致一个擅长分类垃圾邮件但识别非垃圾邮件表现不佳的模型。 分层训练-测试划分工作程序
要使用上述方法,您可以将给定数据集的 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 的划分保持了有用的平衡,提供了高效快速的采样和可靠的预测结果。 下一个主题如何在 Python 中编写多行语句 |
我们请求您订阅我们的新闻通讯以获取最新更新。