如何在 Python 中不使用 Sklearn 将数据分割成训练集和测试集


在机器学习或人工智能模型领域,数据是其基石。数据处理方式决定了模型的整体性能,其中包括将数据集分割成训练集和验证集这一不可或缺的任务。虽然 sklearn 的 train_test_split() 函数经常被使用,但在某些情况下,Python 爱好者可能无法使用它,或者他们可能很好奇如何手动实现类似的结果。本文探讨了如何在不依赖 sklearn 的情况下,将数据分割成训练集和验证集。我们将为此目的使用 Python 的内置库。

示例 1:数据分割背后的原理

在深入探讨细节之前,让我们先讨论一下其原理。机器学习算法需要大量数据来学习。这些数据(训练集)帮助模型识别模式并进行预测。但是,为了评估模型的性能,我们需要模型以前从未见过的数据。这些未经触碰的数据是验证集。

使用相同的数据进行训练和验证会导致模型过拟合——模型在训练数据上表现出色,但在未见过的数据上却表现不佳。因此,数据通常按 70-30 或 80-20 的比例划分,其中较大的部分用于训练,较小的部分用于验证。

在 Python 中手动分割数据

我们将从一种简单而有效的方法开始,使用 Python 的内置操作来分割数据。这里使用的示例是整数列表,但此技术适用于任何数据类型。

假设我们有一个如下所示的数据集 data

data = list(range(1, 101))  # data is a list of integers from 1 to 100
  • 目标是将此数据分割成 80% 的训练数据和 20% 的验证数据。

  • 首先,我们将导入必要的库。

  • random 模块提供了各种生成随机数的函数,我们将使用它来打乱我们的数据。接下来,我们将打乱我们的数据。

  • 打乱数据后,我们将将其分割成训练集和验证集。

split_index 指示数据被分割的点。我们将其计算为 split_ratio 和数据集大小的乘积。

最后,我们使用切片来创建训练集和验证数据集。

训练数据包含从列表开头到 split_index 的元素,验证数据包含从 split_index 到列表末尾的元素。

示例

import random
random.shuffle(data)

split_ratio = 0.8  # We are using an 80-20 split here
split_index = int(split_ratio * len(data))

train_data = data[:split_index]
test_data = data[split_index:]

输出

train_data = [65, 51, 8, 82, 15, 32, 11, 74, 89, 29, 50, 
34, 93, 84, 37, 7, 1, 83, 17, 24, 5, 33, 49, 90, 35, 57, 
47, 73, 46, 95, 10, 80, 59, 94, 63, 27, 31, 52, 18, 76, 
91, 71, 20, 68, 70, 87, 26, 64, 99, 42, 61, 69, 79, 12, 
3, 66, 96, 75, 30, 22, 100, 14, 97, 56, 55, 58, 28, 23, 
98, 6, 2, 88, 43, 41, 78, 60, 72, 39]

test_data = [45, 53, 48, 16, 9, 62, 13, 81, 92, 54, 21, 
38, 25, 44, 85, 19, 40, 77, 67, 4]

由于代码涉及数据的随机打乱,每次运行时输出可能会有所不同。

示例 2:使用 Numpy 分割数据

另一种无需 sklearn 即可分割数据的方法是利用 numpy 库。Numpy 是一个强大的数值计算库,可以用来创建数组并有效地操作它们。

以下是如何使用 numpy 分割数据。

  • 首先,导入 numpy 库。然后,创建一个 numpy 数组。

  • 打乱数组。最后,分割数组。

index 表示我们的数据池被分成训练集和验证集的点。它是通过使用预定的分割比例(在本例中为 0.8,用于 80-20 分割)和数据点的总数的乘积来获得的。

最后一步是使用计算出的分割索引创建训练集和测试数据集。我们为此操作使用列表切片。

示例

import numpy as np

data = np.array(range(1, 101))  
# data is a numpy array of integers from 1 to 100
np.random.shuffle(data)

split_ratio = 0.8  # We are using an 80-20 split here
split_index = int(split_ratio * len(data))

train_data = data[:split_index]
test_data = data[split_index:]

输出

train_data = [52, 13, 87, 68, 48, 4, 34, 9, 74, 25, 
30, 38, 90, 83, 54, 45, 61, 73, 80, 14, 70, 63, 75, 
81, 97, 60, 96, 8, 43, 20, 79, 46, 50, 76, 18, 84, 
26, 31, 71, 56, 22, 88, 64, 95, 91, 78, 69, 19, 42, 
67, 77, 2, 41, 32, 11, 94, 40, 59, 17, 57, 99, 44, 
5, 93, 62, 23, 3, 33, 47, 92]

test_data = [49, 66, 7, 58, 37, 98, 100, 24, 6, 55, 
28, 16, 85, 65, 51, 35, 12, 10, 86, 29]

结论

将数据分割成训练集和验证集是机器学习和数据科学项目中的一个关键步骤。虽然 sklearn 提供了一种简单的方法来执行此任务,但了解如何手动执行此操作非常重要。正如我们所展示的,这可以使用 Python 的内置操作或 numpy 库来完成。

您选择使用 sklearn、Python 的内置操作还是 numpy 取决于您的特定需求和限制。每种方法都有其优点和缺点。手动方法可以让您更好地控制流程,而 sklearn 的 train_test_split() 函数更易于使用,并且包含其他功能,例如分层抽样。

更新于:2023年8月28日

757 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告