蜥蜴书第三版源码实战:从环境搭建到跑通机器学项目
2026/9/8 10:43:09 网站建设 项目流程

简介:这是一份与《机器学习实战》(蜥蜴书第三版)配套的实战源码和学习笔记,适合已有Python编程基础、希望以项目实操方式掌握机器学习核心流程的读者。压缩包共108个文件,约60.29MB,核心是28个Jupyter Notebook(.ipynb)笔记,辅以16个readme说明、14个sample数据样例、yml环境配置、png示意图等,内容覆盖数据处理、特征选择、模型构建与评估完整链路,并延伸至监督学习、无监督学习、深度学习与强化学习等算法专题。读者可以在Notebook中实时修改和运行代码,对照书中案例拆解每一步的实现逻辑;资源中附带的依赖配置文件、Dockerfile等,还可帮助快速复现一致的运行环境,减少环境搭建障碍。目前已有277人学习下载,无论是系统学习、备赛还是搭建个人机器学习项目,都可作为实用参考。需注意相关库版本迭代较快,部分代码需按当前环境微调后运行。 搞机器学习的,很少有人没听过“蜥蜴书”的大名。Aurélien Géron 那本《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》,因为封面上那只标志性的蜥蜴,被国内学习者亲切地叫作“蜥蜴书”。第三版更新了不少内容,而《机器学习实战(蜥蜴书第三版实战源码).zip》这个压缩包,几乎是每个想上手实战的人都会先下载的资料。但一个残酷的现实是:很多人解压之后只是看了几眼,然后就关掉了。源码不是这样用的。

这篇文章我会以一个刷完第三版源码、并且带过几个新手的身份,聊聊拿到这份 zip 之后该怎么折腾。内容包括目录结构、环境搭建、第一个 Notebook 的正确打开方式,还有我实测中踩过的三个坑。如果你刚下载完还没动过,或者曾经跑起来又中途卡住,这篇应该能帮你省下不少时间。

1. 拿到源码包先别急着双击:这份zip里的目录信息量很大

很多人的习惯是解压之后直奔notebooks文件夹,然后随便点开一个.ipynb文件,看到满屏代码瞬间压力山大,然后默默关掉。我建议你把节奏放慢一点,先整体看一遍目录。源码包的布局其实就是作者设计的学习路线图,理解了这个结构,你才知道该从哪下手。

以第三版为例,解压后你会看到下面这些核心内容:

目录 / 文件作用
notebooks/全书每一章的 Jupyter Notebook 源码,按章节编号命名
datasets/各章用到的数据集,有的需要联网下载,有的本地直接提供
requirements.txt官方锁定的 Python 依赖包版本清单
Dockerfile如果你不想污染本地环境,可以用 Docker 一键起一个可复现环境
README.md项目说明,包含环境安装指引和常见问题

第三版相对第二版的变化很大,最明显的是新增了 Transformer、自监督学习和扩散模型相关的章节,同时把 TensorFlow 部分升级到了 Keras 2.x 的风格。如果你之前看过第二版,再切到第三版时不要觉得代码“变陌生了”,这不是错觉,是作者刻意跟着生态在走。

1.1 从一张目录图看清全书的代码主线

notebooks文件夹里的编号对应书里的章节,比如:

  • 01_the_machine_learning_landscape.ipynb:机器学习全景概述,代码很少,基本都是概念演示。
  • 02_end_to_end_machine_learning_project.ipynb:第一个完整的端到端项目——加州房价预测,这本书的精华章节之一。
  • 03_classification.ipynb:MNIST 手写数字分类,用 Scikit-Learn 的经典套路。
  • 10_neural_nets_with_keras.ipynb:Keras 搭建神经网络,从这里开始进入深度学习的主题。
  • 19_transformer_architectures.ipynb:Transformer 架构,第三版增补的重点内容。

看到这个顺序你就明白了:前几章是 Scikit-Learn 主导的传统机器学习,中间开始切入神经网络,最后是 Transformer 这类现代架构。它是一个从“基础”到“前沿”的递进过程,不是零散的代码片段集合。

1.2 为什么Jupyter Notebook是这本书的真正讲义

第二版之后,作者的源码就全面转向了 Jupyter Notebook,而不是纯.py文件。我第一次刷的时候也不理解:为什么不用脚本?直接python train.py跑完不好吗?后来才想明白,这恰恰是这本书最聪明的地方。

机器学习项目本身就是高度迭代的过程。你需要先加载数据,看一眼数据分布,决定要不要做特征工程,然后训练一个基线模型,再看结果,再调参。每一步都可能产生新的判断,这种探索式的流程用 Notebook 来表达是最自然的。Notebook 里每个 cell 都能独立运行,你可以边读边跑,看到中间变量长什么样,甚至临时插入一个 cell 去验证自己的想法。这种“动手式阅读”体验,是纯脚本给不了的。

2. 跑通环境是第一个大坑:依赖版本和虚拟环境决定成败

如果你只是打开源码看了一眼就关掉,那多半是卡在了环境搭建这一步。第三版的依赖比早期版本复杂不少,TensorFlowScikit-LearnPandasJupyter这一套下来,版本稍微不对就会报错。很多网上提问:“为什么我运行第一章的代码就报ImportError?” 十有八九都是环境问题。

所以我的建议是:先建虚拟环境,再逐步安装依赖。别在系统 Python 里直接 pip install,那是在给自己埋雷。

2.1 用conda把Python环境和项目隔离

最省事的方式是用 Anaconda 或 Miniconda 创建一个独立的环境。理由很简单:这本书的依赖版本是锁定的,而你可能还有别的项目需要用其他版本,用虚拟环境隔离,互不干扰。

# 创建环境,指定 Python 版本。第三版建议 Python 3.8~3.10,经实测 3.9 最稳 conda create -n hml python=3.9 # 激活环境 conda activate hml # 进入解压后的源码目录,安装官方依赖清单 pip install -r requirements.txt # 安装 Jupyter,并把内核注册到当前环境 pip install jupyter python -m ipykernel install --user --name hml --display-name "Python (hml)"

到这里,环境基本就绪。注意不要用conda install直接装requirements.txt里的包,容易把依赖依赖关系搞乱。我习惯用pip install -r requirements.txt,让 pip 按官方锁定版本解析。

2.2 requirements.txt里的版本号,千万不要轻易改动

有一种情况很常见:你新建环境后,发现requirements.txt里的某个版本有点旧,比如scikit-learn==1.1.2,你想着“升级到最新版应该没问题吧”,然后自信地改成了latest。结果就是后续代码到处爆错。

这里必须说清楚为什么版本不能乱动。书里大量代码是依据特定 API 写的,比如sklearn.preprocessing.OneHotEncoder在旧版里有sparse参数,新版变成了sparse_outputsklearn.metrics.plot_roc_curve在新版本中被移除。如果你升级了版本,源码可能直接跑不通,你不仅要改代码,还要理解新旧 API 的差异,这对新手来说成本太高。

用第三版源码时,我实测比较稳的组合是:Python 3.9 + Scikit-Learn 1.1.x + TensorFlow 2.11 + Pandas 1.5.x。你可以直接用官方给的requirements.txt,别动版本号,先把代码跑通,再去研究新特性。

3. 我建议的跑源码顺序:先从第1章的端到端项目开始

环境配好之后,下一步不是从第一章第一个 Notebook 开始“按顺序”读,而是先去跑第 2 章的02_end_to_end_machine_learning_project.ipynb。因为第 1 章基本是概念性的,代码很少,看完概念直接上手项目,效率更高。

启动 Notebook 后,我用的是 Jupyter 的“逐单元格运行”策略:从上到下,一个 cell 一个 cell 地执行。不要整份Run All,第一个原因是你需要观察每个中间结果;第二个原因是如果后面某个 cell 报错,你不至于完全不知道问题出在哪。

3.1 第2章其实是一个完整的机器学习应用流程

第 2 章的加州房价项目可以说把整个“机器学习应用流程”压缩进了一个 Notebook:加载数据、数据探索、切分训练集测试集、特征工程、模型训练、交叉验证、误差分析、模型微调、最终评估。很多人学完这一章,才对“项目流程”有了骨架感。

比如加载数据那段,源码里是这样写的:

import pandas as pd housing = pd.read_csv("datasets/housing/housing.csv") housing.head()

这段看起来简单,但背后隐藏了一个容易忽略的点:数据文件路径。如果你直接用源码里的相对路径,必须在源码根目录下启动 Jupyter,否则会找不到datasets文件夹。这算是我见过的最常见的“新手问题”之一。

跑完这一章,你基本就明白了:一份合格的项目代码,不是只有模型训练那几行,数据清洗和特征工程往往占了七八成的工作量。

3.2 从第2章之后,源码笔记本里的“代码密度”会明显增加

第 2 章后面,第 3 章的 MNIST 分类、第 4 章的线性模型训练、第 6 章决策树,代码量会逐步上升,但依然保持在“看一遍能懂”的范围内。真正会让普通人感觉吃力的,是从第 10 章 Keras 神经网络开始。这个时候代码里会出现大量模型定义、编译、训练的过程,如果没有前面的基础,很容易看着看着就断了。

我的建议是在第 2 章之后,按顺序将第 3、4、6 章的重点部分跑通,先建立对 Scikit-Learn 的肌肉记忆。到第 10 章时再次深呼吸,开始接触tf.keras.Sequential这类高层 API。别跳着学,因为它们之间是有依赖关系的。

4. 实测中遇到的三个真实问题:API变动、数据集下载失败和内存不足

这一部分想集中分享我在跑源码时踩过的三个坑。如果你卡住了,大概率也是这三类问题。

4.1 报错cannot import name 'plot_roc_curve':一次典型的sklearn版本迁移

我在某一次帮朋友排查环境时,看到他运行第 3 章或第 9 章里的代码,报错是这样的:

ImportError: cannot import name 'plot_roc_curve' from 'sklearn.metrics'

这个报错很典型。plot_roc_curve是 Scikit-Learn 1.0 之前提供的函数,后来官方建议改用RocCurveDisplay这种基于“展示器”的 API。如果你的requirements.txt里锁定的版本不是特别老,那就可能出现这个问题。

排查链路是这样:先看sklearn.__version__,确认版本;然后再去官方文档确认这个版本的metrics模块里是否还有plot_roc_curve。如果版本比较旧,可以直接安装指定版本让代码原样运行;如果不想降级,就把代码改成新的 API:

from sklearn.metrics import RocCurveDisplay disp = RocCurveDisplay.from_estimator(svm_clf, X_test, y_test) disp.plot()

遇到类似ImportError,我的经验是先不要硬搜“如何解决”,而是确认当前环境版本,然后对照官方文档中的 deprecated 说明。这本书的源码并不是百分之百适配所有环境版本,所以学着看“迁移文档”也是一个重要技能。

4.2 数据集下载卡在“Downloading”的本地化处理

很多 Notebook 里会有类似这样的代码:

from pathlib import Path import urllib.request DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml3/main/" housing_url = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"

当网络不好的时候,这个 cell 会一直卡着,或者下载到一半失败。遇到这种情况,我建议你直接手动把datasets目录从源码包里解压出来,放到当前项目根目录下。然后在代码里跳过下载步骤,直接从本地读。

比如把加载数据的部分改为:

housing = pd.read_csv("datasets/housing/housing.csv")

这是最省事的方案。如果网上有人分享了你需要的.tgz文件,也可以下载后手动放到对应位置,再从本地解压。核心思路就是:不要让源码的网络请求卡死你的学习进度。

4.3 跑深度模型时内存或显存不足

到后面几章,尤其是 Keras 那几节,问题不再是版本,而是硬件资源。你可能会看到类似ResourceExhaustedError: OOM when allocating tensor这样的报错。这意思是显存或者内存不够了,模型和数据都塞不进去。

我的处理办法分几步:先看是不是数据集太大,可以只加载前几百条样本测试流程;再看是不是模型层数太多,暂时把隐藏层神经元数量减半;最后再考虑减少 batch size。这些改动不会影响你对代码逻辑的理解,只是让代码在合理时间内跑完。

model = tf.keras.Sequential([ tf.keras.layers.Dense(30, activation="relu"), tf.keras.layers.Dense(10) ]) model.compile(loss="mse", optimizer="sgd") history = model.fit(X_train_scaled, y_train, epochs=20, batch_size=32)

batch_size从 64 改成 32,有时候问题就解决了。如果完全跑不动,也可以把对应 Notebook 上传到在线代码平台,用免费的 GPU 环境继续跑。总之不要因为硬件限制就放弃后面的内容。

5. 把别人的源码变成自己的武器:三条进阶学习建议

把源码跑通,这不算什么本事;能合上 Notebook,用自己的话把算法和流程重新实现一遍,才算真正吸收了。很多人刷完一遍源码后觉得自己会了,但真到面试或者做项目时又脑子空白,就是因为一直在被动地“看代码”,没有主动地“重构代码”。

如果你也想利用好这份 zip,我推荐下面三个学习阶段。

5.1 用“盲写”检验自己是否真的理解

第一个阶段是“照葫芦画瓢”——把 Notebook 从头到尾运行一遍,看懂每个 cell 的输入输出。第二个阶段就要关掉答案了。比如你看到第 2 章的文字描述:“切分训练集和测试集”,先不要看代码,自己试着写train_test_split。写不出来,再回去看源码。

这个方法很笨,但非常有效。什么时候算过关?就是你在没有源码的情况下,只看着第 2 章的标题,就能在空白 Notebook 里敲出一个完整的数据准备和模型训练流程。到那时候,这份源码对你才真正有了价值。

5.2 一份源码的知识管理方法

我还建议你用表格或者笔记,把全书章节涉及的核心算法整理成自己的速查表。比如:

章节核心算法/工具关键知识点
第2章端到端项目训练集/测试集切分,交叉验证,误差分析
第3章分类混淆矩阵,精确率/召回率,ROC曲线
第6章决策树基尼不纯度,剪枝
第10章Keras神经网络层、损失函数、优化器、回调函数
第19章Transformer自注意力,位置编码,预训练与微调

做这张表的过程,其实就是在帮你建立机器学习知识的地图。等到期末复习或者准备面试时,看自己的速查表比重新翻书高效太多。

我个人做完这件事之后,最大的感受是:那些当时觉得“懂了,但说不出来”的概念,比如交叉验证、正则化、学习率,在整理的过程中慢慢都能用大白话讲清楚了。这也是这份源码包最被低估的用法——它不仅能跑代码,还能帮你把知识点串成线。别只把它当成一个需要破解的 zip 压缩包,把它当成一座可以反复挖掘的矿,你每一次动手实践,都会挖到一点新的东西。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询