数据划分:公平评估模型的基石
在开始模型训练之前,一个至关重要的步骤是将数据集划分为几个独立的子集。这能确保我们对模型的评估是公平且无偏的,从而避免模型“自欺欺人”。
为什么需要划分数据?
想象一下,如果老师用课后习题来作为期末考试的题目,学生们很可能会考得很好,但这能真正反映他们的知识水平吗?显然不能,因为他们只是“背下了答案”。
机器学习也是如此。如果我们用所有数据来训练模型,然后又用同样的数据来评估它,模型会得到虚高的分数,因为它已经“见过”了答案。为了得到一个公平的评估,我们需要用模型从未见过的新数据来测试它。
三个核心数据集
训练集 (Training Set)
📚
好比是“教科书与课后习题”
目标:让模型学习数据中的规律和模式。这是模型主要的学习材料,占比通常最大。
常见问题:如果模型只在训练集上表现好,但在新数据上表现差,就发生了“过拟合”。
验证集 (Validation Set)
📝
好比是“模拟考试”
目标:调整模型的超参数(如学习率)和选择最佳模型。它不参与训练,只用于“调优”。
常见问题:过度使用验证集来调优,也可能导致模型对验证集“过拟合”。
测试集 (Test Set)
🏆
好比是“最终的高考”
目标:在模型训练和调优完成后,提供一次性的、无偏的最终评估。
重要原则:测试集在整个过程中只能使用一次,绝不能用它来调优模型!
动手试试:交互式数据划分
拖动下面的滑块,调整训练集和验证集的比例,观察整体数据划分的变化。代码和流程图也会同步更新!
from sklearn.model_selection import train_test_split
# 假设 X 是特征, y 是标签
# X, y = ...
# 第一次划分:分出训练集和临时集
X_train, X_temp, y_train, y_temp = train_test_split(
X, y, test_size=0.30, random_state=42
)
# 第二次划分:从临时集中分出验证集和测试集
X_val, X_test, y_val, y_test = train_test_split(
X_temp, y_temp, test_size=0.50, random_state=42
)
注意事项
在实践中,如果数据集较小,固定的验证集可能会带来偶然性。一种更稳健的方法是交叉验证 (Cross-Validation),它将训练集多次划分为不同的训练/验证子集,并对多次评估的结果取平均,从而得到更可靠的模型性能度量。