6.6 模型评估:训练集、测试集与交叉验证
📌 一、 课程导入(5 分钟)
情景模拟:考前做模拟卷,到底怎么测才准?
高三学生小明,数学老师给了他一本 “必刷题”题库(共1000道题)。
Scenario A(错误做法): 小明把1000道题全部做了一遍,然后拿这1000道题的原题再考自己一次,得了100分。 👉 老师能说“小明高考能考100分”吗? 👉 不能!因为答案都背下来了,这叫“过拟合”!
Scenario B(正确做法): 老师从1000道题里抽出200道作为“模拟考卷”(测试集),小明只能用剩下的800道题(训练集)来练习。最后用那200道从未见过的新题来测试他。 👉 这个分数才接近高考真实水平!
Scenario C(更稳健的做法——多次模拟考): 只考一次模拟考,万一那天小明感冒了,考砸了怎么办?万一出的题正好都是小明擅长的,考高了怎么办? 对策:把题库分成5份,做5次模拟考,每次用不同的一份当考卷,最后取平均分。这就叫 K折交叉验证。
引出核心结论:评估一个模型好不好,绝对不能拿训练过的数据来测,必须用“没见过的”数据。而且考一次不准,要多考几次取平均!
- 👨🏫 教师活动:展示“小明刷题”的三步PPT,每讲一步问一句:“你们觉得这个做法公平吗?”
- 🧑🎓 学生活动:学生用“作弊”、“可能偏科”等口语化词汇回应,老师顺势引出专业术语:过拟合、测试集、交叉验证。
用高三学生最熟悉的“模拟考”场景,将“训练/测试/交叉验证”三个抽象概念一步打透。职高学生完全能共情,且能立刻理解“多次取平均”的科学性。
📖 二、 解决问题过程(一):训练集与测试集划分——单次模拟考
1. 核心概念(公式化记忆)
将全部数据按比例切分:训练集(用来学) + 测试集(用来考)。
2. sklearn 标准代码(一行搞定)
3. 两个关键参数(职高必记)
| 参数 | 作用 | 典型取值 |
|---|---|---|
test_size |
测试集所占比例 | 0.2(20%)、0.25、0.3 |
random_state |
随机种子(固定划分结果) | 任意整数(42是经典值) |
4. ⚠️ 三大铁律(课堂高亮)
- 测试集绝对不参与训练(
fit只用X_train,y_train)。 random_state必须固定,否则每次运行结果不同,无法复现实验。- 预处理(标准化/归一化)必须先
fit训练集,再transform测试集(已在6.1强调过,此时再次强调)。
- 👨🏫 教师活动:
- 在黑板上画一个矩形代表全部数据,用粉笔画出 80%/20% 的分割线。
- 演示代码,故意把
random_state去掉运行两次,让学生看到划分结果不一样,从而理解“固定种子”的必要性。
- 🧑🎓 学生活动:
- 学生跟着敲代码,观察
train_score和test_score的差异(训练集通常接近 1.0,测试集略低)。 - 学生尝试修改
test_size=0.5,观察数据集大小变化。
- 学生跟着敲代码,观察
train_test_split 是所有建模的第一步,必须让每个学生闭着眼睛都能敲出来。强调“固定随机种子”的工程习惯,这是企业代码规范的一部分。
💻 三、 解决问题过程(二):K折交叉验证——多次模拟考取平均
1. 单次划分的隐患(继续考试比喻)
- 隐患:万一测试集里恰好全是“难题”或“简单题”,这次评估就运气成分太大。
- 解决方案:把数据分成 K 份(比如 5 份),轮流拿其中一份当测试集,其余 K-1 份当训练集,重复 K 次,最后取 K 个分数的平均值。
2. 图解 K=5 折交叉验证
每一轮都得到一个准确率,最后算 平均值 和 标准差。
3. 代码实战(cross_val_score)
4. 交叉验证 vs 单次划分(核心对比)
| 对比维度 | 单次 train_test_split | K折交叉验证 |
|---|---|---|
| 评估次数 | 1 次 | K 次(通常 5 或 10) |
| 稳定性 | 容易受一次运气影响 | 更稳定、更可靠 |
| 计算量 | 小(只训练 1 次) | 大(训练 K 次) |
| 适用场景 | 数据量极大时快速验证 | 数据量中等,追求可靠评估 |
| 职高推荐 | 初学先用这个 | 调参优化时再用 |
- 👨🏫 教师活动:
- 在黑板上画出 5 个方框的轮流示意图,用手依次指“哪份是测试集”。
- 运行
cross_val_score,打印scores数组,让学生看到 5 个不同的分数,然后算平均。
- 🧑🎓 学生活动:
- 学生修改
cv=10(10折),观察分数变成了 10 个,平均分可能更接近真实水平。 - 学生讨论:“如果 5 次分数波动很大(比如 0.5 到 1.0),说明什么?”(答案:说明模型不稳定,或者数据太少了)。
- 学生修改
通过“5份轮流当考卷”的可视化示意图,让K折交叉验证的原理一目了然。学生不需要记复杂的交叉验证类(如KFold),只需掌握 cross_val_score 这个“一键函数”即可。
📖 四、 解决问题过程(三):拓展视野——其他交叉验证策略
以下内容属于**“听说过,有个印象”**级别,不需要全部记住,但需要知道“某些特殊场景不能用普通的 K 折”。
1. 6.4.3 分层交叉验证(Stratified K-Fold)——分类问题专用
- 问题:如果数据中正类只有 10%,负类 90%,随机划分可能导致某一折里全是正类或全是负类。
- 对策:分层交叉验证保证每一折中各类别的比例与原始数据集一致。
- 代码:
cross_val_score(model, X, y, cv=5)在分类问题中默认就是分层的,所以不用额外操心!
2. 6.4.4 分组交叉验证(Group K-Fold)——同一来源不能分开
- 场景:100 张人脸照片来自 10 个人,每人 10 张。如果把同一个人的照片既放训练集又放测试集,模型相当于“认得这个人”再考他,数据泄露了!
- 对策:分组交叉验证确保同一个人的照片不会同时出现在训练集和测试集中。
- 代码:
GroupKFold(n_splits=5)(知道有这个东西就行)。
3. 6.4.5 时间序列交叉验证(TimeSeriesSplit)——时间顺序不能打乱
- 场景:预测股票价格、天气预报、销量预测。未来的数据不能用来预测过去!
- 对策:用时间序列交叉验证,只往前看,不往后看。
- 代码:
TimeSeriesSplit(n_splits=5)(知道有这个东西就行)。
⚠️ 职高学生记住这句话就够了:
“默认的 5 折交叉验证能满足 90% 的场景。如果数据是分类(分层),sklearn 自动帮你做了。如果数据是人脸/用户ID(分组)或者股票日期(时间序列),请告知业务专家,需要特殊处理。”
- 👨🏫 教师活动:用 PPT 快速展示三个特殊场景的配图(同一个人脸出现在训练和测试集、用未来预测过去),用 3 分钟快速过一遍。
- 🧑🎓 学生活动:学生只需在笔记本上写下:“普通场景用 KFold,分类自动分层;分组和时间序列不能乱划分”。
这部分内容对职高学生属于“科普级”。不需要写代码,只需要建立“有的数据不能随便乱分”的风险意识,将来工作中遇到这类数据时知道去查文档,而不是乱用。
✍️ 五、 解决问题过程(四):课堂实战——手动实现一次交叉验证流程
📝 六、 课堂小结(5 分钟)
flowchart LR
root["📊 6.4 模型评估方法论"]
subgraph C1 ["📌 单次划分 train_test_split"]
direction TB
A1["训练集 (80%)"]
A2["测试集 (20%)"]
A3["⚠️ 测试集绝不参与训练!"]
end
subgraph C2 ["🔄 K折交叉验证 cross_val_score"]
direction TB
B1["数据分 K 份"]
B2["轮流当测试集"]
B3["评估结果 = K个分数的平均值"]
end
subgraph C3 ["🔧 特殊变种(拓展)"]
direction TB
C1_node["StratifiedKFold(分类自动分层)"]
C2_node["GroupKFold(同一来源不能拆分)"]
C3_node["TimeSeriesSplit(时间顺序不能乱)"]
end
root --> C1
root --> C2
root --> C3
style root fill:#4b6cb7,stroke:#253b6e,color:#fff
style C1 fill:#e3f2fd,stroke:#2196f3
style C2 fill:#e8f5e9,stroke:#4caf50
style C3 fill:#f3e5f5,stroke:#9c27b0
✏️ 随堂检测与互动练习
📮 七、 课后作业与拓展
📋 八、 板书设计
本课用到的单词
| 单词 | 发音 | 专业英语解释(中文) |
|---|---|---|
| Train-Test Split | /treɪn test splɪt/ | 训练测试集划分。将数据集随机分为训练集和测试集的过程。 |
| Test Size | /test saɪz/ | 测试集比例。分配给测试集的数据占总数据的百分比。 |
| Random State | /ˈrændəm steɪt/ | 随机种子。控制随机过程的整数,固定后可复现结果。 |
| Cross-Validation | /krɔːs ˌvæljuˈeɪʃən/ | 交叉验证。通过多次划分数据并轮流评估来获得稳定模型性能的方法。 |
| K-Fold | /keɪ foʊld/ | K折。将数据分为 K 等份,每次用 1 份作测试集、K-1 份作训练集。 |
| Mean Score | /miːn skɔːr/ | 平均分。K 折交叉验证中 K 次评估分数的算术平均值。 |
| Data Leakage | /ˈdeɪtə ˈliːkɪdʒ/ | 数据泄露。测试集信息在训练过程中被意外引入,导致评估结果虚高的问题。 |