机器学习之PyTorch和Scikit-Learn第一章 赋予计算机学习数据的能力Part 2

376 阅读14分钟

其它章节内容请见机器学习之PyTorch和Scikit-Learn

基本术语和符号简介

前面我们讨论了机器学习的三大分类:监督学习、无监督学习和强化学习,下面来学习本书中会用到一些基本术语。下面的一小节中包含用于表示数据集各方面的常用术语,以及可实现更精准高效沟通的数学符号。

机器学习是一个非常大的领域并且还跨多学科,迟早一定会遇到表示相同概念的不同术语。第二个小节中收集了在机器学习文献中最常用的术语,在阅读机器学习刊物时会当成手册查阅。

本书中使用的符号和约定

图1.8中为鸢尾花数据集的节选,这是机器中学习中的经典案例(详情请见archive.ics.uci.edu/ml/datasets…)。鸢尾花数据集为包含鸢尾花测量数量的150个数据样本,分类三类(Setosa、Versicolor和Virginica)。

这里每朵花的样本数据占数据集的一行,单位为厘米的测量数据存放于列中,也被称为数据集的特征:

图1.8: 鸢尾花数据集

图1.8: 鸢尾花数据集

为保持记录符号和实现简单高效,我们会使用一些线性代数的基础知识。在接下来的章节中,我们会使用矩阵标记来表示数据。我们会遵循一个常见约定,在特征矩阵X中将每个样本放在单独一行中,而每个特征则放在单独的列中。

鸢尾花数据集由150个样本和4个特征组成,写为150×4的矩阵,正式表示为

符号约定

本书中除特别说明,大部分时候会使用上标i来表示第i个训练样式,使用下标 j 来来示训练数据集中的第 j 维。

我们会使用小写粗体字母来表示向量 (),大写粗体字母来表示矩阵()。引用向量或矩阵中的某个元素,我们会使用斜体字母 (分别为x(n) 或)。

例如表示花瓣样本150号的第一维,花萼长度。矩阵 X 中的每一行表示一个花瓣实例,可写作一个4维行向量

 

而每个特征维度是一个150维的列向量。例如:

类似地,可以将目标变量(此处为类标签)表示为一个150维的列向量:

机器学习术语

机器学习涉及领域广泛并且跨学科,因为它将不同研究领域的科学家汇聚一堂。有时一些术语和概念会被重新发现或重新定义,你可能本来很熟悉的东西使用了另一个名称。为方便起见,下来的列表中,列出了在阅读图书和机器学习文献时常用的术语及近义词:

  • 训练样例(Training example):表格中表示数据集的一行,与观测(observation)、记录(record)、实例(instance)或样本(sample )为近义词(在大部分上下文中,样本指的是训练样例的集合)。
  • 训练(Training):模型拟合,在参数模型中类似于参数估计( parameter estimation)。
  • 特征(Feature),缩写为x:数据表或数据(设计)矩阵中的一列。近义词有预测变量(predictor)、变量(variable)、输入(input)、属性(attribute)或协变量(covariate)。
  • 目标(Target),缩写为y:近义词有结果(outcome)、输出(output)、响应变量(response variable)、因变量(dependent variable)、(类)标签( (class) label)、真相(ground truth)。
  • 损失函数(Loss function):常用的近义词有代价(cost )函数。有时损失函数也称为误差(error )函数。有某些文献中,“损失”指的是为单个数据点测量的损失 ,代价用于测量对整个数据集计算损失(平均值或汇总)。

构建机器学习系统路线图

在前面的小节,我们讨论了机器学习的基本概念以及其三大类型。本节中,我们会讨论机器学习系统与学习算法的其它重要部分。

图1.9中展示了在预测模型中使用机器学习的典型工作流,这在后面的小节中会分别讨论:

图1.9: 预测模型工作流

图1.9: 预测模型工作流

预处理-使数据成形

我们先讨论构建机器学习系统的路线图。原数据很少是按照学习模型最优性能的格式。因此数据预处理就成为所有机器学习应用中的重要步骤。

以前面一节中的鸢尾花数据集为例,可以把原数据看成是一组想要提取有用信息的花的图片。有用的特征可能集中在花的颜色或高度、长度和宽度。

很多机器学习算法还要求选择的特征与最优性能处于同一量级,通常的实现方式是将特征转化到 [0, 1] 范围内或是通过零平均值及单位方差所得到的标准正态分布,在后续章节中我们会学到。

某些选中的特征可能高度相关,因此在某种程度上是冗余的。在这种情况下,可使用降维技术把特征压缩为更低维度的子空间。对特征空间降维的优势是所需存储空间更少,并且学习算法运行速度更快。在某些情况下,如果数据集包含大量不相关特殊(或噪声)数据降维还能提升模型的预测性能,换句话说就是在数据集信噪比较低时。

要使机器学习算法不仅对训练数据集性能好而且对新数据也能产生很好的结果,我们需要随机分割数据集为单独的训练和测试数据集。我们使用训练数据集来训练和优化我们的机器学习模型,但保留测试数据集到最后用于评估最终的模型。

训练和选择预测模型

本章稍后我们会学到,为解不同的问题任务开发出了多种机器学习算法。可通过David Wolpert著名的没有免费午餐定理进行总结,我们无法“免费”进行学习(《学习算法间缺少先验差别》,D.H. Wolpert, 1996,《优化没有免费的午餐定理》D.H. Wolpert和W.G. Macready, 1997)。我们可以将这一概念关联到另一个流行的格言:手里拿个锤子,看什么都像钉子 (Abraham Maslow, 1966)。比如,每个分类算法都有内在的偏差(bias),如果不对任务做任何假定就没有哪个分类模型优先级更高。因此在实践中,比较不同的学习算法来训练和选择最佳效果的模型就非常重要了。但在比较不同模型之前,需要决定好测量性能的指标。一个常见的指标是分类准确度,通过正确分类实例的比例来定义。

一个合理的问题是:如果不使用测试数据集来选择模型,又将它保留用做模型评估,那么如何知道哪个模型对最终测试数据集和真实数据的效果更佳呢?要解决其中的问题,可以使用一些统称为“交叉验证”的技术。在交叉验证中,我们将数据集进一步分为训练和验证子集来评估模型的综合性能。

最后,不能奢望软件库所提供的各种学习算法的默认参数对你的具体问题任务就是最优的。因此,在后续章节中我们会经常使用超参数优化技术来辅助我们优化模型性能。

可以把这些超参数看作是数据中未学习到的参数,但可用于提升性能的模型旋钮(knobs)。在后续章节碰到实例案例时读者就清楚了。

评估模型并预测未知数据实例

在选好了拟合训练数据集的模型后,我们可以使用测试数据集来评估其对未知数据的效果,进而评估出所谓的泛化误差(generalization error)。如果对性能满意,可以使用该模型来预测未来的新数据。值得注意的是前面所说的流程中的参数,比如特征缩放和数据降维,只是通过训练数据集获取的,之后会再次应用这些参数来转化测试数据集以及新的数据实例,否则测试数据所测量出的性能可能会过于乐观。

使用Python来进行机器学习

Python是数据科学领域最著名的编程语言之一,借助非常活跃的开发者及开源社区,开发出了大量有用的科学计算和机器学习库。

虽然Python这类解释性语言的性能,在执行计算密集型任务时要逊于其它更底层的编程语言,但开发出了使用底层的Fortran和C所实现的NumPy和SciPy之类的扩展库,可对多维数组执行快速的向量化运算。

对于机器学习编程任务,我们多会使用scikit-learn库,它是当前最流行、易用的开源机器学习库之一。在后续的章节中,在聚焦于机器学习的一个分支深度学习时,我们会使用PyTorch库的最新版本,它通过使用显卡专门用于训练所谓的深度神经网络模型。

安装Python及通过PyPI安装Python包

三大操作系统,Microsoft Windows、macOS和Linux,均可使用Python ,可通过Python官方网站www.python.org下载安装包及文档。

本书中的代码示例使用Python 3.9编写和测试,通常建议使用Python 3的最新稳定版本。有些代码同时兼容Python 2.7,但官方对Python 2.7的支持已于2019年终结,大部分开源库都不再支持Python 2.7 (python3statement.org),我们强烈建议使用Python 3.9或更新版本。

可以通过在终端(Windows下使用PowerShell )执行如下命令来检测Python版本:

python --version

python3 --version

本书中所使用的其它包可通过pip安装程序来安装,pip从Python 3.3开始就集成在于标准库中,无需额外安装。有关pip的更多信息请参见docs.python.org/3/installin…

在成功安装Python之后,可以在终端中执行pip 来安装其它Python包:

pip install SomePackage

已安装的包可通过--upgrade标记来进行升级:

pip install SomePackage --upgrade

使用Anaconda Python发布和包管理器

针对科学计算强烈推荐安装来自Continuum Analytics的开源包管理系统conda。conda免费并且采用了许可式的开源证书。其目标是帮助在各操作系统中安装数据科学、数学和工程的Python以及其版本管理。如果想使用conda,有好几种选择,分别是Anaconda、Miniconda和Miniforge:

  • Anaconda中预装了很多科学计算包。可通过docs.anaconda.com/anaconda/in…下载安装包,Anaconda的快速开始指南位于docs.anaconda.com/anaconda/us…
  • Miniconda是Anaconda的简化版(docs.conda.io/en/latest/m…)。和Anaconda基本一致,只是没有预装包,这深受很多人(包括作者在内)的喜爱。
  • Miniforge类似于Miniconda,但它是社区维护的,使用了与Miniconda及Anaconda不同的包仓库 (conda-forge)。我们觉得Miniforge是Miniconda的一个很好的替代吕。下载及安装指导位于GitHub仓库github.com/conda-forge…

在成功通过 Anaconda、Miniconda或Miniforge安装好了conda后,可执行如下命令安装新的Python包:

conda install SomePackage

可使用以下命令升级已有的包:

conda update SomePackage

官方conda通道中所没有的包可通过社区支持的conda-forge项目(conda-forge.org)来获取,通过--channel conda-forge参数指定即可。例如:

conda install SomePackage --channel conda-forge

默认conda通道和conda-forge都没有的包可通过前面讲过的pip 进行安装。比如:

pip install SomePackage

科学计算、数据科学和机器学习包

本书的前半部分主要使用NumPy的多维数组来存储和操作数据。有时会用到pandas,这是一个构建于NumPy之上的库,提供了一些更高阶的操作工具可以更方便地处理表格数据。为提升学习体验以及可视化量化数据,这通常有利于进行理解,我们会使用自定义的Matplotlib库。

本书中主要使用到的机器学习库有 scikit-learn (第311章)。第12章 使用PyTorch做并行神经网络训练中会介绍用于深度学习的PyTorch库。

在编写本书时主要Python包的版本号参见下方的列表。理想情况下你所安装的包的版本应该要保持一致,这样可保障示例代码能正确运行:

  • NumPy 1.21.2
  • SciPy 1.7.0
  • Scikit-learn 1.0
  • Matplotlib 3.4.3
  • pandas 1.3.2

在安装好这些包之后,可以通过在Python 中导入这些包并文章其__version__属性来确认版本,比如:

>>> import numpy
>>> numpy.__version__
'1.21.2'

为方便起见,我们在本书的附属代码仓库github.com/rasbt/machi…中添加了一个python-environment-check.py脚本,可通过执行脚本来确认Python的版本和包的版本。

某些章节会用到其它包,我们会提供相关的安装信息。比如现在大可不必担心PyTorch的安装。第12章中会在需要的时候提供相应的说明。

如果代码与章节中的代码完全一致时仍然出现错误,建议首先检查底层包的版本,再进行调试或联系作者。有时,新版本会引入向后不兼容的修改,可能导致错误。

如果不希望修改主Python安装中包的版本,推荐使用虚拟环境来安装本书中的包。如果使用Python却没有安装conda管理器,可以使用venv 库来新建虚拟环境。例如,可以通过如下两条命令创建及激活虚拟环境:

python3 -m venv /Users/sebastian/Desktop/pyml-book
source /Users/sebastian/Desktop/pyml-book/bin/activate

注意在每次打开新的终端或PowerShell时都需要激活虚拟环境。可在docs.python.org/3/library/v…中了解到更多有关venv 的信息。

如果使用Anaconda,可以通过如下命令创建和激活虚拟环境:

conda create -n pyml python=3.9
conda activate pyml

小结

本章中,我们从高层次探讨了机器学习并熟悉了后续章节中会详细学习的全景以及主要概念。我们学习到监督学习由两大子领域组成:分类和回归。通过分类模型可以将对象分成不同类,通过回归分析可预测目标变量的连续结果。无监督学习不仅为发现无标签数据的结构提供了有用的技术,还可用于特征预处理阶段的数据压缩。

我们简单地过了一遍将机器学习应用于问题任务的典型路线图,可作为后续章节中更深入讨论和随手案例的基础。最后我们配置了Python环境并安装和更新了所需要的包,来做好实操机器学习的准备。

本书的后面,随时机器学习本身外,我们还会介绍预处理数据的各种技术,这有助于得到各种机器学习算法的最佳性能。除了在本书中我们会广泛讲解分类算法外,还会探讨回归分析和聚类的各种技术。

前方的旅程可期,会涉及到机器学习广泛领域中的多种强大技术。但我们会一步步地接近机器学习,在本书的各章中层层递进。下一章中我们会开始实现机器学习最早的聚类算法之一,为第3章 使用Scikit-Learn的机器学习分类器之旅的学习打下基础,在第3章中我们会讲解更高级的机器学习算法并使用scikit-learn开源机器学习库。

整理翻译自:Machine Learning with PyTorch and Scikit-Learn一书