查看全课大纲(第 97 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

过拟合与欠拟合

约 15 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在机器学习模型训练过程中,我们追求的是模型不仅能记住训练数据,更要能理解数据背后的规律,从而对新的、未见过的数据做出准确的预测。然而,模型的能力与数据之间需要精妙的平衡,否则就会出现两种典型问题:模型过于简单而“学不会”,或者模型过于复杂而“死记硬背”。本节我们将深入探讨这两种现象——欠拟合与过拟合,理解其成因、表现及核心的解决思路。

💡 核心导读

  • 过拟合:模型在训练数据上表现极佳,但在新数据上表现糟糕,失去了泛化能力。
  • 欠拟合:模型在训练数据和新数据上表现都不佳,未能捕捉数据的基本规律。
  • 核心成因:过拟合常因模型过于复杂或训练数据过少;欠拟合则因模型过于简单。
  • 解决之道:针对过拟合,可通过收集更多数据、降低模型复杂度(如正则化)来解决。
  • 平衡艺术:机器学习的目标是在模型复杂度与泛化能力之间找到最佳平衡点。

理解过拟合与欠拟合

我们通过一个回归预测的例子来直观理解这两个概念。假设我们有一些样本点(蓝色),它们背后真实的规律是一条平滑的曲线(绿色)。我们的目标是训练一个模型,用一条线(蓝色线)去拟合这些点,并希望这条线能尽可能接近真实的绿色曲线。

# 本节仅为概念讲解,此处用文字描述图示内容,不运行代码。
# 图示展示了三种拟合情况:
# 1. 欠拟合:使用一条简单的直线(degree=1)去拟合,蓝色直线与绿色真实曲线相差甚远。
# 2. 适度拟合:使用一个适度复杂的模型(degree=4),蓝色曲线与绿色曲线基本吻合。
# 3. 过拟合:使用一个非常复杂的模型(degree=15),蓝色曲线蜿蜒曲折,穿过了几乎所有训练样本点,但与绿色真实曲线差异巨大。
[概念图示描述]
左图:欠拟合 (Underfitting)
- 数据点:蓝色散点
- 真实分布:绿色平滑曲线
- 模型拟合:蓝色直线 (degree=1)
- 特点:模型过于简单,无法捕捉数据趋势。

中图:适度拟合 (Just right)
- 数据点:蓝色散点
- 真实分布:绿色平滑曲线
- 模型拟合:蓝色曲线 (degree=4)
- 特点:模型复杂度适中,与真实分布基本一致。

右图:过拟合 (Overfitting)
- 数据点:蓝色散点
- 真实分布:绿色平滑曲线
- 模型拟合:蓝色复杂曲线 (degree=15)
- 特点:模型过于复杂,完美拟合训练点但背离真实趋势。

过拟合就像学生在备考时,只死记硬背了所有练习题的标准答案,却没有理解题目背后的知识点。一旦考试题目稍有变化,他就无法作答。在模型中,这表现为模型对于训练数据拟合程度过当,变得“太适应”训练数据,以至于失去了泛化能力(即举一反三的能力)。结果就是模型在训练集上误差(如均方误差 MSE)非常小,但在测试集或验证集上误差很大。

欠拟合则相反,就像学生连基础练习题都没做明白,知识点完全没掌握。这通常是因为模型过于简单(例如用直线去拟合曲线关系),无法捕捉数据中存在的内在规律或趋势。因此,模型在训练集和测试集上的表现都不好。

过拟合的成因与解决思路

造成过拟合的两个主要原因是:

  1. 训练数据过少:数据量不足以支撑复杂模型学到普遍规律,模型只能记住有限的样本。
  2. 模型过于复杂:模型拥有过多的参数或自由度,使其有能力“记住”训练数据中的噪声和细节,而非一般规律。

相应地,解决过拟合的思路也直指病因:

  1. 收集更多的数据:这是最直接有效的方法,更多的数据有助于模型揭示更稳定的规律。
  2. 降低模型复杂度:这是本节的重点。我们可以选择更简单的模型(如减少多项式次数),或者对于一个已经确定的复杂模型,通过技术手段来约束其复杂度,这个技术就是正则化。

正则化:控制模型复杂度的数学手段

正则化的核心思想是修改我们模型优化的目标。原本,我们只追求最小化模型在训练数据上的误差(称为损失函数)。正则化则是在这个损失函数后面,额外加上一个“惩罚项”,这个惩罚项与模型的复杂度正相关。

新的优化目标 = 训练误差 (Loss) + λ × 模型复杂度惩罚项

其中,λ(或常写作 C 的倒数)是一个正则化系数,它由我们手动指定,用于平衡“拟合训练数据”和“保持模型简单”这两个目标。

  • 如果 λ 很大(或 C 很小),惩罚项权重高,优化时会强烈倾向于选择简单的模型,可能导致欠拟合。
  • 如果 λ 很小(或 C 很大),惩罚项权重低,优化时更关注减小训练误差,可能走向过拟合。

因此,选择合适的正则化系数 λ(或 C)至关重要,它本身是模型的一个超参数,不能从数据中自动学习,需要人工通过诸如交叉验证等方法来调优。

模型复杂度与性能的权衡

下面的示意图揭示了模型复杂度、训练集性能与测试集性能之间的经典关系:

[模型复杂度与性能关系示意图]
横轴:模型复杂度 (Model Complexity) ————————>
纵轴:模型性能/准确率 (Model Performance)

两条曲线:
1. 训练集性能 (Training Score):随着复杂度增加,单调上升,最终趋于高位。
2. 测试集性能 (Test Score):随着复杂度增加先上升后下降,呈倒U型。

区域标注:
- 左侧区域:欠拟合 (Underfitting)。训练集和测试集性能都较低。
- 中间顶点区域:最佳复杂度 (Sweet Spot)。测试集性能达到最高,泛化能力最好。
- 右侧区域:过拟合 (Overfitting)。训练集性能很高,但测试集性能显著下降。

我们的目标就是找到图中测试集性能曲线的顶点,即模型复杂度与泛化能力的最佳平衡点。

# 演示正则化系数的影响(以岭回归Ridge为例,它使用L2正则化)
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.metrics import mean_squared_error

# 构造新的模拟数据(自包含)
np.random.seed(123)
x_demo = np.linspace(0, 1, 10)
y_demo = np.sin(2 * np.pi * x_demo) + np.random.normal(0, 0.1, size=x_demo.shape)

X_train_demo = x_demo.reshape(-1, 1)

# 使用不同正则化强度(alpha,即λ)训练高复杂度模型(这里用14次多项式)
complexity = 14
alphas = [0, 1e-10, 1e-5, 1e-2, 1]

print(f"多项式次数: {complexity}")
print("不同正则化强度(alpha)下的训练集均方误差(MSE):")
for alpha in alphas:
    model = make_pipeline(PolynomialFeatures(complexity), Ridge(alpha=alpha))
    model.fit(X_train_demo, y_demo)
    y_pred = model.predict(X_train_demo)
    mse = mean_squared_error(y_demo, y_pred)
    # 格式化输出,便于观察趋势
    print(f"  alpha={alpha:<8} -> MSE = {mse:.6f}")
多项式次数: 14
不同正则化强度(alpha)下的训练集均方误差(MSE):
  alpha=0        -> MSE = 0.000000
  alpha=1e-10    -> MSE = 0.000216
  alpha=1e-05    -> MSE = 0.007508
  alpha=0.01     -> MSE = 0.080839
  alpha=1        -> MSE = 0.246216

从输出可以看到,当正则化强度 alpha(即 λ)为 0 时,模型没有任何复杂度约束,其训练误差(MSE)几乎为 0,这是典型的过拟合迹象。随着 alpha 增大,对模型复杂度的惩罚变强,训练误差也随之上升,这意味着模型被约束得更加“平滑”和简单。在实际中,我们需要在独立的验证集上测试,以选择一个能使验证集误差最小的 alpha 值。

📝 动手练一练

  1. 概念辨析:假设你训练了一个图像分类模型,它在训练集上准确率达到99.8%,但在测试集上只有65%。这最可能是什么问题?你可以从哪两个主要方向尝试解决?
👉 点击查看参考答案

问题诊断:这极有可能是过拟合问题。模型过度记忆了训练集的特有特征(如背景、拍摄角度等),而未能学会识别物体本身的通用特征。

解决方向:

  1. 获取更多数据:收集更多样化、更具代表性的训练图像。
  2. 降低模型复杂度/引入正则化:
    • 使用更简单的网络架构(减少层数或神经元数)。
    • 在模型中添加Dropout层、L1/L2权重正则化。
    • 进行数据增强(如旋转、裁剪、改变亮度),这相当于隐式地增加了数据多样性并引入了不变性先验,也是一种正则化手段。
  1. 代码思考:在上一节的K近邻(KNN)模型中,参数 n_neighbors(即k)的大小如何影响模型的复杂度?k值很大或很小,分别可能对应欠拟合还是过拟合?
👉 点击查看参考答案

在KNN中,n_neighbors(k)控制着模型的复杂度:

  • k值很小(如k=1):模型非常复杂。因为预测时只参考最近的1个邻居,对训练数据的局部噪声非常敏感,决策边界会变得极其曲折,容易导致过拟合。
  • k值很大:模型变得简单。预测时参考大量邻居的投票,决策边界平滑,但可能过于平滑以至于无法捕捉数据的细节结构,容易导致欠拟合。

因此,k值的选择也是在模型复杂度(拟合能力)与泛化能力之间寻求平衡。

本章小结

本节我们深入探讨了机器学习模型开发中的两个关键挑战:欠拟合与过拟合。理解它们的本质、识别它们的表现,是构建有效模型的基础。正则化作为对抗过拟合的强大工具,其思想是通过在优化目标中引入对模型复杂度的惩罚,来引导模型走向更好的泛化性能。

📋 行动清单

  • 建立诊断意识:在评估自己训练的模型时,不仅要看训练集指标,一定要关注验证集/测试集的表现,警惕两者差距过大的情况。
  • 理解正则化:认识到正则化系数(如λ、C、alpha)是一个需要精心调节的超参数,它的选择直接影响模型的最终效果。
  • 思考参数影响:对于学过的模型(如线性回归、KNN),主动思考其关键参数(如多项式次数、k值)如何影响模型复杂度,并与过拟合/欠拟合的概念联系起来。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:过拟合与欠拟合
    PDF · 365KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载