1. 引言
在机器学习建模过程中,一个常见的任务是将数据集划分为训练集(Training Set)和测试集(Test Set)。本文将探讨这一过程的重要性、划分方法以及如何根据数据集大小选择合适的划分比例。
如果你也曾经遇到过模型在训练数据上表现很好,但在新数据上却“翻车”的情况,那你一定明白为什么我们需要一个独立的测试集来评估模型性能。
2. 为什么要划分训练集和测试集?
简单来说:我们希望评估模型在未知数据上的表现,而不是它已经“见过”的数据。
举个例子:
就像老师提前把期末考试题发给学生练习,然后考试时再出这些题,这样根本无法判断学生是真的掌握了知识,还是只是记住了答案。
所以,我们需要将数据分成两部分:
- 训练集:用于训练模型,调整模型参数。
- 测试集:用于评估模型在未见过的数据上的泛化能力。
这种将数据一分为二的方法,称为 Holdout Method(保留法)。
数据划分示意图
✅ 优点:
- 简单高效,适合快速验证。
- 可以避免模型过拟合训练数据。
❌ 缺点:
- 划分方式不同,可能导致评估结果不稳定。
- 对小数据集不太友好,容易丢失关键信息。
⚠️ 注意:训练集和测试集应尽可能保持数据分布一致,否则评估结果将失去意义。
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 划分示意图
3.4 如何验证划分是否合理?
你可以尝试以下步骤:
- 先用 80:20 划分数据。
- 用 80% 的训练集训练模型。
- 用不同比例的测试集(如 100%、70%、50%)进行评估。
- 如果较小的测试集也能反映整体性能,说明划分合理。
- 否则,考虑增加测试集比例。
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),大数据可以使用更高比例。
- 划分时注意保持分布一致,避免引入偏差。
- 最终目标是:测试集能代表整个数据集的多样性。
✅ 建议:多尝试几种划分方式,观察模型在不同测试集下的表现,有助于找到最佳评估策略。