为什么需要划分数据?

想象一下,如果老师用课后习题来作为期末考试的题目,学生们很可能会考得很好,但这能真正反映他们的知识水平吗?显然不能,因为他们只是“背下了答案”。

机器学习也是如此。如果我们用所有数据来训练模型,然后又用同样的数据来评估它,模型会得到虚高的分数,因为它已经“见过”了答案。为了得到一个公平的评估,我们需要用模型从未见过的新数据来测试它。

三个核心数据集

训练集 (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),它将训练集多次划分为不同的训练/验证子集,并对多次评估的结果取平均,从而得到更可靠的模型性能度量。