一篇文章用大白话带初学者搞清训练集、测试集及验证集关系及场景逻辑(包清楚)
数据挖掘的第一系列
先用最直白的大白话给大家讲清楚理清楚训练集、测试集、验证集这三个数据集的区别和用途
保证听完就懂!
创作码字不易 ,希望你在文章中可以解决的疑惑,不错的话就点个赞吧!
实际生产测试中原始数据中一般拆成
训练集60% 验证集20% 测试集20%
大概关系可以按下图简单理解
1. 训练集:“练习题册”
是什么:用来教模型学习规律的数据
干什么用:
- 就像你做数学题,通过大量练习记住解题方法
- 模型在这里反复调整自己的"脑回路"(调整参数)
特点: - 可以反复使用(就像一本练习题做很多遍)
- 能看到标准答案(有标注的数据)
举一个栗子🌰:
使用过去5年的天气数据(温度、湿度等)和是否下雨的记录,让模型学习怎么预测下雨
2. 验证集:“模拟考试卷”
是什么:用来检查学习效果的数据
干什么用:
- 就像月考,检测你学得怎么样
- 用来选择最好的解题方法(调参)和避免死记硬背(过拟合)
特点: - 偶尔用几次(一般调参时用)
- 考完会看错题(根据结果调整模型)
举第二个栗子🌰🌰:
用去年12月的天气数据测试模型,发现它总把"大雾天"误判成"下雨",于是调整模型参数
3. 测试集:“高考真题卷”
是什么:最终检验实力的数据
干什么用:
- 就像高考,考完就定胜负了
- 模拟模型在完全陌生数据上的真实表现
特点: - 只能用一次!(这点超重要)
- 必须是从未见过的全新数据
举第三个栗子🌰🌰🌰:
用今年1-3月的新天气数据最终测试模型,这个数据在训练和调参时绝对没碰过
三者的关系:进阶打怪流程
- 学习阶段:用训练集(练习题)疯狂学习
- 模拟考阶段:用验证集(月考)检查哪里没学好 → 改进方法
- 终极大考:用测试集(高考)检验最终水平
想象如果你高考前已经做过高考原题:
- 考高分不是因为能力强,而是因为见过答案
- 这就是数据泄露(leakage),会导致虚假的好成绩
实际应用场景
- 训练集:用来训练各种算法(比如随机森林、神经网络)
- 验证集:比较哪个算法最好,调整参数
- 测试集:最后验证这个选出来的最优模型
更精准的类比
数据集 | 教育场景类比 | 核心意义 | 使用次数限制 |
---|---|---|---|
训练集 | 日常课堂练习 | - 反复做题掌握知识(模型学习规律) - 允许查看答案(反向传播优化) | 可无限次使用 |
验证集 | 月考/模拟考试 | - 阶段性检测学习效果(调参/选模型) - 发现知识盲点(过拟合检测) - 考完会讲评(根据结果调整学习策略) | 可多次使用(但需谨慎) |
测试集 | 从未见过的高考试卷 | - 最终能力检验(模拟真实环境) - 绝对禁止提前接触(数据隔离) - 考后不会讲评(避免信息泄露) | 仅用1次 |
关键区别解析
- 验证集 vs 测试集
-
验证集(模拟考):
- 你可以考很多次(调参时反复使用)
- 老师会分析错题(根据验证结果调整模型)
- 风险:如果只用同一套模拟考,可能针对性"押题"导致虚高成绩(过拟合验证集)
-
测试集(高考):
- 考生只有一次机会(模型评估必须只用一次)
- 完全陌生的题目(模拟真实业务场景)
-
综上所述:
测试集结果才是最终是否符合条件的决定性条件!
拥有一票否决权
- 实际业务场景逻辑
记得原始数据需要清洗哦~
为什么需要验证集?
-
防止"作弊式学习"
- 如果直接用测试集调参(相当于用高考题做模拟题),模型会隐性记住测试集特征
- 例:在测试集上反复尝试不同参数 → 模型间接"见过"测试数据 → 评估结果虚高
-
模型选择的需要
- 比较不同算法(如随机森林 与 XGBoost)时,需要中立裁判来判断,两名考生同时做一份考题(验证集)
- 就像比较两个班级成绩,要用同一套模拟考题而非各自的练习题
-
早停(Early Stopping)依据
- 调参过程中,当验证集误差不再下降时停止训练,避免过度练习(过拟合)
生产环境和生产过程中注意事项
注意:无论生产还是学习中,先划分数据集再进行标准化处理
-
测试集的终极性
- 测试集结果一旦公布,就必须冻结模型
- 如需进一步优化,需收集新数据创建新的测试集
-
验证集的灵活性
- 可采用交叉验证(如5折)充分利用数据:
from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X_train_val, y_train_val, cv=5)
- 相当于组织5次不同模拟考,取平均成绩更可靠
- 可采用交叉验证(如5折)充分利用数据:
-
数据划分比例建议
数据量 训练集 验证集 测试集 小(1万条) 60% 20% 20% 中(10万条) 80% 10% 10% 大(100万+) 96% 2% 2%
常见划分错误案例
- 错误:用测试集结果反向调整模型 → 相当于高考后偷偷改答案
- 错误:验证集和测试集来自不同分布 → 像用北京模拟考预测广东高考
- 错误:划分时未分层抽样 → 模拟考全是简单题,高考全是难题
- 错误:有时间序列时没按照时间序列分割→ 用2023年1-12月数据随机划分,可能让模型在"训练集"中看到12月的模式,然后去"预测"6月的数据
➔ 相当于用未来的知识回答历史问题
实际项目中,建议用sklearn.model_selection.train_test_split
两次实现三划分:
# 第一次划分:分离测试集(高考卷)
X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2)# 第二次划分:分离验证集(模拟考)
X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.25) # 0.25*0.8=0.2
总结
训练集用于模型学习(练习题),验证集用于调参(模拟考),测试集用于最终评估(高考),
三者需严格隔离且测试集必须完全独立。
创作码字不易 ,如果阅读文章后感觉有收获,就点个赞给我点动力吧!