1. 引言

在机器学习建模过程中,一个常见的任务是将数据集划分为训练集(Training Set)和测试集(Test Set)。本文将探讨这一过程的重要性、划分方法以及如何根据数据集大小选择合适的划分比例。

如果你也曾经遇到过模型在训练数据上表现很好,但在新数据上却“翻车”的情况,那你一定明白为什么我们需要一个独立的测试集来评估模型性能。

2. 为什么要划分训练集和测试集?

简单来说:我们希望评估模型在未知数据上的表现,而不是它已经“见过”的数据。

举个例子:

就像老师提前把期末考试题发给学生练习,然后考试时再出这些题,这样根本无法判断学生是真的掌握了知识,还是只是记住了答案。

所以,我们需要将数据分成两部分:

  • 训练集:用于训练模型,调整模型参数。
  • 测试集:用于评估模型在未见过的数据上的泛化能力。

这种将数据一分为二的方法,称为 Holdout Method(保留法)

数据划分示意图

split dataset dataset 1

优点

  • 简单高效,适合快速验证。
  • 可以避免模型过拟合训练数据。

缺点

  • 划分方式不同,可能导致评估结果不稳定。
  • 对小数据集不太友好,容易丢失关键信息。

⚠️ 注意:训练集和测试集应尽可能保持数据分布一致,否则评估结果将失去意义。

3. 如何划分训练集和测试集?

3.1 常见划分比例

你可能听过这些比例:

  • 80:20 ✅(最常见)
  • 70:30 ❗(适合小数据)
  • 50:50 ❌(不推荐,除非数据非常大)
  • 99:1 🔥(适用于百万级数据)

没有统一的最佳比例,要根据数据集大小、模型复杂度、任务类型来决定。

3.2 根据数据量选择划分比例

数据量 推荐比例 说明
n < 1,000 不建议用 Holdout,改用 Cross-Validation 每条数据都很珍贵,保留一部分用于测试可能影响模型性能
1,000 ≤ n < 10,000 70:30 平衡了训练与测试数据量
n ≥ 100,000 80:20 或 90:10 数据量大,可以留出更多测试数据
n ≥ 百万级 99:1 甚至更高,因为训练数据已经足够多

3.3 划分示意图

split dataset

3.4 如何验证划分是否合理?

你可以尝试以下步骤:

  1. 先用 80:20 划分数据。
  2. 用 80% 的训练集训练模型。
  3. 用不同比例的测试集(如 100%、70%、50%)进行评估。
  4. 如果较小的测试集也能反映整体性能,说明划分合理。
  5. 否则,考虑增加测试集比例。

3.5 代码示例(Python)

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

说明

  • test_size=0.2 表示 20% 用于测试。
  • stratify=y 保证类别分布在训练集和测试集中保持一致(适用于分类任务)。
  • random_state=42 保证每次划分结果一致。

4. 小结

  • 划分训练集和测试集是评估模型泛化能力的基本手段。
  • 常用比例为 80:20,但需根据数据量灵活调整。
  • 小数据建议使用交叉验证(Cross-Validation),大数据可以使用更高比例。
  • 划分时注意保持分布一致,避免引入偏差。
  • 最终目标是:测试集能代表整个数据集的多样性。

建议:多尝试几种划分方式,观察模型在不同测试集下的表现,有助于找到最佳评估策略。


原始标题:Splitting a Dataset into Train and Test Sets