人工智能实战(二):欠拟合/过拟合与混淆矩阵
·
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)。
若业务上"漏掉正类代价高"(如欺诈检测、疾病筛查),应优先优化召回率;若"误判为正代价高"(如垃圾邮件误拦),则应优先精确率。
四、常见坑
- 只用准确率评估不平衡数据:会得到"虚高"结果,务必看混淆矩阵/分类报告。
- 混淆矩阵看错轴:默认
confusion_matrix行是真实、列是预测(真实=行, 预测=列),读之前先确认方向。 - 过拟合检测:必须留独立验证集,不能只看训练集分数;必要时用交叉验证。
五、小结
本篇讲透了两个核心概念:过拟合的本质是"模型复杂度过高而记住了噪声",混淆矩阵让你在不平衡数据上看得更全面。下一篇进入深度学习,用 PyTorch 写一个真正的神经网络。
配套代码:code/s8_02_overfit_confusion.py;配图:assets/
更多推荐

所有评论(0)