上一节我们搞懂了 “误差” 的核心概念:泛化误差才是衡量模型好不好用的关键。但问题来了 —— 我们没有 “未来的新数据”,怎么才能准确估计泛化误差?这就需要 “评估方法” 来帮忙。本文严格围绕参考文档的教学目标和内容,从 “为什么要划分数据集” 讲起,一步步拆解留出法、交叉验证法、自助法这三种核心评估方法,每个知识点都配文档里的实例和生活化解释,确保刚入门的同学能看懂、会用。
一、先搞懂核心前提:为什么训练集和测试集必须互斥?
在学具体评估方法前,我们得先解决一个基础问题:为什么要把数据集分成 “训练集(S)” 和 “测试集(T)”,而且必须互斥(没有重叠样本)?
假设老师出了 10 道习题让学生练习(相当于训练集),考试时却还用这 10 道题当试题(相当于用训练集当测试集)—— 哪怕学生考了 100 分,能说明他真的学会了吗?不一定!他可能只是死记硬背了习题答案,换一道新题就不会了。
这个例子对应到机器学习里就是:
- 如果用训练集当测试集,模型的 “测试误差” 会非常小(甚至为 0),但这是 “作弊” 的结果 —— 模型只是 “记住” 了训练数据的规律,没学会 “泛化” 到新数据;
- 只有让训练集和测试集互斥(测试集里的样本从未参与过模型训练),测试集上的误差才能近似反映 “泛化误差”,才能判断模型的 “真本事”。
核心结论:训练集和测试集互斥,是为了避免 “用训练数据检验模型” 导致的 “泛化误差估计不准”,这是所有评估方法的前提。
二、方法一:留出法(Hold-Out)—— 最简单的 “分一分,测一测”
留出法是最直观的评估方法,核心思路就是 “把数据集直接分成两堆:一堆训练,一堆测试”。文档里给了具体实例,我们结合实例一步步拆解。
2.1 留出法的基本步骤(文档实例 + 详解)

假设数据集 D 包含 1000 个样本,用留出法评估模型。
- 划分数据集:按 “7:3” 的比例把 D 分成训练集 S(700 个样本)和测试集 T(300 个样本)—— 注意!这里必须满足 “训练集和测试集互斥”,300 个测试样本绝不能出现在 700 个训练样本里;
- 训练模型:用训练集 S 训练模型(比如 “挑西瓜模型”,学习色泽、根蒂等特征与 “好瓜” 的关系);
- 计算测试误差:用训练好的模型预测测试集 T 里的 300 个样本,假设其中 90 个预测错误,按文档里的公式计算:
- 估计泛化误差:把测试集 T 上的错误率(30%)近似看作模型的 “泛化误差”。
2.2 留出法的关键注意点(入门必避坑)
文档里重点强调了两个细节,这也是初学者最容易出错的地方:
(1)必须用 “分层抽样”,保证数据分布一致
什么是 “分层抽样”?简单说就是:训练集和测试集里的 “类别比例” 要和原数据集 D 完全一致。 比如原数据集 D 里 “好瓜” 占 60%(600 个)、“坏瓜” 占 40%(400 个),那么:
- 训练集 S(700 个)里,好瓜要占 60%(420 个),坏瓜占 40%(280 个);
- 测试集 T(300 个)里,好瓜要占 60%(180 个),坏瓜占 40%(120 个)。
为什么必须这样? 举个反例:如果随机划分时,测试集 T 里全是 “坏瓜”(300 个坏瓜),而模型在训练集 S 里只学过 “好瓜”—— 这时模型在 T 上的错误率会是 100%,完全不能反映真实泛化误差,这就是 “数据分布失衡” 导致的评估失效。
(2)多次划分取平均值,减少随机性
单次留出法的结果会受 “划分方式” 影响 —— 比如第一次划分时,测试集里全是 “简单样本”(模型容易判断对),错误率只有 20%;第二次划分时,测试集里全是 “复杂样本”,错误率升到 40%。这两个结果差异太大,哪个才可信?
给出的解决方案是:多次随机划分,取多次测试误差的平均值。比如进行 100 次随机划分(每次都用分层抽样),得到 100 个错误率(20%、25%、30%...),最后取这 100 个值的平均值(比如 28%)作为泛化误差的估计值 —— 这样能大幅减少 “单次划分随机性” 带来的误差。
2.3 留出法的优缺点(入门必知)
优点 | 缺点 |
---|---|
实现简单,计算成本低(只训练 1 次模型) | 数据利用率低(测试集不参与训练,若数据量小,训练集会更小) |
直观易懂,适合快速验证模型 | 结果受划分方式影响大,必须多次划分取平均才能稳定 |
三、方法二:交叉验证法(Cross-Validation)—— 更准确的 “多轮测试”
留出法的问题是 “数据利用率低” 和 “随机性大”,尤其是当数据集较小时(比如只有 100 个样本)—— 如果按 7:3 划分,训练集只有 70 个样本,模型学不到足够规律;测试集只有 30 个样本,误差估计不稳定。这时就需要 “交叉验证法” 登场,它是工业界最常用的评估方法之一,文档里用大篇幅讲解了这种方法。
3.1 交叉验证法的核心思路
交叉验证法的核心是 “把数据集分成 k 个大小相似的互斥子集(称为‘折’,Fold),每轮用 k-1 个折当训练集,1 个折当测试集,总共做 k 轮测试,最后取 k 轮测试误差的平均值作为泛化误差”—— 这种方法也叫 “k 折交叉验证(k-Fold CV)”。
Di(1)大小相似
3.2 10 折交叉验证的具体步骤(示意图 + 详解)
假设数据集 D 包含 1000 个样本,用 10 折交叉验证评估模型:
- 划分 k 折(分层抽样):把 D 分成 10 个 “折”(D1~D10),每个折有 100 个样本 —— 必须保证每个折的 “好瓜 / 坏瓜比例” 和原数据集一致(分层抽样),比如每个折里有 60 个好瓜、40 个坏瓜;
- 第 1 轮测试:用 D2~D10(共 9 个折,900 个样本)当训练集,D1(100 个样本)当测试集,训练模型后计算测试误差 E1;
- 第 2 轮测试:用 D1、D3~D10(900 个样本)当训练集,D2(100 个样本)当测试集,计算测试误差 E2;
- 重复轮次:总共做 10 轮测试,得到 10 个误差值(E1、E2、...、E10);
“10 折交叉验证示意图” 本质就是这个过程:每轮换一个折当测试集,确保每个样本都当过 “测试样本”,数据利用率大幅提升。
3.3 进阶:P 次 k 折交叉验证(文档实例)
如果数据集特别小,或者想让误差估计更稳定,以 “P 次 k 折交叉验证”为例—— 比如 “10 次 10 折交叉验证”。
它的逻辑是:
“10 次 10 折交叉验证共测试 100 次”—— 就是 10 次 ×10 轮 = 100 次测试,这样的结果几乎能完全消除 “划分方式随机性” 的影响,是科研和工业界对精度要求高时的首选。
3.4 交叉验证法的关键注意点
- 折的大小要相似:比如 10 折交叉验证,每个折的样本数要尽量接近(1000 个样本分 10 折,每折 100 个,不能有的折 50 个、有的折 150 个),否则训练集大小波动太大,影响模型训练效果;
- 必须分层抽样:和留出法一样,每个折的类别比例要和原数据集一致,避免某一折全是 “好瓜” 或全是 “坏瓜”;
- k 值的选择:文档里没指定 k 值,但行业通用标准是:
- 最常用 k=10:兼顾 “误差估计稳定性” 和 “计算成本”(10 轮训练,不算太多);
- 小数据集用 k=5 或 k=2:减少训练轮次(避免计算量太大);
- 极小数据集用 “留一法(LOO)”:k = 样本数 m,每次只留 1 个样本当测试集,比如 m=50,就做 50 轮测试 —— 误差估计最准确,但计算成本极高(训练 50 次模型)。
3.5 交叉验证法的优缺点
优点 | 缺点 |
---|---|
数据利用率高(每个样本都参与训练和测试) | 计算成本高(k 折要训练 k 次模型,P 次 k 折要训练 P×k 次) |
误差估计稳定(多轮平均,减少随机性) | 实现比留出法复杂,需要处理多轮训练和结果汇总 |
四、方法三:自助法(Bootstrap)—— 小样本的 “救星”
自助法是专门针对 “小样本数据集” 的评估方法,核心思路是 “有放回抽样”,我们简单讲清楚它的逻辑和适用场景。
4.1 自助法的基本步骤
假设数据集 D 有 m 个样本,自助法的步骤是:
- 有放回抽样生成训练集:从 D 中 “有放回地” 抽 m 个样本,组成训练集 S(比如 m=100,就抽 100 次,每次抽完放回,同一个样本可能被抽多次);
- 确定测试集:把 D 中 “没被抽到过的样本” 组成测试集 T—— 根据概率论计算,当 m 足够大时,T 大约包含 36.8% 的原样本(因为每个样本被抽到的概率是 1-(1-1/m)^m,当 m→∞时,这个值趋近于 1-1/e≈63.2%,所以没被抽到的概率是 36.8%);
- 训练和测试:用 S 训练模型,用 T 测试模型,得到测试误差,作为泛化误差的估计。
4.2 自助法的适用场景和优缺点
适用场景 | 优点 | 缺点 |
---|---|---|
小样本数据集(比如 m<100) | 数据利用率极高(几乎所有样本都参与训练) | 改变了原数据的分布(有放回抽样导致样本重复),可能影响误差估计准确性 |
无法划分训练集 / 测试集时 | 不需要手动划分,自动生成训练集和测试集 | 大样本数据集不适用(计算成本高,且 36.8% 的测试集太大) |
五、三种评估方法的对比与选择(入门者指南)
学完三种方法,初学者最容易问:“我该选哪种方法?” 这里用表格总结它们的核心差异,帮你快速决策:
评估方法 | 核心逻辑 | 适用场景 | 计算成本 | 误差估计稳定性 |
---|---|---|---|---|
留出法 | 分 2 堆,1 堆训 1 堆测 | 大样本、快速验证模型 | 低 | 低(需多次划分) |
交叉验证法(k 折) | 分 k 堆,k 轮训测取平均 | 中样本、精度要求高(工业界首选) | 中(k 次训练) | 高 |
自助法 | 有放回抽样,生成训测集 | 小样本、数据极稀缺 | 中 | 中(改变数据分布) |
选择建议:
- 如果你有 10 万 + 样本(大样本):用留出法(7:3 划分,多次取平均)—— 计算快,误差估计足够准;
- 如果你有 1 千~10 万样本(中样本):用 10 折交叉验证 —— 平衡精度和成本;
- 如果你只有 1 百以下样本(小样本):用自助法或留一法 —— 尽量利用每一个样本;
- 如果你做科研或对精度要求极高:用 10 次 10 折交叉验证 —— 结果最可靠。
六、总结:评估方法的 “核心逻辑链”
看到这里,你已经掌握了所有核心评估方法,我们用一条逻辑链串起来,帮你形成体系:
- 为什么要学评估方法? → 为了准确估计 “泛化误差”,判断模型的真实能力;
- 评估的前提是什么? → 训练集和测试集必须互斥,避免 “作弊”;
- 有哪些方法可选? → 留出法(简单快)、交叉验证法(准)、自助法(小样本);
- 怎么选方法? → 看数据量:大样本用留出法,中样本用交叉验证,小样本用自助法。
对于刚入门的同学,不用一开始就掌握所有方法的代码实现,但一定要记住:评估方法是模型 “上线前的最后一道检验”—— 哪怕模型在训练集上表现再好,只要评估方法不当,泛化误差估计不准,上线后也会出问题(比如推荐系统推不准、诊断模型判错病)。
下一节我们会讲 “如何用检验方法比较两个模型的好坏”(文档里的二项检验、t 检验),帮你判断 “模型 A 和模型 B 到底哪个更优”。如果这篇文章里有哪个步骤没看懂,欢迎在评论区留言,我们一起拆解!