单元五

第18课 过拟合与欠拟合

任务场景:练习册满分,期末卷却糟糕——可能背题了
任务场景:练习册满分,期末卷却糟糕——可能背题了
原理图:过拟合 vs 欠拟合(训练/测试对照)
原理图:过拟合 vs 欠拟合(训练/测试对照)

一、任务目标

对比深浅决策树(或近邻)的训练/测试正确率。

二、核心概念讲清楚

过拟合:训练很好、测试很差。欠拟合:训练测试都差。通过简化模型、加数据、正则/限深度等缓解。

  • 看训练分与测试分差距
  • 树太深、k 过小可能过拟合
  • 模型太简单可能欠拟合
1记录两套分数train vs test
2判断现象过拟合/欠拟合/正常
3调整复杂度深度、k、特征数
4再评估看差距是否缩小

三、跟着想一遍(小例子)

训练准确率 1.0、测试 0.6,高度怀疑过拟合。

易错:只优化训练集分数。

正确:以测试集(或验证集)为准做选择。

想一想:增加训练数据通常更有助于缓解过拟合还是欠拟合?

提示:通常更有助于缓解过拟合(模型更难把噪声全背下来);欠拟合更常靠换更合适的模型或特征。

四、解题思路

任务:对比深浅决策树(或近邻)的训练/测试正确率。 先想清楚:输入是什么、处理后得到什么、屏幕上应出现什么。

本课主要用到:屏幕输出。

  1. 1明确任务「对比深浅决策树(或近邻)的训练/测试正确率。」:运行后你希望看到什么结果(文字、图形或计算结果)。
  2. 2用 print 把结果说出来,确认屏幕上出现预期内容。
  3. 3对照参考代码跑通后,只改一个参数,观察结果如何变化。

流程示意(可对照左侧文字)

任务:对比深浅决策树…用print把结果说出来,…对照参考代码跑通后,只改一…

五、语句功能讲解

本课用到的 Mixly 图形块均已在前面的课讲过。请直接对照编程练习搭积木;若有遗忘,回到该积木首次出现的课页复习。

六、知识点讲解

过拟合是模型把训练集记得太死,换新数据就差。要用没见过的数据检查;好模型是「会举一反三」,不是「只会背题」。

先弄清本课输入与输出,再进编程练习对照现象。

七、编程练习

先理解上面的例子,再在下方 Mixly 运行与检查(含 scikit-learn)。

对比四行正确率。

参考代码(对照抄写到下方 Mixly)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=0
)

# 很深的树:容易「背题」
deep = DecisionTreeClassifier(max_depth=None, random_state=0)
deep.fit(X_train, y_train)
print("深树 训练:", round(accuracy_score(y_train, deep.predict(X_train)), 3))
print("深树 测试:", round(accuracy_score(y_test, deep.predict(X_test)), 3))

# 很浅的树:可能学不够
shallow = DecisionTreeClassifier(max_depth=1, random_state=0)
shallow.fit(X_train, y_train)
print("浅树 训练:", round(accuracy_score(y_train, shallow.predict(X_train)), 3))
print("浅树 测试:", round(accuracy_score(y_test, shallow.predict(X_test)), 3))

八、课堂练习

先完成两道正误判断,再做其余题目;选出后点「检查」。

  1. 判断:只抄参考代码,不看运行输出,也不改参数验证。

  2. 判断:先跑通,再对照「过拟合」改一处输入/参数,确认输出按预期变化;答错小测时读讲解。

  3. 训练≈1.0、测试明显更低,更像?

  4. 训练和测试都明显偏低,更像?

九、本节小结

训练/测试一起看,才能发现过拟合与欠拟合。