机器学习中的三个数据集用一个比喻就特别好懂:
训练集是课本和习题
证实集是模拟考试卷
测试集是高考卷
作用和划分方法。
1. 各自的作用
训练集(Training Set):让模型背书
作用:用于训练模型参数,让模型从数据中学习特征和规律。梯度下降、权重更新都在这个集合上完成。
目的:让模型在训练集上的损失(Loss)尽可能低。
证实集(Validation Set):当裁判选模型
作用:不参与训练,只用于调参。用来调整超参数(如学习率、网络层数)、选择特征,以及防止过拟合。
目的:考虑不同配置下的模型泛化能力,选出表现最好的一组超参数。注意,证实集反馈的信息会被人类用来修改模型,所以模型“间接”看到了证实集。
测试集(Test Set):当考官出分数
作用:全程封存,只在模型完全定稿后一次性使用。用于考虑模型在完全未知数据上的最后泛化性能。
目的:给出模型的准确率/误差,作为业务上线或论文投稿的依据。严禁根据测试集的结果回头去调模型,否则就是数据泄露,导致分数虚高。
2. 常用的划分比例
划分比例取决于数据总量:
数据量较大(百万级以上):训练集98%,证实集1%,测试集1%。大数据不需要太多证实和测试样本,够用就行。
数据量中等(万级~十万级):经典的 6:2:2 或 7:1.5:1.5。
数据量较小(几千条):建议少分测试集,多留训练数据,比如 6:2:2,或者干脆不用固定测试集,改用交叉证实。
3. 划分方法
绝对红线:在划分之前,必须先打乱数据。如果数据是按时间或类别排序的,直接取前70%会导致训练集和测试集分布不一致。
针对特殊情况,划分方法要调整:
小数据集:不用训练/证实/测试三份,改用 K折交叉证实(。把数据分成K份(如5份),轮流拿4份训练、1份证实,取平均分。此时一般不再单独设测试集,或用另一个独立留出集。
时序数据:绝对禁止随机划分! 必须按时间顺序切分。如用2020-2024年的数据做训练+证实,用2025年的数据做测试。用未来预测过去是毫无意义的。
类别极度不均衡:使用分层抽样,保证训练集、证实集、测试集中正负样本的比例和原始数据集保持一致。
4. 容易犯的错误
窥探测试集:这是最严重的学术不端。哪怕只根据测试集的结果改了一次参数,测试集就沦为了证实集,报告的成绩就不可信了。
数据泄露:在划分之前做了数据归一化(Standardization)。正确做法:先用训练集的均值和标准差拟合 Scaler,再变换证实集和测试集。如果先用全量数据算均值和方差,证实集和测试集的信息就已经污染了训练集。
证实集和测试集分布不一致:保证证实集和测试集来自同一个数据分布。如果训练集是网上爬的清晰图片,测试集是手机拍的模糊图片,再怎么调参也没用。