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),大数据可以使用更高比例。
划分时注意保持分布一致,避免引入偏差。
最终目标是:测试集能代表整个数据集的多样性。
✅ 建议:多尝试几种划分方式,观察模型在不同测试集下的表现,有助于找到最佳评估策略。