将数据分成训练集和测试集对于可靠的模型评估是基础的。这里将演示如何实际执行这种分割,采用一种在Python中常用且广受欢迎的scikit-learn库所使用的方法。不过,这种做法适用于各种工具,不受具体工具的限制。设想我们有一个小型数据集,我们想要预测一个水果是苹果(用0表示)还是橙子(用1表示),这基于两个特征:水果的重量(克)和质地(0表示光滑,1表示凹凸不平)。我们的数据可能看起来像这样:特征 (X): 每个水果的重量和质地。标签 (y): 实际的水果类型(0代表苹果,1代表橙子)。假设我们有10个水果的数据:特征 (X): [[150, 0], [170, 0], [140, 1], [130, 1], [160, 0], [180, 0], [125, 1], [135, 1], [190, 0], [145, 1]]标签 (y): [0, 0, 1, 1, 0, 0, 1, 1, 0, 1]我们有10个数据点(行)。X中的每一行都对应着y中相同位置的标签。例如,第一个水果重150克,质地光滑([150, 0]),并且是苹果(0)。我们的目标是将这些数据分成训练集(用于训练模型)和测试集(用于评估模型学习得如何)。我们将采用常见的70/30分割比例,这表示70%的数据(7个样本)将用于训练,而30%(3个样本)将保留用于测试。使用 scikit-learn 进行分割在Python中,scikit-learn库在其model_selection模块中提供了一个便捷的函数,名为train_test_split。让我们看看如何使用它。首先,通常需要导入函数并准备数据(通常使用NumPy等库,但对于这个简单的例子,Python列表也适用):# 导入函数 from sklearn.model_selection import train_test_split import numpy as np # 常用于数据表示 # 我们的特征数据(重量,质地) X = np.array([[150, 0], [170, 0], [140, 1], [130, 1], [160, 0], [180, 0], [125, 1], [135, 1], [190, 0], [145, 1]]) # 我们的标签数据(0=苹果,1=橙子) y = np.array([0, 0, 1, 1, 0, 0, 1, 1, 0, 1]) # 执行分割(70% 训练,30% 测试) # 我们设置 random_state 以获得可复现的结果 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42 ) # 让我们看看结果 print("原始数据点数量:", len(X)) print("训练数据点数量:", len(X_train)) print("测试数据点数量:", len(X_test)) print("\n训练特征 (X_train):\n", X_train) print("\n训练标签 (y_train):\n", y_train) print("\n测试特征 (X_test):\n", X_test) print("\n测试标签 (y_test):\n", y_test)理解 train_test_split 函数让我们分解train_test_split(X, y, test_size=0.3, random_state=42)的重要组成部分:X: 这是我们的输入特征数据。y: 这是我们对应的标签数据。该函数确保在分割过程中,特征行与其标签之间的关联得到保持。test_size=0.3: 此参数指定数据集中用于测试分割的比例。这里,0.3表示30%的数据将被分配给测试集(X_test,y_test),其余70%将用于训练集(X_train,y_train)。您也可以使用train_size=0.7来达到相同的效果。如果您提供一个整数而不是浮点数(例如,test_size=3),它指定了测试样本的绝对数量。random_state=42: 如前所述,分割通常涉及在划分数据之前对其进行随机打乱。将random_state设置为一个特定的整数(例如42、0或任何其他数字)可确保每次运行代码时都会发生相同的随机打乱和分割。这对于获得可复现的结果很重要。如果省略random_state,每次都会得到不同的分割结果,这会使调试或比较结果变得困难。查看输出运行上述代码将产生类似于这样的输出(具体行取决于使用的random_state):Original data points: 10 Training data points: 7 Test data points: 3 Training Features (X_train): [[145 1] [170 0] [140 1] [160 0] [135 1] [180 0] [125 1]] Training Labels (y_train): [1 0 1 0 1 0 1] Test Features (X_test): [[190 0] [130 1] [150 0]] Test Labels (y_test): [0 1 0]请注意:我们最初有10个数据点。训练集(X_train,y_train)包含7个数据点(10个数据点的70%)。测试集(X_test,y_test)包含3个数据点(10个数据点的30%)。X_train中的行对应y_train中的标签,测试集也一样。特征和标签的原始关联在每个集合中都得到了保持。数据在分割前已被打乱,这得益于train_test_split的特性(由random_state控制)。这里是该过程的简单示意图:digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="helvetica", fontsize=10]; edge [arrowhead=vee]; subgraph cluster_0 { label = "原始数据集(10个样本)"; style=filled; color="#e9ecef"; node [style=filled, color="#ced4da"]; Original [label="特征 (X)\n标签 (y)"]; } subgraph cluster_1 { label = "分割过程\n(70% 训练 / 30% 测试)"; style=filled; color="#e9ecef"; node [style=filled]; Splitter [label="train_test_split\n(random_state=42)", shape=invhouse, color="#a5d8ff"]; } subgraph cluster_2 { label = "结果集合"; style=filled; color="#e9ecef"; node [style=filled]; TrainSet [label="训练集\n(7个样本)", color="#b2f2bb"]; TestSet [label="测试集\n(3个样本)", color="#ffc9c9"]; } Original -> Splitter; Splitter -> TrainSet [label=" X_train\n y_train"]; Splitter -> TestSet [label=" X_test\n y_test"]; }该图展示了原始数据集通过分割函数,生成具有指定比例的独立训练集和测试集的过程。这种数据分割的实际操作步骤很重要。您现在有了一个训练集(X_train,y_train)来训练您的模型,以及一个模型尚未见过的完全独立的测试集(X_test,y_test)。这个测试集将在之后用来公正评估您的模型如何根据我们学到的指标来适应新的、未见过的数据。