title: “人工智能实战(二):欠拟合/过拟合与混淆矩阵”
tags: [“Python”, “机器学习”, “过拟合”, “混淆矩阵”, “模型评估”]
categories: [“人工智能”]
description: “用多项式回归直观演示欠拟合与过拟合,并借助混淆矩阵、精确率、召回率、F1 全面评估一个二分类模型。”

人工智能实战(二):欠拟合/过拟合与混淆矩阵

「人工智能」阶段第二篇。理解欠拟合/过拟合是调参的起点,看懂混淆矩阵是评估分类模型的基石。本文两个主题都用真实运行输出演示。

一、背景与目标

  • 用多项式回归直观展示:模型复杂度太低 → 欠拟合,太高 → 过拟合;
  • 用混淆矩阵 + 分类报告评估一个不平衡二分类模型,理解准确率之外还需要看精确率、召回率、F1。

配套脚本 s8_02_overfit_confusion.py。

二、欠拟合 / 过拟合

用 20 个带噪声的正弦采样点,分别拟合 degree=1、4、15 的多项式:

X = np.sort(rng.uniform(0, 1, 20))[:, None]
y = np.sin(2 * np.pi * X[:, 0]) + rng.normal(0, 0.25, 20)
for d in [1, 4, 15]:
    model = make_pipeline(PolynomialFeatures(d), LinearRegression()).fit(X, y)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • degree=1:一条直线,明显欠拟合(训练误差高,模型太简单学不到正弦的起伏);
  • degree=4:适中,较好地贴合了数据趋势;
  • degree=15:剧烈震荡地穿过每个点,过拟合(记住了噪声,泛化差)。

用训练集/验证集 R² 定量看这个差异:

degree | train R2 | valid R2
    1   | 0.783   | -1.065
    2   | 0.797   | -1.572
    4   | 0.848   | -1.050
    8   | 0.890   | -0.186
   15   | 0.906   | -1455.721

关键看点:degree=15 训练集 R² 高达 0.906,但验证集 R² 暴跌到 -1455(比"直接预测均值"还差无数倍)——典型的过拟合。样本只有 15 条训练数据,模型复杂度却极高,自然把噪声当规律。训练集表现越来越好、验证集先好后崩,正是过拟合的信号。

三、混淆矩阵与分类评估

构造一个不平衡的二分类问题(正类占比约 28%,且 flip_y=0.06 注入 6% 标签噪声),训练逻辑回归:

Xc, yc = make_classification(n_samples=800, n_features=8, n_informative=6,
                             weights=[0.72, 0.28], flip_y=0.06, random_state=5)
clf = LogisticRegression(max_iter=500).fit(Xtr, ytr)
[逻辑回归] 测试准确率 = 0.8125
混淆矩阵:
[[157  19]
 [ 26  38]]
  真负例(TN)=157 假正例(FP)=19
  假负例(FN)=26 真正例(TP)=38

分类报告:

               precision    recall  f1-score   support
          负类       0.86      0.89      0.87       176
          正类       0.67      0.59      0.63        64
    accuracy                           0.81       240

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解读:

  • 整体准确率 0.81 看似不错,但正类的召回率只有 0.59——41% 的正类被漏判。在不平衡场景只看 accuracy 会掩盖问题。
  • 精确率(Precision):预测为正的样本里真正为正的比例(0.67);
  • 召回率(Recall):真实为正的样本里被找出来的比例(0.59);
  • F1:两者的调和平均(0.63)。

若业务上"漏掉正类代价高"(如欺诈检测、疾病筛查),应优先优化召回率;若"误判为正代价高"(如垃圾邮件误拦),则应优先精确率。

四、常见坑

  1. 只用准确率评估不平衡数据:会得到"虚高"结果,务必看混淆矩阵/分类报告。
  2. 混淆矩阵看错轴:默认 confusion_matrix 行是真实、列是预测(真实=行, 预测=列),读之前先确认方向。
  3. 过拟合检测:必须留独立验证集,不能只看训练集分数;必要时用交叉验证。

五、小结

本篇讲透了两个核心概念:过拟合的本质是"模型复杂度过高而记住了噪声",混淆矩阵让你在不平衡数据上看得更全面。下一篇进入深度学习,用 PyTorch 写一个真正的神经网络。

配套代码:code/s8_02_overfit_confusion.py;配图:assets/

更多推荐