机器学习工程实战

978-7-115-57050-5
作者: [加] 安德烈·布可夫(Andriy Burkov)
译者: 王海鹏丁静
编辑: 秦健

图书目录:

详情

本书是人工智能和机器学习领域专业多年实践的结晶,深入浅出讲解机器学习应用和工程实践,是对机器学习工程实践和设计模式的系统回顾。全书分别从项目前的准备,数据收集和准备,特征工程,监督模型训练,模型评估,模型服务、监测和维护等方面讲解,由浅入深剖析机器学习实践过程中遇到的问题,帮助读者快速掌握机器学习工程实践和设计模式的基本原理与方法。 本书内容安排合理,架构清晰,理论与实践相结合,适合想要从事机器学习项目的数据分析师、机器学习工程师以及机器学习相关专业的学生阅读,也可供需要处理模型的软件架构师参考。

图书摘要

版权信息

书名:机学习工程实战

ISBN:978-7-115-57050-5

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。


著    [加] 安德烈·布可夫(Andriy Burkov)

译    王海鹏 丁 静 

责任编辑 秦 健

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Simplified Chinese translation copyright ©2021 by Posts and Telecommunications Press.

ALL RIGHTS RESERVED.

Machine Learning Engineering by Andriy Burkov.

Copyright © 2020 Andriy Burkov.

本书中文简体版由作者Andriy Burkov授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


本书侧重于对机器学习应用和工程实践的关注,是对机器学习工程实践和设计模式的全面回顾。全书共 10 章,在概述之后,分别从项目开始前的准备,数据收集和准备,特征工程,监督模型训练,模型评估,模型部署,模型服务、监测和维护方面进行讲解,最后做了简短的总结。

本书适合想要从事机器学习项目的数据分析师、机器学习工程师以及机器学习相关专业的学生阅读,也可供需要处理一些模型的软件架构师参考。

“理论上,理论和实践没有区别。但实践上,有区别。”

—— Benjamin Brewster

“如果先写下所有未知因素的清单,完美的项目计划就是可能的。”

—— Bill Langley

“当你融资的时候,是AI;当你招聘的时候,是ML;当你实施的时候,是线性回归;当你调试的时候,是printf()。”

—— Baron Schwartz


我想告诉你一个秘密:当人们说“机器学习”(Machine Learning,ML)时,听起来好像这只是一个学科。吃惊吧!其实有两种机器学习,它们就像创新食谱和发明新的厨房电器一样不同。两者都是崇高的职业,只要你不把它们混为一谈。试想一下,请糕点师为你打造一个烤箱,或者请电气工程师为你烤面包,那该是怎样的情形!

坏消息是,几乎每个人都会把这两种机器学习混为一谈。难怪那么多企业在机器学习上失败。似乎没有人告诉初学者,大多数机器学习课程和教科书都是关于机器学习研究的内容——如何从零开始打造烤箱(还有微波炉、搅拌机、烤面包机、水壶……厨房水槽),而不是如何利用食谱来烹饪美食和大规模创新。换言之,如果你正在寻找机会,为业务问题创造基于ML的创新解决方案,那么你需要的学科名为“应用机器学习”,而不是“机器学习研究”,所以大多数书籍无法满足你的需求。

现在告诉你一个好消息!你正在看的是为数不多的、真正的应用机器学习书籍之一。没错,你找到了一本!在面向研究的书海中,你找到了一根“针”,一本真正的应用型书籍。干得好,亲爱的读者……除非你真的想要找一本书来学习设计通用算法的技能,如果是这样的,建议你现在就去买其他机器学习的书,几乎任何一本都行。我希望作者不会因此而太生气。这本书不一样。

2016年,我开设了谷歌应用机器学习课程“Making Friends with Machine Learning”,该课程受到一万多名工程师和技术领导者的喜爱。当时,我给它设计的结构和本书的结构非常相似。这是因为在应用领域,按照正确的顺序做事情是至关重要的。当你利用新发现的数据能力时,在完成其他步骤之前先处理某些步骤,会导致任何可能的结果,也许是白费力气,也许是破坏项目的“智力拆迁”(kablooie)。事实上,这本书和我的课程在目录上相似,这是最初说服我阅读这本书的原因。这显然是一个趋同进化的案例:我从作者身上看到一个因为缺乏应用机器学习的可用资源而彻夜难眠的思考者。应用机器学习是最可能有用,却又被误解得可怕的工程领域之一,足以让我想为它做点什么。所以,如果你即将合上这本书,不如帮我一个忙,至少思考一下为什么目录是这样安排的。你会从中学到一些好东西,我保证。

那么,这本书的其他部分有什么呢?它相当于机器学习的盛宴,指导我们从食谱创新到规模化交付食物。由于你还没有读过这本书,所以我用烹饪术语来说明。你需要弄清楚什么值得烹饪/目标是什么(决策和产品管理),了解供应商和客户(领域专业知识和商业头脑),如何大规模处理食材(数据工程和分析),如何快速尝试许多不同的食材和设备组合以生成潜在的食谱(原型阶段ML工程),如何检查菜谱的质量是否足够好(统计学),如何将一个潜在的菜谱变成数以百万计的菜品,并有效地提供给大家(生产阶段ML工程),以及如何确保你的菜品保持一流,即使送货车给你送来的是一吨土豆而不是你订购的米饭(可靠性工程)。这本书是市面上为数不多的对端到端流程的每一步都提供深刻见解的书。

现在是我对你直言不讳的好时机,亲爱的读者。这本书相当不错。确实如此。真的很好。但它并不完美。它偶尔会偷工减料(就像一个专业的机器学习工程师惯常所做的那样),不过总体来说,它的信息是正确的。而且,由于它涵盖的领域具有快速发展的实践,所以它并没有假装提供关于这个主题的最新结论。即便如此,它也非常值得一读。鉴于应用机器学习的综合指南如此之少,对这些主题的连贯介绍是有价值的。我很高兴拥有这本书!

关于这本书,我最喜欢的就是它完全拥抱了你需要知道的关于机器学习的重要的事情:错误是可能的……有时它们会伤害到你。正如我的现场可靠性工程的同事们喜欢说的那样,“希望不是一种策略”。希望不会出现错误是你能采取的最糟糕的方法。这本书做得更好。它迅速粉碎了你对构建一个比你更“聪明”的人工智能系统所产生的任何虚假的安全感。(嗯,不会比你更聪明,就是不会。)然后它勤奋地带你调查在实践中各种可能出错的事情,以及如何预防、发现和处理它们。本书很好地概述了监控的重要性,如何处理模型维护,事情出错时该怎么做,如何考虑针对你无法预料的错误的后备策略,如何对付试图利用你的系统的对手,以及如何管理人类用户的期望(呃,还有一节介绍如果用户是机器时该怎么做)。这些都是实用机器学习中重要的话题,但在其他书籍中却常常被忽视。在这里就不一样了。

如果你打算利用机器学习来大规模地解决业务问题,我很高兴你能拿起这本书。好好享受吧!

Cassie Kozyrkov[1],2020年9月

[1] Cassie Kozyrkov是谷歌首席决策科学家,她也是谷歌云平台上“Making Friends with Machine Learning”课程的作者。

 


在过去的几年里,对许多人来说,机器学习已经成为人工智能的同义词。尽管机器学习作为一个科学领域,已经存在几十年,但世界上只有少数组织机构完全发掘了它的潜力。尽管有现代的开源机器学习库、软件包和框架,并且得到了领先组织机构和广泛的科学家与软件工程师社区的支持,但大多数组织机构仍在努力应用机器学习来解决实际的业务问题。

其中一个困难在于人才稀缺。然而,即使能够获得有才华的机器学习工程师和数据分析师,在2020年,大多数组织[1]仍然需要花费31~90天的时间来部署一个模型,而18%的公司花费的时间超过90天——有些公司花费了一年多的时间实现生产化部署。组织在开发ML能力时面临的主要挑战,如模型版本控制、可重复性和扩展性,与其说是科学,不如说是工程。

关于机器学习的好书有很多,既有理论上的,也有实践上的。从一本典型的机器学习书籍中,你可以了解机器学习的类型、算法的主要家族是如何工作的,以及如何使用算法基于数据建立模型。

一本典型的机器学习书籍不太关注实现机器学习项目的工程方面。诸如数据收集、存储、预处理、特征工程,以及模型的测试和调试、模型部署到生产环境中以及从生产环境中退出、运行时和投入生产后的维护等问题,常常被排除在机器学习书籍的范围之外。

本书意在这些方面提供可供参考的实践与想法。

我假设本书的读者了解机器学习的基础知识,并且在给定一个正确格式化的数据集时,有能力使用最喜欢的编程语言或机器学习库来建立一个模型。如果你对机器学习算法应用于数据感到不太明白,不太清楚逻辑斯谛回归、支持向量机和随机森林之间的区别,我建议你从《机器学习精讲》[2]The Hundred-Page Machine Learning Book)开始学习,然后再转向本书。

本书的目标读者是倾向于机器学习工程角色的数据分析师、希望让工作更有条理的机器学习工程师、机器学习工程专业的学生,以及正好要处理一些模型(由数据分析师和机器学习工程师提供)的软件架构师。

本书是对机器学习工程实践和设计模式的全面回顾。我建议你从头到尾阅读它。不过,你可以按照任意顺序阅读各章,因为它们涵盖了机器学习项目生命周期的不同方面,没有直接的依赖关系。

现在你已经准备好了。祝你阅读愉快!

Andriy Burkov

[1] “2020 state of enterprise machine learning”, Algorithmia, 2019.

[2] 《机器学习精讲》是本书作者的另一本介绍机器学习的图书,由人民邮电出版社于2020年引进出版,ISBN 是978-7-115-51853-8。——编辑注


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可,如下图所示。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区投稿(直接访问www.epubit.com/contribute即可)。

如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发送给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社几十年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。

异步社区

微信服务号


虽然本书的读者应该对机器学习有基本的了解,但从定义开始还是很重要的,这样才能保证我们对全书所使用的术语有一致的理解。

在本章中我将复述《机器学习精讲》(The Hundred-Page Machine Learning Book)第2章中的一些定义,同时给出几个新的定义。如果你读过我的第一本书,本章的某些部分可能看起来很熟悉。

读完这一章,我们将以同样的方式理解监督学习和无监督学习等概念。我们会对数据术语达成一致,比如直接和间接使用的数据、原始数据和规整数据、训练数据和留出数据。

我们将知道什么时候使用机器学习,什么时候不用,以及机器学习的各种形式,如基于模型和基于实例、深度和浅层、分类和回归,等等。

最后,我们将定义机器学习工程的范围,并介绍机器学习项目的生命周期。

我们先来说明一下基本的数学符号,并定义一下术语和概念,本书中会经常用到它们。

标量(scalar)是一个简单的数值,如15或−3.25。取标量值的变量或常量用斜体字母表示,如

向量(vector)是一个有序的标量值列表,这些值称为属性。我们用黑斜体来表示向量,例如。向量可以用可视化的方式表示为箭头,指向某种方向,以及多维空间中的点。图1.1展示了3个二维向量,。我们将向量的一个属性表示为一个带索引的斜体值,比如。索引表示一个向量的特定维度(dimension),即属性在列表中的位置。例如,图1.1中红色所示的向量中,

图1.1 三个向量分别展示为方向和点

这个符号不应该与幂运算符混淆,比如中的2(平方)或中的3(立方)。如果想将幂运算符(比如平方)应用于一个向量的索引属性,我们可以这样写:

一个变量可以有两个或更多的索引,像这样,或像这样。例如,在神经网络中,第层中单元的输入特征表示为

矩阵(matrix)是一个以行和列排列的矩形数字阵列。下面是一个2行3列的矩阵的例子:

矩阵用黑斜体大写字母表示,如。从上面矩阵的例子中可以注意到,矩阵可以看作由向量组成的规则结构。事实上,上面矩阵的列是图1.1所示的向量

集合(set)是唯一元素的无序集。我们把一个集合表示为一个手写体大写字母,例如。一个数集可以是有限的(包括固定数量的值)。在这种情况下,用花括号来表示,例如,{1, 3, 18, 23, 235}或。另外,一个集合可以是无限的,包括某个区间的所有值。如果一个集合包括之间的所有值,包括,那么这个集合用方括号表示为。如果集合不包括值,这样的集合用圆括号来表示:。例如,集合[0, 1]包含了0、0.000 1、0.25、0.784、0.999 5和1.0等值。有一个特殊的集合表示为,包括从负无穷到正无穷的所有实数。

当一个元素属于一个集合时,可以写成。作为两个集合交集(intersection),我们可以得到一个新的集合。在这种情况下,我们写为。例如,{1, 3, 5, 8}∩{1, 8, 4}得到新集合{1, 8}。

作为两个集合并集(union),我们可以得到一个新的集合。在这种情况下,我们写为。例如{1, 3, 5, 8}∪{1, 8, 4}得到新的集合{1, 3, 5, 8, 4}。

记号||表示集合的大小,也就是它所包含的元素数量。

对集合或对向量的属性求和是这样表示的:

的意思是“定义为”。

向量欧氏范数(Euclidean norm),用表示,表示向量的“大小”或“长度”。通过计算得到。

两个向量之间的距离由欧氏距离(Euclidean distance)给出:

机器学习(machine learning)是计算机科学的一个子领域,它关注的是建立一些算法,这些算法想发挥作用,就要依靠一组现象的例子。这些例子可以来自自然界,也可以由人类手工制作,或由其他算法生成。

机器学习也可以定义为通过以下方式解决实际问题的过程:

(1)收集数据集;

(2)根据该数据集,通过算法训练一个统计模型(statistical model)

该统计模型被假定为以某种方式来解决实际问题。在不引起误会的情况下,我交替使用“学习”和“机器学习”这两个术语。出于同样的原因,我常用“模型”来指一个统计模型。

学习可以是监督式、半监督式、无监督式和强化式。

监督学习(supervised learning)中,数据分析师使用的是有标签样本(labeled example)集合以内的每个元素称为特征向量(feature vector)。在计算机科学中,向量是一个一维数组。而一维数组则是一个有序的、有索引的数值序列。该数值序列的长度称为该向量的维度(dimensionality)

特征向量是一个向量,在这个向量中,从1到的每个维度都包含一个描述该样本的值。每一个这样的值都被称为特征(feature),表示为。例如,如果我们收集的每个样本代表一个人,那么第一个特征可以包含身高(cm),第二个特征可以包含体重(kg),可以包含性别,以此类推。对于数据集中的所有样本,特征向量中位置的特征总是包含相同的信息。这意味着,如果在某个样本中包含了以kg为单位的体重,那么在每个样本也包含以kg为单位的体重,对于从1到的所有都是这样的。标签(label)可以是有限类(class)集{1, 2, … ,}的一个元素,或一个实数,或一个更复杂的结构,如一个向量、一个矩阵、一个树或一个图。除非另有说明,在本书中,是有限类集中的一个元素或一个实数[1]。你可以将类看作一个样本所属的类别。

例如,如果样本是电子邮件信息,问题是垃圾邮件检测,那么你有两个类:垃圾邮件和非垃圾邮件。在监督学习中,预测一个类的问题称为分类(classification),而预测一个实数的问题称为回归(regression)。要由监督模型预测的值称为目标(target)。回归的例子:根据员工的工作经验和知识预测其工资。分类的例子:医生将一个病人的特征输入一个软件应用程序中,该程序返回诊断结果。

分类和回归的区别如图1.2所示。在分类中,学习算法寻找一条线(或者更一般地说,一个超曲面),将不同类别的样本彼此分开。而在回归中,学习算法寻找的是紧密跟随训练样本的线或超曲面。

图1.2 分类和回归的区别

监督学习算法supervised learning algorithm)的目标是利用一个数据集来产生一个模型,它以一个特征向量作为输入,并输出信息,该信息允许推导出这个特征向量的标签。例如,使用患者数据集创建的模型可以将描述患者的特征向量作为输入,并输出患者患癌症的概率。

即使模型是典型的数学函数,在思考模型对输入所做的事时,也可以方便地认为模型“看”到输入中一些特征的值,并根据类似样本的经验,输出一个值。这个输出值是一个数字或一个类,与过去在特征值相似的样本中看到的标签“最相似”。这看起来很简单,但决策树模型和-最近邻算法的工作原理几乎就是这样的。

无监督学习(unsupervised learning)中,数据集是无标签样本(unlabeled example)的集合。同样,是一个特征向量,无监督学习算法unsupervised learning algorithm)的目标是创建一个模型,它以一个特征向量作为输入,并将其转化为另一个向量,或转化为一个可用于解决实际问题的值。例如,在聚类(clustering)中,模型返回数据集中每个特征向量的聚类ID。对于在图像或文本文档等大型对象集合中寻找相似对象的群体,聚类非常有用。例如,通过使用聚类,分析师可以从一个大型的样本集合中,抽取足够有代表性但又很小的无标签样本子集进行人工标记:从每个聚类中抽取几个样本,而不是直接从大型集合中抽样(这样有可能只抽取到彼此非常相似的样本)。

降维(dimensionality reduction)中,模型的输出是一个比输入维度更小的特征向量。例如,科学家有一个太复杂而无法可视化的特征向量(它有三个以上的维度)。降维模型可以将该特征向量转化为只有两个或三个维度的新特征向量(通过在一定程度上保留信息)。这个新的特征向量可以绘制在一张图上。

离群值检测(outlier detection)中,输出是一个实数,表示输入的特征向量与数据集中的一个“典型”样本有多大的不同。对于解决网络入侵问题(通过检测与“正常”流量中的典型数据包不同的异常网络数据包)或检测新奇性(如文档与集合中现有文档不同),离群值检测非常有用。

半监督学习(semi-supervised learning)中,数据集包含有标签样本和无标签样本。通常情况下,无标签样本的数量远高于有标签样本的数量。半监督学习算法(semi-supervised learning algorithm)的目标和监督学习算法的目标是一样的。这里的希望是,通过使用许多无标签样本,学习算法可以找到(可以说是“产生”或“计算”)一个更好的模型。

强化学习(reinforcement learning)是机器学习的一个子领域,在这个子领域中,机器(称为代理)“生活”在一个环境中,并且能够将该环境的状态感知为特征向量。机器可以在非终结状态下执行动作。不同的行动带来不同的回报,也可以将机器移动到该环境的另一种状态。强化学习算法的一个共同目标是学习一个最优策略(policy)

一个最优策略是一个函数(类似于监督学习中的模型),它以一个状态的特征向量作为输入,并输出一个在该状态下执行的最优动作。如果该行动能使预期的平均长期报酬最大化,那么它是最优的。

强化学习解决一个特定问题,其中决策是顺序的、目标是长期的,如游戏、机器人、资源管理或物流。

在本书中,为了简单起见,大部分解释仅限于监督学习。然而,书中介绍的所有材料都适用于其他类型的机器学习。

现在我们来介绍一下常用的数据术语(如直接和间接使用的数据、原始数据和规整数据、训练数据和留出数据)以及与机器学习相关的术语(如基线、超参数、流水线,等等)。

在机器学习项目中,你使用的数据可以直接(directly)间接(indirectly)地用于构成样本

设想我们建立一个命名实体识别系统。模型的输入是一个单词序列,输出是与输入序列相同长度的标签序列 [2]。为了让数据能被机器学习算法读取,我们必须将每个自然语言单词转化为一个机器可读的属性数组,我们称之为特征向量[3]。特征向量中的一些特征可能包含将该特定单词与字典中其他单词区分开来的信息。其他特征可以包含该特定序列中单词的附加属性,如其形状(小写、大写、首字母大写等)。或者可以是二值属性,表示这个单词是不是某个人名的第一个词,或某个地点或组织名称的最后一个词。为了创建后面这些二值特征,我们可能会决定使用某些字典、查找表、地名词典或其他机器学习模型对单词进行预测。

你可能已经注意到,单词序列的集合是直接用来形成训练样本的数据,而字典、查找表和地名词典中包含的数据是间接使用的:我们可以用它来扩展特征向量,增加额外的特征,但我们不能用它来创建新的特征向量。

正如刚才讨论的那样,直接使用的数据是一个实体集合,构成了数据集的基础。该集合中的每一个实体都可以转化为一个训练样本。原始数据(raw data)是实体的自然形式的集合,它们并不总是可以直接用于机器学习。例如,一个Word文档或一个JPEG文件都是原始数据的片段,它们不能直接被机器学习算法使用[4]

要想在机器学习中使用,数据有一个必要(但不充分)的条件,即规整。规整数据(tidy data)可以看作一个电子表格,其中每一行代表一个样本,列代表一个样本的各种属性(attribute),如图1.3所示。有时,原始数据也可以是规整的,例如,以电子表格的形式提供给你。然而,在实际工作中,为了从原始数据中获得规整数据,数据分析师通常会借助于一个过程,即所谓的特征工程(feature engineering)。该过程应用于直接数据和可选的间接数据,其目标是将每个原始样本转化为特征向量。第4章用一整章讨论特征工程。

图1.3 规整数据——样本为行,属性为列

需要注意的是,对于某些任务,学习算法使用的样本可以具有向量序列、矩阵或矩阵序列的形式。对于这类算法,数据规整的概念也有类似的定义:你只需要将“电子表格中固定宽度的一行”替换为固定宽度和高度的矩阵,或将矩阵泛化为更高的维度,称为张量(tensor)

“规整数据”这个术语由Hadley Wickham在他的同名论文中创造[5]

正如本节开始时提到的,数据可以是规整的,但仍然不能被特定的机器学习算法使用。事实上,大多数机器学习算法只接受数字特征向量集合形式的训练数据。考虑图1.3所示的数据,属性“区域”是分类项,而不是数值项。决策树学习算法可以处理属性的分类值,但大多数学习算法不能。4.2节将介绍如何将分类属性转化为数值特征。

需要注意的是,在机器学习的学术文献中,“样本”这个词通常指的是一个规整的数据样本,并带有一个可选的指定标签。然而,在第3章考虑的数据收集和标签阶段,样本仍然可以是原始形式:图像、文本或电子表格中带有分类属性的行。在本书中,如果需要强调两者的区别,会用原始样本(raw example)来表示一段数据还没有转化为特征向量,否则假设样本具有特征向量的形式。

在实际工作中,数据分析师要处理三组不同的样本集:

一旦以样本集合的形式得到数据,在机器学习项目中要做的第一件事就是对样本进行洗牌,并将数据集分成三个不同的集:训练集(training)验证集(validation)测试集(test)。训练集通常是最大的一个,学习算法使用训练集产生模型。验证集和测试集的规模大致相同,比训练集的规模小很多。学习算法不允许使用验证集和测试集的样本来训练模型。所以这两个集也称为留出集(holdout set)

有三个集而不是一个集的原因很简单:训练一个模型时,我们不希望模型只是在预测学习算法已经见过的样本的标签上做得好。一个意义不大的算法可以简单地记住所有的训练样本,然后用记忆来“预测”它们的标签。如果要求它预测训练样本的标签,就不会出错。但这样的算法在实践中是没有用的。我们真正想要的是一个模型,它擅长预测学习算法没有看到的样本。换言之,我们希望它在一个留出集上有良好的表现 [7]

我们需要两个留出集,而不是一个,这是因为使用验证集可以:①选择学习算法;②为该学习算法找到最佳配置值〔称为超参数(hyperparameter)〕。在交付给客户或投入生产之前,使用测试集来评估模型。这就是要确保验证集或测试集的任何信息都不会暴露给学习算法的原因。否则,验证和测试结果很可能会过于乐观。这确实可能会因为数据泄露(data leakage)而发生,3.2.8节和后续章节中会介绍这个重要现象。

在机器学习中,基线(baseline)是解决一个问题的简单算法,通常它是基于启发式、简单的摘要统计、随机化或非常基本的机器学习算法。例如,如果问题是分类,你可以选择一个基线分类器并测量它的表现。这个基线表现将成为你比较所有未来模型的依据(通常,该模型通过更复杂的方法建立)。

机器学习流水线(pipeline)是对数据集从初始状态到模型的一系列操作。

一个流水线可以包括数据分割、缺失数据填补、特征提取、数据增强、类不平衡降低、降维和模型训练等阶段。

在生产环境中部署一个模型,通常会部署整个流水线。此外,在对超参数进行调整时,通常会对整个流水线进行优化。

超参数是机器学习算法或流水线的输入,它们影响模型的表现。它们不属于训练数据,不能从训练数据中学习。例如,决策树学习算法中树的最大深度、支持向量机中的误分类罚分、-最近邻算法中的、降维中的目标维度,以及缺失数据填补技术的选择都是超参数的例子。

参数(parameter)则是定义学习算法所训练的模型的变量。参数是由学习算法根据训练数据直接修改的。学习的目标是找到这样的参数值,使模型在一定意义上达到最优。参数的例子有线性回归方程中的。在这个方程中,是模型的输入,是它的输出(预测)。

分类是一个自动给一个无标签样本分配一个标签的问题。垃圾邮件检测是分类的典型例子。

在机器学习中,分类问题是通过分类学习算法(classification learning algorithm)来解决的,它以一个有标签样本(labeled example)集合作为输入,并产生一个模型(model),这个模型可以以一个无标签样本作为输入,并直接输出一个标签或输出一个数,分析师可以用它来推断标签。这种数字的一个例子是输入数据元素具有特定标签的概率。

在分类问题中,一个标签是有限集的一个成员。如果类集的大小是2(“生病的”/“健康的”,“垃圾邮件”/“非垃圾邮件”),我们探讨的就是二分类(binary classification),在某些资料中也称为binomial多类分类multiclass classification,也称为multinomial)是有三个或更多类的分类问题[8]

虽然一些学习算法默认允许两个以上的类,但其他算法的本质是二分类算法。通过一些策略可以将二分类学习算法变成多分类算法。6.5节中谈到其中的一种,即一对其余(one-versus-rest)

回归是给定一个无标签样本,预测一个实数值的问题。根据房子的特征(如面积、卧室数、位置等)来估计房价,这是回归的一个著名例子。

回归问题是通过回归学习算法(regression learning algorithm)来解决的,该算法以一个有标签样本集合作为输入,并产生一个模型,该模型以一个无标签样本作为输入,并输出一个目标值。

大多数监督学习算法都是基于模型(model-based)的。一个典型的模型是支持向量机(Support Vector Machine,SVM)。基于模型的学习算法使用训练数据来创建一个模型,其参数是从训练数据中学习的。在SVM中,两个参数是(一个向量)和(一个实数)。模型训练完成后,可以将它们保存在磁盘上,而丢弃训练数据。

基于实例的学习算法instance-based learning algorithm)使用整个数据集作为模型。实践中经常使用的一种基于实例的算法是-最近邻(-Nearest Neighbors,NN)。在分类中,为了预测一个输入样本的标签,NN算法会在特征向量的空间中寻找输入样本的近邻,并输出在这个近邻中最常看到的标签。

浅层学习(shallow learning)算法直接从训练样本的特征中学习模型的参数。大多数机器学习算法都是浅层的。著名的例外情况是神经网络(neural network)学习算法,特别是那些在输入和输出之间建立超过一层(layer)的神经网络工程。这种神经网络称为深度神经网络(deep neural network)。在深度神经网络学习中(或者说深度学习),与浅层学习相比,大多数模型参数不直接从训练样本的特征中学习,而是从前几层的输出中学习。

将机器学习算法应用于一个数据集以获得一个模型,就是我们所说的模型训练(model training),或者说是训练。

将训练好的模型应用到一个输入样本(或者有时是一个样本序列)上,以获得一个预测(或多个预测),或以某种方式转换一个输入时,我们称为评分(scoring)

机器学习是解决实际问题的强大工具。然而,像任何工具一样,它应该在正确的背景下使用。试图用机器学习解决所有问题是不对的。

你应该考虑在以下情况中使用机器学习。

如果问题非常复杂或非常庞大,无法写出所有规则来解决,而一个部分解决方案可行且有趣,那么你可以尝试用机器学习来解决这个问题。

垃圾邮件检测就是一个例子:不可能写出实现这种逻辑的代码——既能有效地检测垃圾邮件,又能让真正的邮件到达收件箱。要考虑的因素实在太多。例如你将垃圾邮件过滤器编程为拒绝所有不在你的联系人中的发件人的邮件,就有可能失去在会议上拿到你的名片的人的邮件。如果你对包含与你工作相关的特定关键词的信息进行例外处理,很可能会错过你孩子的老师的邮件,等等。

如果你还是决定直接编程解决这个复杂的问题,随着时间推移,你的编程代码中会有很多条件以及这些条件的例外,以致维护这段代码最终会变得不可行。在这种情况下,在 “垃圾邮件”/“非垃圾邮件”的例子上训练一个分类器似乎是符合逻辑的,也是唯一可行的选择。

编写代码解决问题的另一个困难在于,人类很难处理基于参数过多的输入的预测问题。如果这些参数以未知的方式相关,则尤其如此。例如,以预测借款人是否会还款的问题为例。数百个数字代表着每个借款人的年龄、工资、账户余额、过去还款频率、是否结婚、孩子数量、汽车品牌和年份、抵押贷款余额等信息。这些数字中的一些可能对做出决定很重要,一些可能单独考虑不那么重要,但如果与其他一些数字结合起来考虑,就会变得更加重要。

编写能做出这种决定的代码是很困难的,因为即使是专家,也不清楚如何以最佳方式将描述一个人的所有属性组合成一个预测。

有些问题可能会随着时间的推移而不断变化,因此必须定期更新编程代码。这就导致了软件工程师在处理问题时的挫折感,引入错误的机会增加,“以前的”和“新的”逻辑难以兼容,以及测试和部署更新的解决方案的巨大开销。

例如,你有一个从网页集合中抓取特定数据元素的任务。对于该集合中的每个网页,你写了一组固定的数据提取规则,具体形式是“从<body>中提取第三个<p>元素,然后从<p>的第二个<div>中提取数据”。如果网站所有者改变了网页的设计结构,你抓取的数据可能最终会出现在第二个或第四个<p>元素中,使得你的提取规则出现错误。如果你抓取的网页集合很大(成千上万个URL),每天都会有规则报错,你将无休止地修正这些规则。不用说,很少有软件工程师喜欢每天做这样的工作。

今天,很难想象有人在不使用机器学习的情况下试图解决语音、图像和视频识别等感知问题(perceptive problem)。考虑一幅图像。它由数百万个像素表示。每个像素由三个数字给出——红、绿、蓝通道的强度。过去,工程师们试图通过将手工制作的“滤镜”应用于像素的方块上来解决图像识别(检测图像上的内容)的问题。例如,如果一个过滤器被设计为“检测”草,将它应用于许多像素块时产生了一个高值,而另一个过滤器被设计为检测棕色毛皮,对许多像素块也返回了高值,那么我们可以说,图像很有可能代表了田野里的一头牛(这里为举例简化问题)。

如今,利用机器学习模型,比如神经网络,可以有效解决感知问题。第6章将探讨神经网络训练的问题。

如果我们需要对某些现象进行预测,而这些现象在科学上并没有得到很好的研究,但它的样本是可以观察到的,那么机器学习可能是一个合适的选择(在某些情况下,也是唯一可用的选择)。例如,机器学习可以基于患者的基因和感官数据来生成个性化的心理健康用药方案。医生可能不一定能够解释这些数据,从而提出一个可行的建议,而机器可以通过分析数千名患者的数据,发现数据中的模式,并预测哪种方案对特定患者的帮助更大。

另一个可观察但未被研究的现象的例子是复杂计算系统或网络的日志。这种日志是由多个独立或相互依赖的过程产生的。对人类来说,如果没有每个过程的模型及其相互依存关系,很难仅仅根据日志对系统的未来状态做出预测。如果历史日志记录的样本数量足够多(通常情况下是这样的),机器可以学习隐藏在日志中的模式,并能够在不了解每个过程的情况下进行预测。

根据观察到的行为对人进行预测是很难的。在这个问题上,我们显然不可能拥有一个人的大脑模型,但我们有现成的样本来表达这个人的想法(以在线帖子、评论和其他活动的形式)。仅仅根据这些表达方式,部署在社交网络中的机器学习模型就可以推荐内容或其他要联系的人。

机器学习特别适用于解决那些可以制定一个简单目标的问题,比如是或否的决定,或一个单一的数字。相比之下,你不能使用机器学习来建立一个一般的视频游戏模型(如马里奥),或文字处理软件(如Word)。这是因为要做的决定太多:显示什么,在什么地方和什么时候,对用户的输入应该产生什么反应,向硬盘写什么或从硬盘读什么,等等,得到能说明所有(甚至大部分)这些决定的样本实际上是不可行的。

机器学习中成本的三个主要来源包括:

资源训练模型的成本包括人力,在某些情况下,还包括训练深度模型所需的昂贵的硬件。模型维护包括持续监测模型,以及收集额外的数据以维持模型更新。

很多问题是无法用机器学习解决的,很难对所有的问题进行定性。这里我们只考虑几个提示。

在以下情况中,你可能不应该使用机器学习。

机器学习工程(MLE)是利用机器学习的科学原理、工具和技术以及传统的软件工程,来设计和构建复杂的计算系统。MLE包括从数据收集到模型训练,再到将模型提供给产品或客户使用的所有阶段。

通常情况下,数据分析师 [9]关注的是理解业务问题,建立模型来解决问题,并在有限的开发环境中评估模型。而机器学习工程师则关注从不同系统和地点取得数据,并对数据进行预处理,编程计算特征,训练一个有效的模型,使它能在生产环境中运行,与其他生产流程共存,稳定、可维护,并能被不同类型的用户以不同的使用方式轻松访问。

换言之,MLE包括让机器学习算法作为有效生产系统的一部分来实施的所有活动。

在实践中,机器学习工程师可能会受雇完成这样的活动,比如将数据分析师的代码从运行速度相当慢的R和Python [10]改写成更高效的Java或C++,扩展这些代码并使其更健壮,将代码打包成易于部署的版本包,优化机器学习算法,以确保它生成的模型与组织的生产环境兼容并正确运行。

在许多组织中,数据分析师执行一些MLE任务,如数据收集、转换和特征工程等。另外,机器学习工程师通常执行一些数据分析任务,包括学习算法选择、超参数调整和模型评估等。

在机器学习项目中工作与在典型的软件工程项目中工作是不同的。与传统软件不同的是,传统软件中的程序行为通常是具有确定性的,而机器学习应用包含的模型的行为可能会随着时间的推移而自然退化,或者它们可能会开始出现异常行为。模型的这种异常行为可以由各种原因解释,包括输入数据的根本变化或更新的特征提取器现在返回不同的值分布或不同类型的值。人们常说,机器学习系统“无声无息地失效”。一个机器学习工程师必须有能力防止这种失效,或者在无法完全防止时,知道如何在失效发生时进行检测和处理。

就一个机器学习项目而言首先要了解业务目标。通常,业务分析师与客户 [11]和数据分析师合作,将业务问题转化为工程项目。工程项目可能有也可能没有机器学习的部分。当然,在本书中,我们探讨的是一些机器学习参与的工程项目。

一旦确定工程项目,这就是机器学习工程范围的开始。在更广泛的工程项目范围中,机器学习首先必须有一个明确的目标(goal)。机器学习的目标是一份规格说明,指定统计模型作为输入接收什么,作为输出生成什么,以及模型可接受(或不可接受)行为。

机器学习的目标不一定与业务目标相同。业务目标是组织想要实现的目标。例如,谷歌与Gmail的业务目标可以是让Gmail成为世界上使用最多的电子邮件服务。谷歌可能会创建多个机器学习工程项目来实现这个业务目标。其中一个机器学习工程的目标可以是区分重要邮件和推销邮件,准确率在90%以上。

总的来说,如图1.4所示,机器学习项目的生命周期包括:①目标定义;②数据收集和准备;③特征工程;④模型训练;⑤模型评估;⑥模型部署;⑦模型服务;⑧模型监测;⑨模型维护。

在图1.4中,机器学习工程的范围(也是本书的范围)由蓝色区域圈定。实线箭头表示项目阶段的典型流程。虚线箭头表示在某些阶段可以决定回到流程中收集更多的数据或收集不同的数据,并修改特征(通过停用其中的一些特征并设计新特征)。

图1.4 机器学习项目生命周期

上面提到的每一个阶段都会在本书的某一章中进行探讨。第2章将讨论一下如何确定机器学习项目的优先级并定义项目的目标,以及构建一个机器学习团队。

基于模型的机器学习算法以一组训练样本作为输入,并输出一个模型。基于实例的机器学习算法将整个训练数据集作为模型。训练数据会暴露给机器学习算法,则不会留出数据。

监督学习算法建立一个模型,它需要一个特征向量,并输出一个关于该特征向量的预测。无监督学习算法建立一个模型,以一个特征向量作为输入,并将其转化为有用的东西。

分类是针对一个输入样本预测有限类集中的一个类的问题,而回归则是预测一个数值目标的问题。

数据可以直接使用,也可以间接使用。直接使用的数据是形成样本数据集的基础。间接使用的数据是用来丰富这些样本数据集的。

机器学习的数据必须是规整的。一个规整的数据集可以看作一个电子表格,每一行都是一个样本,每一列都是样本的一个属性。除了规整之外,大多数机器学习算法需要的是数值数据,而不是分类数据。特征工程是将数据转化为机器学习算法可以使用的形式的过程。

为了确保模型比简单的启发式方法更好,基线是必不可少的。

在实践中,机器学习是以流水线的形式实现的,它包含了数据转换的链式阶段,从数据分割到缺失数据填补,到类不平衡和降维,再到模型训练。整个流水线的超参数通常是优化过的,整个流水线可以部署并用于预测。

模型的参数由学习算法根据训练数据进行优化。超参数的值不能由学习算法学习,而要通过使用验证数据集进行调整。测试集仅用于评估模型的表现,并向客户或产品所有者报告。

浅层学习算法训练的是一个直接从输入特征进行预测的模型。深度学习算法训练的是一个分层模型,其中每一层都通过将前一层的输出作为输入来产生输出。

你应该考虑使用机器学习来解决业务问题的情况包括:问题太复杂,不适合编写代码;问题是不断变化的;它是一个感知问题;它是一种未曾研究过的现象;问题的目标简单;它有成本效益。

可能不应该使用机器学习的情况包括:需要可解释性;错误无法容忍;传统的软件工程是成本较低的选择;所有的输入和输出都可以被枚举并保存在数据库中;数据难以获得或者获取成本太昂贵。

MLE是利用机器学习和传统软件工程的科学原理、工具和技术来设计和构建复杂的计算系统。MLE包括从数据收集,到模型训练,到使模型可供产品或消费者使用的所有阶段。

一个ML项目的生命周期包括:①目标定义;②数据收集和准备;③特征工程;④模型训练;⑤模型评估;⑥模型部署;⑦模型服务;⑧模型监测;⑨模型维护。

每个阶段都将在本书的某一章中探讨。

[1] 实数是指能沿一条线表示距离的量。例如:0, −256.34, 1 000, 1 000.2。

[2] 标签可以是来自集合的值,例如{“位置”,“组织”,“人员”,“其他”}。

[3] 术语“属性”(attribute)和“特征”(feature)经常交替使用。在本书中,使用术语“属性”来描述一个样本的特定属性,而术语“特征”指的是机器学习算法使用的特征向量xj位置的值x(j)

[4] 术语“非结构化数据”通常用于指定包含类型未正式定义的信息的数据元素。非结构化数据的例子有照片、图像、视频、文本信息、社交媒体帖子、PDF文件、文本文档和电子邮件等。术语“半结构化数据”是指数据元素,其结构有助于推导出这些数据元素中编码的一些信息的类型。半结构化数据的例子包括日志文件、以逗号和标签分隔的文本文件以及JSON和XML格式的文档等。

[5] Wickham, Hadley. “Tidy data.” Journal of Statistical Software 59.10 (2014): 1-23.

[6] 在一些文献中,验证集也可以称为“开发集”。有时,当有标签样本稀少时,分析师可以决定在没有验证集的情况下工作,5.6.5节将详细介绍。

[7] 准确地说,我们希望模型在数据所属的统计分布的大多数随机样本上表现良好。我们假设,如果模型在从数据的未知分布中随机抽取的留出集上有良好的表现,那么它很有可能在数据的其他随机样本上表现良好。

[8] 虽然每个样本还是有一个标签。

[9] 大约从2013年开始,数据科学家已经成为一个热门的工作头衔。遗憾的是,公司和专家对这个词的定义并没有达成一致。相反,这里使用“数据分析师”一词,指的是能够将数字或统计分析应用于准备分析的数据的人。

[10] Python中的很多科学模块确实是用运行速度快的C/C++实现的,但是数据分析师自己开发的Python代码的运行速度还是会很慢。

[11] 如果机器学习项目支持的是组织开发和销售的产品,那么业务分析师会和产品所有者一起工作。


相关图书

ChatGPT原理与应用开发
ChatGPT原理与应用开发
动手学机器学习
动手学机器学习
机器学习与数据挖掘
机器学习与数据挖掘
机器学习公式详解 第2版
机器学习公式详解 第2版
自然语言处理迁移学习实战
自然语言处理迁移学习实战
AI医学图像处理(基于Python语言的Dragonfly)
AI医学图像处理(基于Python语言的Dragonfly)

相关文章

相关课程