结论

到 2020 年,机器学习(machine learning)已经成为解决商业问题的成熟且流行的工具。过去只有少数组织才能拥有、被其他组织视为"魔法"的能力,如今一个典型的组织也能创建和使用它。

得益于开源代码、众包、唾手可得的书籍、在线课程以及公开可用的数据集,许多科学家、工程师甚至家庭爱好者现在都可以训练机器学习模型。如果你运气好,你的问题或许只需写几行代码就能解决,正如许多在线教程所演示的那样。

然而,在一个机器学习项目中,很多环节都可能出错。其中大多数与技术的成熟度无关,也与分析师对机器学习算法的理解程度无关。

机器学习教材、在线教程和课程都致力于解释机器学习算法的工作原理以及如何将它们应用于数据集。而你的成功很可能取决于其他因素。你能获得哪些数据、能否获得足够的数据、如何为学习准备数据、你设计了哪些特征、你的解决方案是否可扩展、可维护、不会被攻击者操纵、不会犯下代价高昂的错误——这些因素对于一个应用型机器学习项目来说重要得多。

然而,尽管这些方面至关重要,大多数现代机器学习书籍和课程却常常把它们留给读者自学。有些只提供了部分覆盖,且仅仅针对某个具体示例问题的应用。

这是知识上的一个重大空白,而本书正是我试图填补这一空白的尝试。

10.1 要点

读完这本书,我希望读者带走什么?

首先,是深刻理解所有机器学习项目都是独一无二的。不存在一条放之四海而皆准的配方。大多数时候,最大的挑战必须在输入 from sklearn.linear_model import LogisticRegression 之前解决:你必须定义目标、选择基线(baseline)、收集相关数据、用高质量的标签为其标注,并将带标签的数据转换为训练集、验证集和测试集。问题的其余部分则在输入 model.fit(X,y) 之后解决,通过应用错误分析、评估模型、验证它能解决问题并且优于现有解决方案。

经验丰富的分析师或机器学习工程师明白,并非所有问题——无论是商业问题还是其他问题——都能用机器学习解决。事实上,许多问题用启发式方法(heuristic)、数据库查找或传统软件开发就能更轻松地解决。如果系统的每一个动作、决策或行为都必须能够被解释,那么你很可能不应该使用机器学习。除极少数例外,机器学习模型都是黑盒(blackbox)。它们不会告诉你为什么做出了这样的预测,为什么今天没有预测出昨天预测的结果,也不知道如何修复这些问题。

此外,除非你能找到一个公开数据集和一个开源解决方案,恰好提供你所需的一切,否则机器学习并非实现最短上市时间(time to market)的正确方法。有时,训练和维护模型所需的数据太难获取,甚至根本无法获取。

另一方面,训练数据也可以通过过采样(oversampling)和数据增强(data augmentation)来合成生成。这些技术常在数据呈现不平衡时使用。

在开始收集数据之前,先问自己这些问题:你的数据是否可获取、规模足够、可用、可理解、可靠?好的数据包含足够的信息用于建模,对生产用例有良好的覆盖且偏见很少,规模足够大以允许泛化,并且不是模型本身的产物。

还是说,你的数据伴随着高成本、偏见、不平衡、属性缺失和/或标签噪声?数据质量必须在用于训练之前得到保证。

机器学习项目生命周期由以下阶段组成:目标定义、数据收集与准备、特征工程、模型训练、评估、部署、服务、监控和维护。在大多数阶段,都可能出现数据泄漏(data leakage)。分析师必须能够预见并防止它。

在数据准备之后,特征工程是第二重要的阶段。对于某些数据,例如自然语言文本,可以使用词袋(bag-of-words)等技术批量生成特征。然而,最有用的特征往往是分析师凭借领域知识手工打造的。把自己放到"模型的立场"上思考。

好的特征具有较高的预测能力,可以快速计算,可靠且不相关。它们是单一的,易于理解和维护。特征提取代码是机器学习系统最重要的组成部分之一。它必须经过广泛而系统的测试。

最佳实践包括:对特征进行缩放,将其存储并记录在模式文件(schema file)或特征存储(feature store)中,并保持代码、模型和训练数据的同步。

你可以通过离散化现有特征、对训练样本进行聚类,以及对现有特征应用简单变换或将它们两两组合,来合成新特征。

在开始构建模型之前,确保数据符合模式,然后将其分成三个集合:训练集、验证集和测试集。定义一个可达到的性能水平,并选择一个性能指标。它应该把模型性能归结为单个数字。

大多数机器学习算法、模型和流水线都有超参数(hyperparameter)。它们会显著影响学习结果。然而,这些参数并非从数据中学习而来。分析师在超参数调优(hyperparameter tuning)过程中设置它们的值。特别是,调整这些值可以控制两个重要的权衡:精确率-召回率(precision-recall)权衡和偏差-方差(bias-variance)权衡。通过改变模型的复杂度,你可以达到所谓的"解区"(zone of solutions),即偏差和方差都相对较低的状态。优化性能指标的解决方案通常可以在解区附近找到。网格搜索(grid search)是最简单、使用最广泛的超参数调优技术。

与其从头训练一个深度模型,不如从一个预训练模型开始,这往往很有用。使用预训练模型来构建你自己的模型称为迁移学习(transfer learning)。深度模型支持迁移学习这一事实,是它最重要的特性之一。

训练深度模型可能很棘手。从数据准备到定义神经网络拓扑结构,实现错误可能出现在许多环节。建议从小处着手。例如,使用高层库实现一个简单模型。将默认超参数值应用于一个适合内存的小型归一化数据集。一旦你有了第一个简单的模型架构和数据集,暂时进一步缩小训练数据集,缩小到一个迷你批次(minibatch)的大小。然后开始训练。确保你的简单模型能够过拟合这个训练迷你批次。

你的机器学习系统的性能可能受益于模型堆叠(model stacking)。理想情况下,用于堆叠的基础模型来自性质不同的算法或模型,例如随机森林(random forest)、梯度提升(gradient boosting)、支持向量机(support vector machine)和深度模型。许多现实世界的生产系统都基于堆叠模型。

机器学习模型的错误既可以是均匀的,即以相同的比率适用于所有用例;也可以是集中的,即更频繁地出现在某些用例上。通过修复一个集中错误,你只需修一次,就能解决许多示例的问题。

模型性能可以通过以下简单、迭代的过程来改进:

  1. 使用目前确定的最优超参数值构建模型。
  2. 将模型应用于验证集的一小部分进行测试。
  3. 在这个小验证集上找出最常见的错误模式。
  4. 生成新特征,或添加更多训练数据,以修复观察到的错误模式。
  5. 重复上述步骤,直到不再观察到频繁出现的错误模式。

模型在部署前必须经过仔细评估,部署后也要持续评估。当模型最初训练完成时,基于历史数据进行离线模型评估。在线模型评估是指在生产环境中使用在线数据对模型进行测试和比较。两种流行的在线模型评估技术是 A/B 测试(A/B testing)和多臂老虎机(multi-armed bandit)。它们让我们能够确定新模型是否优于旧模型。

模型可以按照以下几种模式部署:静态部署(作为可安装软件包的一部分)、在用户设备或服务器上动态部署,或通过模型流式传输(model streaming)部署。此外,还可以在单次部署(single deployment)、静默部署(silent deployment)、金丝雀部署(canary deployment)和多臂老虎机等策略中进行选择。每种模式和策略都有其优缺点,应根据你的业务应用来选择。

算法效率也是模型部署的一个重要考虑因素。NumPy、SciPy 和 scikit-learn 等科学 Python 包是由经验丰富的科学家和工程师以效率为出发点构建的。它们有许多用 C 实现的方法,以实现最高效率。当你可以复用成熟流行的库或包时,避免自己编写生产代码。为了获得高效率,要选择合适的数据结构和缓存。

对于某些应用,预测速度至关重要。在这种情况下,生产代码会用编译型语言(如 Java 或 C/C++)编写。如果数据分析师用 Python 或 R 构建了模型,生产部署有几种选择:用生产环境的编译型编程语言重写代码,使用 PMML 或 PFA 等模型表示标准,或使用 MLeap 等专用执行引擎。

机器学习模型以批量(batch)或按需(on-demand)模式提供服务。按需服务时,模型通常被包装成 REST API。模型服务通常通过流式架构(streaming architecture)完成。

当软件系统暴露于现实世界时,其架构必须准备好有效应对错误、变化和人性。模型必须被持续监控。监控必须让我们能够确保模型被正确服务,且其性能保持在可接受的限度内。

记录足够的信息以在未来的分析中重现任何异常的系统行为,这一点很重要。如果模型服务于前端用户,那么在模型服务时保存用户的上下文很重要。

有些用户可能会试图滥用你的模型来实现自己的商业目标。为防止滥用,不要信任来自单个用户的数据,除非类似的数据来自多个用户。为每个用户分配信誉评分(reputation score),不要信任来自低信誉用户的数据。将用户行为分类为正常或异常,并在必要时逐步延长暂停时间或封禁某些用户。

定期通过分析用户行为和输入数据来更新模型,使其更加稳健。之后,在端到端测试集和置信度测试集上运行新模型。确保输出与之前相同,或者变化符合预期。验证新模型不会犯明显更昂贵的错误。确保错误在用户类别之间均匀分布。如果新模型对少数群体或特定地区的绝大多数用户产生负面影响,那是不受欢迎的。

∗ ∗ ∗

本书到此结束,但你的学习不会。机器学习工程是软件工程中一个相对较新的领域。得益于在线出版物和开源,我相信在未来几年内,将会出现新的最佳实践、库和框架,使数据准备、模型评估、部署、服务与监控等阶段变得更加简单或更加稳固。订阅本书配套网站 http://www.mlebook.com 上的邮件列表。你会定期收到相关链接。

请记住,与其前作《The Hundred-Page Machine Learning Book》一样,本书遵循"先读后买"(read-first, buy-later)的原则发行。这意味着你可以从配套网站下载全书全文,先阅读再购买。如果你是正在阅读这些结束语、却不记得自己付过费的 PDF 读者,请考虑购买这本书。你可以从 Amazon、Leanpub 和其他主要在线书商处购买。

10.2 下一步阅读

关于机器学习和人工智能,有许多优秀的书籍。这里我只给出几本推荐。

如果你想获得 Python 实用机器学习的动手经验,有两本书:

  • Aurélien Géron 的《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow》(第 2 版,O’Reilly Media,2019 年)
  • Sebastian Raschka 的《Python Machine Learning》(第 3 版,Packt Publishing,2019 年)

对于 R 语言,最佳选择是 Brett Lantz 的《Machine Learning with R》(Packt Publishing,2019 年)。

要更深入地理解各种机器学习算法背后的数学,我推荐:

  • Christopher Bishop 的《Pattern Recognition and Machine Learning》(Springer,2006 年)
  • Gareth James 等人的《An Introduction to Statistical Learning》(Springer,2013 年)

要对深度学习有更详细的了解,我推荐:

  • Michael Nielsen 的《Neural Networks and Deep Learning》(在线,2005 年)
  • David Foster 的《Generative Deep Learning》(O’Reilly Media,2019 年)

如果你的抱负远超机器学习,想要横扫整个人工智能领域,那么 Stuart Russell 和 Peter Norvig 的《Artificial Intelligence: A Modern Approach》(第 4 版,Pearson,2020 年),即众所周知的 AIMA,是你最好的选择。

10.3 致谢

没有志愿编辑,这本书的高质量是不可能实现的。我尤其感谢以下读者做出的系统性贡献:Alexander Sack、Ana Fotina、Francesco Rinarelli、Yonas Mitike Kassa、Kelvin Sundli、Idris Aleem 和 Tim Flocke。

我感谢科学顾问 Veronique Tremblay 和 Maximilian Hudlberger 对《模型评估》一章的审阅和修正。我也感谢 Cassie Kozyrkov 敏锐而挑剔的眼光,它使统计检验一节更加扎实。

其他我应该感谢给予帮助的出色人士有:Jean Santos、Carlos Azevedo、Zakarie Hashi、Tridib Dutta、Zakariya Abu-Grin、Suhel Khan、Brad Ezard、Cole Holcomb、Oliver Proud、Michael Schock、Fernando Hannaka、Ayla Khan、Varuna Eswer、Stephen Fox、Brad Klassen、Felipe Duque、Alexandre Mundim、John Hill、Ryan Volpi、Gaurish Katlana、Harsha Srivatsa、Agrita Garnizone、Shyambhu Mukherjee、Christopher Thompson、Sylvain Truong、Niklas Hansson、Zhihao Wu、Max Schumacher、Piers Casimir、Harry Ritchie、Marko Peltojoki、Gregory V.、Win Pet、Yihwa Kim、Timothée Bernard、Marwen Sallem、Daniel Bourguet、Aliza Rubenstein、Alice O.、Juan Carlo Rebanal、Haider Al-Tahan、Josh Cooper、Venkata Yerubandi、Mahendren S.、Abhijit Kumar、Mathieu Bouchard、Yacin Bahi、Samir Char、Luis Leopoldo Perez、Mitchell DeHaven、Martin Gubri、Guillermo Santamaría、Mustafa Murat Arat、Rex Donahey、Nathaniel Netirungroj、Aliza Rubenstein、Rahima Karimova、Darwin Brochero、Vaheid Wallets、Bharat Raghunathan、Carlos Salas、Ji Hui Yang、Jonas Atarust、Siddarth Sampangi、Utkarsh Mittal、Felipe Antunes、Larysa Visengeriyeva、Sorin Gatea、Mattia Pancerasa、Victor Zabalza、Dibyendu Mandal 和 James Hoover。