前言
近年来,机器学习方法凭借其理解海量数据和自主决策的能力,已在医疗保健、 机器人、生物学、物理学、大众消费和互联网服务等行业得到了广泛的应用。自从AlexNet模型在2012年ImageNet大赛被提出以来,机器学习和深度学习迅猛发展,取得了一个又一个里程碑式的成就,深刻地影响了工业界、学术界和人们的生活。
如今,机器学习、深度学习、人工智能已经成为信息领域最热门的研究方向,在就业市场这些领域的工作也非常吸引人。科学的巨大飞跃通常来自精彩的想法和易用的工具,机器学习也不例外。
在实践中应用机器学习需要理论和工具的结合。对于机器学习的入门读者而言, 从理解原理概念到确定要安装的软件包都有一定的难度。许多在最开始尝试机器学习的时候,会发现理解一个算法在干什么真的非常难。不仅仅是因为算法里各种繁杂的数学理论和难懂的符号,没有实际的例子,光靠定义和推导来了解一个算法实在是很无聊。就连网络上的相关的指导材料,能找到的通常都是各种公式以及晦涩难懂的解释,很少有人能够细致的将所有细节加以说明。
因此,《Python机器学习:基于PyTorch和Scikit-Learn》这本书的定位是把机器学习理论和工程实践结合起来,从而降低读者的阅读门槛。从数据驱动方法的基础知识到最新的深度学习框架,本书每一章都提供了机器学习代码示例,用于解决实际应用中的机器学习问题。
**《Python机器学习:基于PyTorch和Scikit-Learn》
**
[美]塞巴斯蒂安·拉施卡、[美]刘玉溪(海登)、
[美]瓦希德·米尔贾利利 著
Python深度学习“四大名著”之一全新PyTorch版
PyTorch核心维护者Dmytro Dzhulgakov
亲笔作序推荐
本书既介绍了了机器学习领域的基本原理, 也介绍了机器学习的工程实践。本书的价值无可估量,同时也希望这本书能够激励读者将机器学习用于自己的研究领域。
内容简介
本书是一本全面介绍在PyTorch环境下学习机器学习和深度学习的综合指南,可以作为初学者的入门教程,也可以作为读者开发机器学习项目时的参考书。
本书讲解清晰、示例生动,深入介绍了机器学习方法的基础知识,不仅提供了构建机器学习模型的说明,而且提供了构建机器学习模型和解决实际问题的基本准则。本书添加了基于PyTorch的深度学习内容,介绍了新版Scikit-Learn。本书涵盖了多种用于文本和图像分类的机器学习与深度学习方法,介绍了用于生成新数据的生成对抗网络(GAN)和用于训练智能体的强化学习。最后,本书还介绍了深度学习的新动态,包括图神经网络和用于自然语言处理(NLP)的大型transformer。无论是机器学习入门新手,还是计划跟踪机器学习进展的研发人员,都可以将本书作为使用Python进行机器学习的不二之选。
学完本书,你将能够:
探索机器从数据中“学习”的框架、模型和方法。使用Scikit-Learn实现机器学习,使用PyTorch实现深度学习。训练机器学习分类器分类图像、文本等数据。构建和训练神经网络、transformer及图神经网络。探索评估和优化模型的最佳方法。使用回归分析预测连续目标结果。使用情感分析深入地挖掘文本和社交媒体数据。
作者简介
塞巴斯蒂安·拉施卡(Sebastian Raschka)获密歇根州立大学博士学位,现在是威斯康星-麦迪逊大学统计学助理教授,从事机器学习和深度学习研究。他的研究方向是数据受限的小样本学习和构建预测有序目标值的深度神经网络。他还是一位开源贡献者,担任Grid.ai的首席AI教育家,热衷于传播机器学习和AI领域知识。
刘玉溪(海登)[ Yuxi (Hayden) Liu ]在谷歌公司担任机器学习软件工程师,曾担任机器学习科学家。他是一系列机器学习书籍的作者。他的第一本书Python Machine Learning By Example在2017年和2018年亚马逊同类产品中排名第一,已被翻译成多种语言。
瓦希德·米尔贾利利(Vahid Mirjalili)获密歇根州立大学机械工程和计算机科学双博士学位,是一名专注于计算机视觉和深度学习的科研工作者。作者Sebastian Raschka很擅长用易于理解的方式解释复杂的方法和概念。随着深度学习革命深入到各个领域,Sebastian Raschka和他的团队不断升级、完善书的内容,陆续出版了第2版和第3版。本书在前3个版本的基础上新增了某些章节,包含了PyTorch相关的内容,覆盖了Transformer和图神经网络。这些是目前深度学习领域的前沿方法,在过去两年中席卷了文本理解和分子结构等领域。作者拥有专业知识和解决实际问题的经验,因此出色地平衡了书中的理论知识和动手实践内容。
Sebastian Raschka和Vahid Mirjalili在计算机视觉和计算生物学领域拥有丰富的科研经验。
Yuxi Liu擅长解决机器学习领域的实际问题,例如将机器学习方法用于事件预测、推荐系统等。本书的作者都对教育有着满腔热忱,他们用浅显易懂的语言编写了本书以满足读者的需求。PyTorch核心维护者亲笔推荐“我相信,你能感受到这本书对机器学习热点的总结全面而彻底,对机器学习实现方法的解释清晰而宝贵。我希望你能从这本书中获得灵感,从而可以使用机器学习方法解决实际问题。” —— Dmytro Dzhulgakov,PyTorch核心维护者
目录
上拉下滑查看目录 ↓
译者序
序
前言
作者简介
审校者简介
第1章 赋予计算机从数据中学习的能力1
1.1 将数据转化为知识的智能系统1
1.2 三种机器学习类型2
1.2.1 用于预测未来的监督学习2
1.2.2 解决交互问题的强化学习4
1.2.3 发现数据中隐藏规律的无监督学习 5
1.3 基本术语与符号6
1.3.1 本书中使用的符号和约定6
1.3.2 机器学习术语8
1.4 构建机器学习系统的路线图8
1.4.1 数据预处理——让数据可用8
1.4.2 训练和选择预测模型9
1.4.3 使用未见过的数据对模型进行评估10
1.5 使用Python实现机器学习算法10
1.5.1 从Python Package Index中安装Python和其他软件包10
1.5.2 使用Anaconda Python
软件包管理器11
1.5.3 科学计算、数据科学和机器学习软件包12
1.6 本章小结13
第2章 训练简单的机器学习分类算法14
2.1 人工神经元——机器学习早期历史一瞥14
2.1.1 人工神经元的定义15
2.1.2 感知机学习规则16
2.2 使用Python实现感知机学习算法19
2.2.1 面向对象的感知机API19
2.2.2 使用鸢尾花数据集训练感知机22
2.3 自适应线性神经元与算法收敛27
2.3.1 使用梯度下降法最小化损失函数28
2.3.2 在Python中实现Adaline30
2.3.3 通过特征缩放改进梯度下降34
2.3.4 大规模机器学习与随机梯度下降36
2.4 本章小结41
XIV
第3章 ScikitLearn机器学习分类算法之旅42
3.1 分类算法的选择42
3.2 学习ScikitLearn的第一步——训练感知机43
3.3 用逻辑回归算法建模分类概率48
3.3.1 逻辑回归与条件概率48
3.3.2 用逻辑损失函数更新模型权重51
3.3.3 从Adaline的代码实现到逻辑回归的代码实现53
3.3.4 用ScikitLearn训练逻辑回归模型56
3.3.5 使用正则化避免模型过拟合59
3.4 基于最大分类间隔的支持向量机62
3.4.1 理解最大分类间隔62
3.4.2 使用松弛变量解决非线性可分问题62
3.4.3 ScikitLearn中另外一种实现64
3.5 使用核支持向量机求解非线性问题64
3.5.1 处理线性不可分数据的核方法64
3.5.2 使用核方法在高维空间中寻找分离超平面66
3.6 决策树学习69
3.6.1 最大化信息增益70
3.6.2 构建决策树73
3.6.3 多棵决策树组成随机森林76
3.7 基于惰性学习策略的k近邻算法78
3.8 本章小结81
第4章 构建良好的训练数据集——数据预处理83
4.1 处理缺失值83
4.1.1 识别表格数据中的缺失值83
4.1.2 删除含有缺失值的样本或特征85
4.1.3 填补缺失值85
4.1.4 ScikitLearn的估计器86
4.2 处理类别数据87
4.2.1 用pandas实现类别数据编码88
4.2.2 映射有序特征88
4.2.3 类别标签编码89
4.2.4 标称特征的独热编码90
4.3 将数据集划分为训练数据集和测试数据集93
4.4 使特征具有相同的尺度95
4.5 选择有意义的特征97
4.5.1 用L1和L2正则化对模型复杂度进行惩罚98
4.5.2 L2正则化的几何解释98
4.5.3 L1正则化与稀疏解99
4.5.4 序贯特征选择算法102
4.6 用随机森林评估特征重要性107
4.7 本章小结109
第5章 通过降维方法压缩数据110
5.1 无监督降维的主成分分析方法110
5.1.1 主成分分析的主要步骤110
5.1.2 提取主成分的步骤112
5.1.3 总方差和被解释的方差114
5.1.4 特征变换115
5.1.5 用ScikitLearn实现主成分分析118
5.1.6 评估特征的贡献120
5.2 监督数据压缩的线性判别分析方法122
5.2.1 主成分分析与线性判别分析122
5.2.2 线性判别分析基本原理123
5.2.3 计算散布矩阵124
5.2.4 为新特征子空间选择线性判别式126
5.2.5 将样本投影到新的特征空间128
5.2.6 用ScikitLearn实现线性判别分析128
5.3 非线性降维和可视化130
5.3.1 非线性降维的不足130
5.3.2 使用tSNE可视化数据131
5.4 本章小结135
XV
第6章 模型评估和超参数调优的最佳实践136
6.1 使用pipeline方法简化工作流程136
6.1.1 加载威斯康星乳腺癌数据集136
6.1.2 在pipeline中集成转换器和估计器138
6.2 使用k折交叉验证评估模型性能140
6.2.1 holdout交叉验证140
6.2.2 k折交叉验证140
6.3 用学习曲线和验证曲线调试算法144
6.3.1 使用学习曲线解决偏差和方差问题144
6.3.2 使用验证曲线解决过拟合和欠拟合问题146
6.4 通过网格搜索微调机器学习模型148
6.4.1 通过网格搜索调整超参数148
6.4.2 通过随机搜索更广泛地探索超参数的配置149
6.4.3 连续减半超参数的搜索算法151
6.4.4 嵌套交叉验证153
6.5 模型性能评估指标154
6.5.1 混淆矩阵155
6.5.2 精确率和召回率156
6.5.3 绘制ROC曲线158
6.5.4 多分类器评价指标160
6.5.5 处理类别不均衡问题161
6.6 本章小结163
XVI
第7章 组合不同模型的集成学习164
7.1 集成学习164
7.2 通过绝对多数投票组合分类器167
7.2.1 实现一个简单的基于绝对多数投票的集成分类器167
7.2.2 使用绝对多数投票原则进行预测171
7.2.3 评估和调整集成分类器173
7.3 bagging——基于bootstrap样本构建集成分类器179
7.3.1 bagging简介179
7.3.2 使用bagging对葡萄酒数据集中的样本进行分类180
7.4 通过自适应boosting提高弱学习器的性能184
7.4.1 boosting的工作原理184
7.4.2 用ScikitLearn实现AdaBoost188
7.5 梯度boosting——基于损失梯度训练集成分类器191
7.5.1 比较AdaBoost与梯度boosting191
7.5.2 通用的梯度boosting算法概述191
7.5.3 解释用于分类的梯度boosting算法193
7.5.4 用梯度boosting分类的例子194
7.5.5 使用XGBoost196
7.6 本章小结197
第8章 用机器学习进行情感分析198
8.1 对IMDb影评数据进行文本处理198
8.1.1 获取影评数据集199
8.1.2 将影评数据集预处理成更易使用的格式199
8.2 词袋模型201
8.2.1 将单词转换为特征向量201
8.2.2 通过词频-逆文档频率评估单词的相关性203
8.2.3 文本数据清洗204
8.2.4 将文档处理成token206
8.3 训练用于文档分类的逻辑回归模型208
8.4 处理更大的数据——在线算法
和核外学习方法210
8.5 用潜在狄利克雷分配实现主题
建模213
8.5.1 使用LDA分解文本
文档214
8.5.2 用ScikitLearn实现
LDA214
8.6 本章小结217
第9章 预测连续目标变量的
回归分析218
9.1 线性回归简介218
9.1.1 简单线性回归218
9.1.2 多元线性回归219
9.2 探索艾姆斯住房数据集220
9.2.1 将艾姆斯住房数据集加载
到DataFrame中220
9.2.2 可视化数据集的重要
特征222
9.2.3 使用相关矩阵查看
相关性223
9.3 最小二乘线性回归模型的
实现225
9.3.1 用梯度下降法求解回归
参数225
9.3.2 用ScikitLearn估计回归
模型的系数229
9.4 使用RANSAC拟合稳健回归
模型231
9.5 评估线性回归模型的性能233
9.6 使用正则化方法进行回归237
9.7 将线性回归模型转化为曲线——
多项式回归238
9.7.1 使用ScikitLearn添加
多项式项239
9.7.2 建模艾姆斯住房数据
集中的非线性关系240
9.8 使用随机森林处理非线性
关系243
9.8.1 决策树回归243
9.8.2 随机森林回归245
9.9 本章小结247
XVII
第10章 处理无标签数据的
聚类分析248
10.1 使用k均值算法对样本分组248
10.1.1 用ScikitLearn实现
k均值聚类248
10.1.2 k均值++——更聪明的
簇初始化方法252
10.1.3 硬聚类与软聚类253
10.1.4 用肘方法求解最优簇的
数量255
10.1.5 通过轮廓图量化聚类
质量255
10.2 把簇组织成层次树260
10.2.1 自底向上的聚类260
10.2.2 在距离矩阵上进行分层
聚类262
10.2.3 热度图与树状图
结合265
10.2.4 通过ScikitLearn进行
凝聚聚类266
10.3 通过DBSCAN定位高密度
区域267
10.4 本章小结272
XVIII
第11章 从零开始实现多层人工神经网络273
11.1 用人工神经网络建立复杂函数
模型273
11.1.1 单层神经网络274
11.1.2 多层神经网络结构275
11.1.3 利用前向传播激活神经
网络277
11.2 识别手写数字279
11.2.1 获取并准备MNIST
数据集279
11.2.2 实现多层感知机282
11.2.3 神经网络训练代码287
11.2.4 评估神经网络的
性能291
11.3 训练人工神经网络295
11.3.1 损失函数的计算295
11.3.2 理解反向传播296
11.3.3 通过反向传播训练
神经网络297
11.4 关于神经网络的收敛性300
11.5 关于神经网络实现的最后
几句话300
11.6 本章小结301
第12章 用PyTorch并行训练
神经网络302
12.1 PyTorch和模型的训练性能302
12.1.1 性能挑战302
12.1.2 什么是PyTorch303
12.1.3 如何学习PyTorch304
12.2 学习PyTorch的第一步304
12.2.1 安装PyTorch305
12.2.2 在PyTorch中创建
张量306
12.2.3 对张量形状和数据
类型进行操作307
12.2.4 张量数学运算307
12.2.5 拆分、堆叠和连接
张量309
12.3 在PyTorch中构建输入
pipeline310
12.3.1 使用已有张量创建
PyTorch DataLoader
311
12.3.2 将两个张量组合成
一个联合数据集311
12.3.3 乱序、批处理和
重复313
12.3.4 用存储在本地硬盘的
文件创建数据集314
12.3.5 从torchvision.datasets
库中获取数据集318
12.4 在PyTorch中构建神经网络模型321
12.4.1 PyTorch神经网络模块322
12.4.2 构建线性回归模型322
12.4.3 使用torch.nn和
torch.optim模块
训练模型325
12.4.4 构建多层感知机对鸢尾花数据集分类326
12.4.5 在测试数据集上评估训练好的模型329
12.4.6 保存和重新加载训练好的模型329
12.5 为多层神经网络选择激活函数330
12.5.1 回顾逻辑函数331
12.5.2 使用softmax函数估计多分类中的
类别概率332
12.5.3 使用双曲正切函数拓宽输出范围333
12.5.4 整流线性单元335
12.6 本章小结337
第13章 深入探讨PyTorch的
工作原理338
13.1 PyTorch的主要功能338
13.2 PyTorch的计算图339
13.2.1 理解计算图339
13.2.2 在PyTorch中创建计算图339
13.3 用于存储和更新模型参数的
PyTorch张量340
13.4 通过自动微分计算梯度342
13.4.1 计算损失函数关于
可微变量的梯度342
13.4.2 自动微分343
13.4.3 对抗样本344
13.5 使用torch.nn模块简化常见
结构344
13.5.1 使用nn.Sequential
实现模型344
13.5.2 选择损失函数345
13.5.3 解决XOR分类
问题346
13.5.4 使用nn.Module灵活
构建模型350
13.5.5 使用PyTorch编写
自定义层352
13.6 项目1:预测汽车的燃油
效率356
13.6.1 使用特征列357
13.6.2 训练DNN回归
模型360
13.7 项目2:分类MNIST手写
数字362
XIX
13.8 高级PyTorch API:PyTorch
Lightning简介364
13.8.1 构建PyTorch Lightning
模型365
13.8.2 为Lightning 设置数据
加载器367
13.8.3 使用PyTorch Lightning
Trainer类训练模型369
13.8.4 使用TensorBoard评估
模型370
13.9 本章小结373
第14章 使用深度卷积神经网络
对图像进行分类374
14.1 卷积神经网络的组成模块374
14.1.1 了解卷积神经网络和
层次特征375
14.1.2 离散卷积376
14.1.3 下采样层383
XX
14.2 构建卷积神经网络385
14.2.1 处理多个输入通道385
14.2.2 使用L2范数和dropout
对神经网络正则化388
14.2.3 分类任务的损失
函数390
14.3 使用PyTorch实现深度卷积
神经网络392
14.3.1 多层卷积神经网络
结构392
14.3.2 数据加载和预处理393
14.3.3 使用torch.nn模块
实现卷积神经网络394
14.4 使用卷积神经网络对人脸图像
进行微笑分类400
14.4.1 加载CelebA
数据集400
14.4.2 图像转换和数据
增广401
14.4.3 训练卷积神经网络
微笑分类器407
14.5 本章小结413
第15章 用循环神经网络对序列
数据建模415
15.1 序列数据415
15.1.1 序列数据建模415
15.1.2 序列数据与时间序列
数据416
15.1.3 序列数据的表示416
15.1.4 序列建模方法417
15.2 用于序列数据建模的循环
神经网络418
15.2.1 循环神经网络的循环
机制418
15.2.2 循环神经网络激活值
计算419
15.2.3 隐藏层循环与输出层
循环421
15.2.4 远距离学习面临的
问题424
15.2.5 长短期记忆网络425
15.3 在PyTorch中实现循环神经
网络426
15.3.1 项目1:基于IMDb
影评进行情感分析427
15.3.2 项目2:在PyTorch
中实现字符级语言
建模437
15.4 本章小结448
第16章 transformer:利用
注意力机制改善自然
语言处理效果449
16.1 带有注意力机制的循环神经
网络449
16.1.1 帮助循环神经网络获取
信息的注意力机制450
16.1.2 循环神经网络中最初的
注意力机制451
16.1.3 用双向循环神经网络
模型处理输入数据452
16.1.4 根据上下文向量得到输出452
16.1.5 计算注意力权重453
16.2 自注意力机制453
16.2.1 自注意力机制的基本形式454
16.2.2 自注意力机制的参数化:
缩放点积注意力457
16.3 注意力是唯一需要的:最初的
transformer460
16.3.1 通过多头注意力编码上下文嵌入向量460
16.3.2 学习语言模型:解码器和掩码多头注意力464
16.3.3 实现细节:位置编码和层归一化465
16.4 利用未标注的数据构建大型语言模型467
16.4.1 预训练和微调transformer模型467
16.4.2 使用未标注数据的GPT模型469
16.4.3 使用GPT2生成新文本471
16.4.4 双向预训练的BERT模型474
16.4.5 两全其美的模型:BART476
16.5 用PyTorch微调BERT模型478
16.5.1 加载IMDb影评数据集479
16.5.2 数据集分词481
16.5.3 加载和微调预训练BERT模型482
16.5.4 使用Trainer API微调transformer486
16.6 本章小结489
XXI
第17章 用于合成新数据的生成
对抗网络491
17.1 生成对抗网络491
17.1.1 自编码器492
17.1.2 用于合成新数据的生成
模型493
17.1.3 用生成对抗网络生成
新样本494
17.1.4 理解生成对抗网络模型
中生成器和判别器网络
的损失函数495
17.2 从零开始实现生成对抗网络497
17.2.1 用谷歌Colab训练生成
对抗网络模型497
17.2.2 实现生成器和判别器网络499
17.2.3 定义训练数据集502
17.2.4 训练生成对抗网络模型504
17.3 用卷积GAN和Wasserstein GAN提高生成图像的质量510
17.3.1 转置卷积510
17.3.2 批归一化511
17.3.3 实现生成器和判别器513
17.3.4 两个分布之间的差异度度量520
17.3.5 在生成对抗网络实践中使用EM距离523
17.3.6 梯度惩罚523
17.3.7 使用WGANGP实现深度卷积生成对抗网络524
17.3.8 模式坍塌527
17.4 其他生成对抗网络应用529
17.5 本章小结530
XXII
第18章 用于捕获图数据关系的
图神经网络531
18.1 图数据简介531
18.1.1 无向图532
18.1.2 有向图533
18.1.3 标签图533
18.1.4 将分子结构表示
为图533
18.2 理解图卷积534
18.2.1 图卷积的基本原理534
18.2.2 实现一个基本的图卷积
函数536
18.3 用PyTorch从零开始实现图神经
网络540
18.3.1 定义NodeNetwork
模型540
18.3.2 NodeNetwork图卷积层
编码541
18.3.3 添加一个全局池化层
处理大小不同的图542
18.3.4 准备数据加载工具545
18.3.5 使用NodeNetwork进行
预测548
18.3.6 使用PyTorch Geometric
库实现图神经网络548
18.4 其他图神经网络层和最新的
进展554
18.4.1 谱图卷积554
18.4.2 池化555
18.4.3 数据归一化556
18.4.4 图神经网络文献557
18.5 本章小结559
第19章 在复杂环境中做决策的
强化学习560
19.1 从经验中学习概述560
19.1.1 了解强化学习561
19.1.2 智能体与环境562
19.2 强化学习的理论基础563
19.2.1 马尔可夫决策过程563
19.2.2 阶段性任务与持续性
任务566
19.2.3 强化学习术语566
19.2.4 使用贝尔曼方程的动态
规划569
19.3 强化学习算法569
19.3.1 动态规划570
19.3.2 蒙特卡罗强化学习572
19.3.3 时序差分学习573
19.4 实现第一个强化学习算法575
19.4.1 OpenAI Gym工具包介绍575
19.4.2 用Q学习解决网格世界问题584
19.5 深度Q学习概览588
19.5.1 训练深度Q学习网络模型589
19.5.2 实现深度Q学习算法591
19.6 本章小结及本书总结595