Spark和Python机器学习实战:预测分析核心方法(第2版)

978-7-115-58381-9
作者: 迈克尔·鲍尔斯(Michael Bowles)
译者: 沙灜胡玉雪
编辑: 杨海玲

图书目录:

详情

本书着重介绍可以有效预测结果的两类核心算法,包括惩罚线性回归方法和集成方法,然后通过一系列的示例细节来展示针对不同的问题如何使用这些方法。全书分为7章,主要讲述算法的选择、构建预测模型时的要点等内容,并且结合Spark和Python技术,引入岩石与水雷、鲍鱼年龄问题、红酒口感、玻璃分类等经典数据集,将机器学习应用到数据预测分析中,帮助读者全面系统地掌握利用机器学习进行预测分析的基本过程,并将其应用到实际项目中。

图书摘要

版权信息

书名:Spark和Python机器学习实战:预测分析核心方法(第2版)

ISBN:978-7-115-58381-9

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

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

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

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


版  权

著    [美] 迈克尔·鲍尔斯(Michael Bowles)

译    沙 灜 胡玉雪

责任编辑 杨海玲

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

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

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

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内容提要

本书着重介绍可以有效预测结果的两类核心算法,包括惩罚线性回归方法和集成方法,然后通过一系列的示例细节来展示针对不同的问题如何使用这些方法。全书分为7章,主要讲述算法的选择、构建预测模型时的要点等内容,并且结合Spark和Python技术,引入岩石与水雷、鲍鱼年龄问题、红酒口感、玻璃分类等经典数据集,将机器学习应用到数据预测分析中,帮助读者全面系统地掌握利用机器学习进行预测分析的基本过程,并将其应用到实际项目中。

本书适合想掌握机器学习技能的Python开发人员阅读。

版权声明

Michael Bowles

Machine Learning with SparkTM and Python®: Essential Techniques for Predictive Analytics, 2nd Edition

Copyright © 2020 by John Wiley & Sons, Inc., Indianapolis, Indiana.

All right reserved. This translation published under license.

Authorized translation from the English language edition published by John Wiley & Sons, Inc.

Copies of this book sold without a wiley sticker on the cover are unauthorized and illegal.

本书中文简体字版由John Wiley & Sons公司授权人民邮电出版社有限公司出版,专有出版权属于人民邮电出版社有限公司。

本书封底贴有Wiley防伪标签,无标签者不得销售。

版权所有,侵权必究。

前   言

从数据中提取有助于付诸行动的信息正在改变着现代商业的组织,同时对开发人员也产生了直接的影响。一方面是对新的软件开发技能的需求。这对具有高级统计和机器学习等必要技能的人员来说意味着丰厚的薪酬和可供选择的多种有趣的项目。另一方面是逐步出现了统计和机器学习相关的核心工具,这减轻了开发人员的负担。当他们尝试新的算法的时候,不需要重复发明“轮子”。在所有通用计算机语言中,Python的开发人员已经站在了最前沿,他们已经开发了当前最先进的机器学习工具,但是从拥有这些工具到有效地使用它们还有一段距离。

开发人员可以通过在线课程、优质的图书等方式来获得机器学习的相关知识。这些图书通常都给出了对机器学习算法、应用实例的精彩阐述,但是因为当前算法如此之多,以至于很难在一门课程或一本书中覆盖全部算法的相关细节。

这给实际应用者带来了困难。当需要从众多算法中进行选择的时候,机器学习的新手可能需要经过几次尝试之后才能做出决定。这往往需要开发人员来填补从问题的提炼到解决的完整过程之间的算法使用的相关细节。

本书尝试填补这一鸿沟,所采用的方法是只集中于两类核心的“算法族”,这两类算法族已在各种各样的问题中证明了其最佳的性能。该论断获得下面的支持:这两类算法在众多机器学习算法竞争者中已获得支配性地位,最近开发的机器学习工具包中都包含这两类算法和对这些算法的性能的研究工作(见第1章)。重点关注这两类算法使我们可以详细地介绍算法的使用原则,并通过一系列的示例细节来展示针对不同结构的问题如何使用这些算法。

本书主要通过代码实例来展示算法的使用原则。以我在加利福尼亚大学伯克利分校、美国技术培训服务商Galvanize、纽黑文大学和黑客道场(Hacker Dojo)的授课经验来看,开发人员更愿意通过看代码示例,而不是通过数学公式的推导来了解算法原理。

本书聚焦于Python语言,因为它能提供将功能和专业性良好结合的机器学习算法包。Python是一种经常使用的计算机语言,以产生精练、可读的代码而著称。这导致目前已有相当数量的业界旗舰公司采用Python语言进行原型系统的开发和部署。Python语言开发人员获得了广泛的技术支持,包括同业开发人员组成的大量社区、各种开发工具、扩展库等。Python广泛地应用于企业级应用和科学编程。它有相当数量的工具包来支持计算密集型应用,如机器学习。它也收集了当前机器学习领域的代表性算法(这样读者就可以省去重复性劳动)。与专门的统计语言R或SAS(Statistical Analysis System)相比,Python是一门更具通用性的编程语言,它的机器学习算法包吸收了当前一流的算法,并且在一直扩充。

本书的目标读者

本书主要面向想增强机器学习方面技能的Python开发人员,不管他们是针对某一特定的项目还是只想增强相关技能。开发人员很可能在工作中遇到新问题需要用机器学习的方法来解决。当今机器学习在新闻报道如此之多,使得机器学习方面的技能已经成为简历中一项十分有用的技能。

本书为Python开发人员提供如下内容:

为了能够顺利地理解这本书,读者应具备一定的背景知识,需要对编程或计算机科学有一定了解,并且能够读/写代码。本书的代码示例、库、包基于Python语言,主要适用于Python开发人员。在某些情况下,本书通过运行算法的核心代码来展示算法的使用原则,然后使用含有此算法的包来展示如何应用此算法来解决问题。开发人员通过源代码可以获得对算法的直观感受,就像其他人通过数学公式的推导来掌握算法。一旦掌握了算法的核心原理,示例就可以直接使用Python包,这些包都包含了能够有效使用这些算法所必需的辅助模块(如错误检测、输入输出处理、模型所使用的数据结构、引入训练好的模型的预测方法等)。

除了编程的背景,懂得相关数学、统计的知识将有助于读者掌握本书的内容。相关数学知识包括大学本科水平的微分学(知道如何求导,了解一些线性代数的知识)、矩阵符号、矩阵乘、求逆矩阵等。这些知识主要是帮助读者理解一些算法中的求导部分,很多情况下是一个简单函数的求导或基本的矩阵操作。能够理解概念层面上的数学计算将有助于对算法的理解。明白推导各步的由来有助于读者理解算法的强项和弱项,也有助于读者在面对具体问题的时候决定哪个算法是最佳选择。

本书也用到了一些概率和统计知识。对这方面的要求包括熟悉大学本科水平的概率知识和概念,如一系列实数的均值、方差和相关性。当然,即使读者对这些知识有些陌生,也可以随时查看代码。

本书涵盖了机器学习算法的两大类:惩罚线性回归(如岭回归、套索回归)和集成方法(如随机森林法、梯度提升法)。上述两大类算法都有一些变体,可以解决回归和分类的问题(在本书的开始部分将会介绍分类和回归的区别)。

如果读者已熟悉机器学习并只对其中的一类算法感兴趣,那么可以直接跳到相关的两章。每类算法由两章组成:一章介绍使用原则,另一章介绍针对不同类型问题的用法。惩罚线性回归在第4章和第5章中介绍,集成方法在第6章和第7章中介绍。快速浏览第2章将有助于理解算法应用章节中的问题,第2章涉及数据探索。刚刚进入机器学习领域准备从头到尾通读的读者可以把第2章留到阅读那些问题的解决方案的算法应用章节前。

本书的主要内容

如上所述,本书涵盖两大类算法族,这些算法近期都获得了发展,并且仍然在被持续地研究。它们都依赖于早期的技术,并且在一定程度上超越了这些技术。

惩罚线性回归代表了对最小二乘回归(least squares regression)方法的相对较新的改善和提高。惩罚线性回归具有的几个特点使其成为预测分析的首选。惩罚线性回归引入了一个可调参数,使最终的模型在过拟合与欠拟合之间达到了平衡。它还提供不同的输入特征对预测结果的相对贡献的相关信息。上述这些特征对于构建预测模型都是十分重要的。而且,对某类问题,惩罚线性回归可以产生最佳的预测性能,特别是对于欠定[1]的问题以及有很多输入参数的问题,如基因领域、文本挖掘等。另外,还有坐标下降法[2]等新方法可以使惩罚线性回归模型训练过程运行得更快。

[1] 在数学上,有一个线性方程组或者一个多项式方程组,如果方程比未知量少,则被认为是欠定的(underdetermined);如果方程比未知量多,则被认为是过定的(overdetermined)。——译者注

[2] 坐标下降法(coordinate descent)是一种非梯度优化算法。算法在每次迭代中,在当前点处沿一个坐标方向进行一维搜索以求得一个函数的局部极小值。在整个过程中循环使用不同的坐标方向。对于不可拆分的函数而言,算法可能无法在较小的迭代步数中求得最优解。为了加速收敛,可以采用一个适当的坐标系,例如通过主成分分析获得一个坐标间尽可能不相关的新坐标系。——译者注

为了帮助读者更好地理解惩罚线性回归,本书也概要介绍了一般线性回归及其扩展,例如逐步回归(stepwise regression)。主要是希望能够培养读者对算法的直觉。

集成方法是目前最有力的预测分析工具之一。它们可以对特别复杂的行为进行建模,特别是过定的问题,通常这些都是与互联网有关的预测问题(如返回搜索结果、预测广告的点击率)。由于集成方法的性能优良,许多经验丰富的数据科学家在做第一次尝试的时候都使用此算法。此类算法的使用相对简单,而且可以依据预测性能对变量进行排序。

目前集成方法与惩罚线性回归齐头并进。然而,惩罚线性回归是从克服一般回归方法的局限性进化而来的,而集成方法是从克服二元决策树的局限性进化而来的。因此本书介绍集成方法的时候,也会涉及二元决策树的背景知识,因为集成方法继承了二元决策树的一些属性。了解这些将有助于培养读者对集成方法的直觉。

本书的内容更新

自第1版发布以来的3年里,Python更加坚定地确立了作为数据科学的主流语言的地位。很多数据科学家已经利用Python作为接口,使用像面向大数据的Spark、面向深度学习的TensorFlow和Torch等平台。第一版中强调的两类算法仍然是最受欢迎的,而且已经成为PySpark的一部分。

这种结合的美妙之处在于,在真正庞大的数据集上构建机器学习模型所需的代码并不比在更小的数据集上所需的代码更复杂。

PySpark展示了巨大的进步,通过相对简单的易读易写的Python代码,使调用强大的机器学习工具变得更清晰、更容易。当撰写本书第1版的时候,在海量规模的数据集上构建机器学习模型需要操纵数百个处理器,这需要深入了解数据中心处理过程和编程知识。这很麻烦,坦率地说也不是很有效。Spark架构是为了解决这个问题而开发的。

Spark使机器学习可以很容易地租用和使用大量处理器。PySpark添加了一个Python接口。结果是,在PySpark中运行机器学习算法的代码并不比运行普通Python版本的程序复杂多少。第1版重点介绍的算法仍然可以在Spark上运行,并且依然广受青睐。因此,为了让读者熟悉PySpark,除Python示例以外,还自然而然地增加了PySpark的示例。

在这个版本中,所有的代码示例都运行在Python 3上,除了已提供文本形式的代码,每章还提供了Jupyter Notebook形式的代码。运行Notebook形式的代码就会看到书中的图形和表格。

本书的结构

本书遵循了着手解决一个新的预测问题的基本流程。开始阶段包括建立对数据的理解,以及确定如何形式化地表示问题;然后开始尝试使用算法来解决问题和评估性能。在这个过程中,本书将概要描述每一步所采用的方法及其原因。第1章给出本书所涵盖的问题和所用方法的完整描述,本书使用来自UC Irvine数据仓库的数据集作为例子;第2章展示了一些方法和工具,帮助读者对新数据集有一定的洞察力。第3章主要介绍预测分析的困难以及解决这些困难的技术,勾勒问题复杂度、模型复杂度、数据规模和预测性能之间的关系,讨论过拟合问题以及如何可靠地感知到过拟合,也讨论不同类型问题下的性能评测问题。第4章和第5章分别包括惩罚线性回归的背景及其应用,即如何解决第2章所述的问题。第6章和第7章分别包括集成方法的背景及其应用。

本书的使用方法

为了运行书中的代码示例,需要有Python 3.x、SciPy、numpy、pandas、scikit-learn和PySpark。由于交叉依赖和版本的问题,这些软件的安装可能会有些困难。为了简化上述软件安装过程,可以使用来自Continuum Analytics的这些包的免费分发版。它提供的Anaconda 产品可自由下载并且包含Python 3.x以及运行本书代码所需的全部包。我在Ubuntu 14.04 Linux发行版上测试了本书的代码,但是没有在其他的操作系统上测试过。

PySpark需要Linux环境。如果读者不是在Linux上运行,那么运行示例代码的最简单的方法可能是使用虚拟机。Virtual Box是一个免费的开源虚拟机。按照说明下载Virtual Box,然后安装Ubuntu 18.05,使用Anaconda安装Python、PySpark等。读者只需要使用虚拟机来运行PySpark示例。非Spark的实例可以运行在任何操作系统上,只要读者可以打开Jupyter Notebook。

本书对读者的支持

本书代码库中的源代码可以帮助读者加快学习速度。这些章节包括安装说明,以便读者在阅读本书的同时编写代码。

源代码

当研究本书示例代码的时候,可以选择手工录入这些代码,也可以直接使用本书配套的源代码文件。本书用到的所有源代码都可以从出版社网站下载获得。在本书代码片段旁有一个下载的小图标,并注明文件名,这样读者就可以知道此文件在下载的源代码中,可以很轻松地从下载源代码中找到此文件。

除了以文本形式提供代码,还包括Python记事本的形式。如果读者知道如何运行Jupyter Notebook,就可以一个单元一个单元地运行代码。输出将直接展示在Jupyter Notebook 上,图形和图表也是一样,显示的输出将出现在代码块的下面。

下载代码后,读者使用自己喜爱的压缩工具进行解压缩即可。

致  谢

我要感谢Wiley出版社的工作人员在本书撰写以及第2版修订过程中所给予的大力支持。最早是组稿编辑罗伯特·埃利奥特(Robert Elliot)和我联络写作本书,他很容易相处。汤姆·丁斯(Tom Dinse)在编辑本书第2版时做得很出色。他反应敏捷、思考通透、灵活、非常专业,正如我对Wiley出版社所期待的那样。

我也要感谢做事高效、有能力的计算机科学家詹姆斯·温加(James Winegar),作为本书的技术编辑,他让本书的风格更加一致,并做了许多改进,这些改进使本书的代码更易于理解和使用。

书中使用的示例问题来自加利福尼亚大学欧文分校(University of California at Irvine,UCI)的数据仓库。加利福尼亚大学欧文分校收集和管理这些数据集,使其免费可用,为机器学习社区做出了巨大的贡献。

作者简介

迈克尔·鲍尔斯(Michael Bowles)博士拥有机械工程学士和硕士学位、仪器仪表博士学位以及MBA学位。他的履历遍布学术界、科技界以及商业界。迈克尔目前主要与多家以人工智能或机器学习为主导的公司合作。他是多个管理团队的成员、咨询师以及顾问。他还在加利福尼亚大学伯克利分校(University of California,Berkeley)、加州山景城(Mountain View)的合作空间以及创业孵化器——黑客道场(Hacker Dojo)中教授机器学习课程。

迈克尔出生于俄克拉荷马州,并在那里获得学士和硕士学位。在东南亚工作了一段时间后,迈克尔前往剑桥大学攻读博士学位,毕业后在麻省理工学院(Massachusetts Institute of Technology,MIT)的Charles Stark Draper实验室获得了职位。之后迈克尔离开波士顿前往南加州的休斯飞机公司从事与通信卫星相关的工作。在加利福尼亚大学洛杉矶分校(University of California, Los Angeles)获得MBA学位后,迈克尔前往旧金山的湾区工作,成为两家成功的创业公司的创始人和CEO,这两家公司都已获风险投资。

迈克尔目前仍然积极参与技术以及创业相关的工作,近期项目包括机器学习在工业检测和自动化中的应用、金融预测、基于分子图结构的生物信息预测、金融风险评估。他还参与了人工智能和机器学习领域公司的尽职调查[1]工作。

[1] 尽职调查(Due Diligence,DD)是指企业在并购时,买方企业对目标企业进行的经营现状调查,其目的主要包括以下两个方面:一是搜集用于估算目标价值的信息;二是履行管理层应尽义务,收集信息并制作资料以期向股东说明此次并购决策的合理性。——译者注

技术编辑简介

詹姆斯·约克·温加(James York-Winegar)是Accentrue Enkitec Group集团的基础设施负责人。詹姆斯帮助各种规模的公司(从创业公司到成熟企业)弥合系统管理和数据科学之间的鸿沟,帮助了解数据完整的生命周期。他以物理学开启其职业生涯,在超级计算机上进行大规模的量子化学模拟,然后进入技术领域。詹姆斯拥有加利福尼亚大学伯克利分校数据科学硕士学位。

资源与支持

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

配套资源

本书提供源代码等免费资源。

要获得相关配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

提交勘误

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

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

与我们联系

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

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

如果您有兴趣出版图书、录制教学视频,或者参与图书技术审校等工作,可以发邮件给本书的责任编辑(yanghailing@ptpress.com.cn)。

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

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

关于异步社区和异步图书

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

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

异步社区

微信服务号

第1章 做预测的两类核心算法

本书集中于机器学习领域,只关注那些有效和获得广泛使用的算法。不会提供关于机器学习技术领域的全面综述。这种全面性的综述往往会提供太多的算法,但是这些算法并没有在从业者中被积极地使用。

本书涉及一类机器学习问题,通常指的是“函数逼近”(function approximation)问题。函数逼近问题是监督学习(supervised learning)问题的一个子集。线性回归和逻辑斯蒂回归为此类函数逼近问题提供了熟悉的算法示例。函数逼近问题包含了各种领域中的分类问题和回归问题,例如文本分类、搜索响应、广告投放、垃圾邮件过滤、用户行为预测、诊断等,这个列表几乎可以一直列下去。

广义上说,本书涵盖了解决函数逼近问题的两类算法:惩罚线性回归和集成方法。本章将介绍这两类算法,概述它们的特性并回顾算法性能对比研究的结果,以证明这些算法始终如一的高性能。

然后本章会讨论构建预测模型的过程,描述了这里介绍的算法可以解决的问题类型和在如何设置问题和定义用于预测的函数方面的灵活性。本章还会描述算法的具体步骤包括预测模型的构建并使其符合部署要求。

1.1 为什么这两类算法如此有用

有几个因素使惩罚线性回归和集成方法成为非常有用的算法集。简单地说,面对实践中遇到的绝大多数预测分析(函数逼近)问题,这两类算法都具有最优或接近最优的性能。这些问题包括大数据集、小数据集、宽数据集(wide data set)[1]、高瘦数据集(tall skinny data set)[2]、复杂问题、简单问题。里奇•卡鲁阿纳(Rich Caruana)及其同事的两篇论文为上述论断提供了证据,论文如下所示。

[1] 宽数据集(wide data set)指每次观测的时候有大量的测量项,但是观测次数有限的数据。若把数据看成表格形式,则此类数据集列数很多,而行数有限。典型的此类数据集包括神经影像、基因组以及其他生物医学方面的数据。——译者注。

[2] 高瘦数据集(tall skinny data set)指每次观测的时候测量项有限,但是进行了大量的观测。若把数据看成表格的形式,则此类数据集列数有限,行数很多。典型的此类数据集包括临床试验数据、社交网络数据等。——译者注。

(1)“An Empirical Comparison of Supervised Learning Algorithms”,作者是Rich Caruana 和Alexandru Niculescu-Mizil。

(2)“An Empirical Evaluation of Supervised Learning in High Dimensions”,作者是Rich Caruana、Nikos Karampatziakis和Ainur Yessenalina。

在这两篇论文中,作者选择了各种分类问题,并使用不同的算法来构建预测模型,然后测试这些预测模型在测试数据中的效果(这些测试数据当然不能应用于模型的训练阶段),并对这些算法根据性能进行打分。第一篇论文针对11个不同的机器学习问题(二元分类问题)对比了9个基本算法。所选问题来源广泛,包括人口统计数据、文本处理、模式识别、物理学和生物学。表1-1列出了此篇论文所用的数据集,所用名字与论文中的一致。此表还展示了针对每个数据集做预测时使用了多少属性以及正例所占的百分比。

表1-1 机器学习算法比较研究中问题的梗概

数据集名称

属性数

正例百分比

Adult

14

25

Bact

11

69

Cod

15

50

Calhous

9

52

Cov_Type

54

36

HS

200

24

Letter.p1

16

3

Letter.p2

16

53

Medis

63

11

Mg

124

17

Slac

59

50

术语“正例”(positive example)在分类问题中是指一个实验(输入数据集中的一行数据)的输出结果是正向的(positive)。例如,如果设计的分类器是为了判断雷达返回信号是否表明出现了一架飞机,那么正例则是指在雷达视野内确实有一架飞机的那些结果。正例这个词来源于这样的例子:两个输出结果分别代表出现或不出现。其他例子还包括在医学检测中是否出现疾病、退税中是否存在欺骗。

不是所有的分类问题都是应对出现或不出现的问题。例如,通过机器分析一个作家发表的作品或者其手写体的样本来判断此人的性别——男性或女性,在这里性别的出现或不出现是没有什么意义的。在这些情况下,指定哪些为正例、哪些为负例则有些随意,但是一旦选定,在使用中要保持一致。

在第一篇论文的某些数据集中,某一类的数据(样本)要远多于其他类的数据(样本),这叫作非平衡(unbalanced)数据。例如,两个数据集Letter.p1 和Letter.p2都是用于解决相似的问题:在多种字体下正确地分出大写字母。Letter.p1的任务是在标准的混合的字母中正确区分出大写字母O,Letter.p2的任务是将A~M和N~Z正确区分出来。表1-1中正例百分比一栏反映了这种差异性。

表1-1还显示了每个数据集所用的属性的数量。属性是基于此进行预测的变量。例如,预测一架飞机是否能够按时到达目的地,可能导入下列属性:航空公司的名字、飞机的型号和制造年份、目的地机场的降水量和航线上的风速与风向等。基于很多属性做预测可能是一件很难说清楚是福还是祸的事情。如果导入的属性与预测结果直接相关,那么当然是一件值得庆祝的事情。但是,如果导入的属性与预测结果无关,那么就是一件该诅咒的事情了。如何区分这两种属性(该祝福的属性,该诅咒的属性)则需要数据来说话。在第3章将进行更深入的讨论。

表1-2展示了本书涵盖的算法与上述论文中提到的其他算法的比较结果。针对表1-1列出的问题,表1-2列出了性能打分排前5名的算法。本书涵盖的算法脱颖而出(提升决策树、随机森林、投票决策树和逻辑斯蒂回归)。前3个属于集成方法。在那篇论文撰写期间惩罚回归还没有获得很好的发展,因此在论文中没有对此进行评价。逻辑斯蒂回归(logistic regression)属于与回归算法比较接近的算法,可以用来评测回归算法的性能。对于论文中的9个算法各有3种数据规约方法,所以一共是27种组合。前5名大概占性能评分的前20%。从第1行针对Covt数据集的算法排名可以看到:提升决策树算法占第1、2名;随机森林算法占第4、5名;投票决策树算法占第3名。出现在前5名但是本书没有涵盖的算法在最后一列列出(“其他”列)。表中列出的算法包括K最近邻(k-nearest neighbor, KNN)、人工神经网络(artificial neural net,ANN)和支持向量机(support vector machine,SVM)。

表1-2 本书涵盖的机器学习算法针对不同问题的比较

算法

提升决策树

随机森林

投票决策树

逻辑斯蒂回归

其他

Covt

1,2

4,5

3

Adult

1,4

2

3,5

LTR.P1

1

支持向量机

K最近邻

LTR.P2

1,2

4,5

支持向量机

MEDIS

1,3

5

人工神经网络

SLAC

1,2,3

4,5

HS

1,3

人工神经网络

MG

2,4,5

1,3

CALHOUS

1,2

5

3,4

COD

1,2

3,4,5

BACT

2,5

1,3,4

表1-2中,逻辑斯蒂回归只在一个数据集下进入前5。原因是相对于示例(每个数据集有5 000个样本)所采用的特征太少了(最多也就200个)。选取的特征有限,现有的数据规模足以选出一个合适的预测模型,而且训练数据集规模又足够小,使训练时间不至太长,因此没能体现逻辑斯蒂回归的优势。

正如将在第3章、第5章和第7章所看到的那样,当数据含有大量的属性,但是没有足够多的数据(样本)或时间来训练更复杂的集成模型的时候,惩罚回归方法将优于其他算法。

Caruana等人相对较新的研究(2008年)关注在属性数量增加的情况下上述算法的性能比较。也就是说讨论这些算法面对大数据表现如何。有很多领域的数据所拥有的属性已远远超过了第一篇论文中的数据集。例如,基因组问题通常有数以万计的属性(一个基因对应一个属性),文本挖掘问题通常有几百万个属性(每个唯一的词或词对对应一个属性)。表1-3展示了线性回归和集成方法随着属性增加的表现。表1-3列出了第2篇论文中涉及的算法的排名,包括算法针对每个问题的性能得分,最右列是此算法针对所有问题的平均得分。算法分成两组,上半部分是本书涵盖的算法,下半部分是其他算法。

表1-3 本书涵盖的机器学习算法面对大数据问题的性能比较

DIM

761 STURN

761 CALAM

780 DIGITS

927 TIS

1344 CRYST

3448 KDD98

20958 R-S

105354 CITE

195203 DSE

405333 SPAM

685569 IMDB

平均分

BSTDT

8

1

2

6

1

3

8

1

7

6

3

1

RF

9

4

3

3

2

1

6

5

3

1

3

2

BAGDT

5

2

6

4

3

1

9

1

6

7

3

4

BSTST

2

3

7

7

7

1

7

4

8

8

5

7

LR

4

8

9

1

4

1

2

2

2

4

4

6

SVM

3

5

5

2

5

2

1

1

5

5

3

3

ANN

6

7

4

5

8

1

4

2

1

3

3

5

KNN

1

6

1

9

6

2

10

1

7

9

6

8

PRC

7

9

8

8

7

1

3

3

4

2

2

9

NB

10

10

10

10

9

1

5

1

9

10

7

10

表1-3中的问题是按其属性规模依次排列的,从761个属性到最终685 569个属性。线性(逻辑)回归的5个在11个测试中进入前3。而且这些优异的分数主要集中在更大规模的数据集部分。注意提升决策树(表1-3标为BSTDT)和随机森林(表1-3标为RF)的表现仍然接近最佳,它们对所有问题的平均分排名第1、2。

本书涵盖的算法除了预测性能,在其他方面也有优势。惩罚线性回归模型的一个重要的优势是它训练的速度。当面对大规模的数据时,训练速度成为一个需要考量的因素。某些问题的模型训练可能需要几天到几周,这往往不能忍受,特别是在开发早期,需要尽早在多次迭代之后找到最佳的方法。惩罚线性回归方法除了训练速度特别快,部署已训练好的线性模型后进行预测的速度也特别快,可用于高速交易、互联网广告的植入等。研究表明惩罚线性回归在许多情况下可以提供最佳的答案,即使不是最佳答案,也可以提供接近最佳的答案。

而且这些算法使用十分简单,它们并没有很多可调参数。它们都有定义良好、结构良好的输入类型,可以解决回归和分类的几类问题。当面临一个新问题时,它们在1~2h内完成输入数据的处理并生成第一个经过训练的模型和性能预测结果是司空见惯的。

这些算法的一个重要的特性是它们可以明确地指出哪个输入变量对预测结果最重要。这已经成为机器学习算法的一个无比重要的特性。在预测模型构建过程中最消耗时间的一步是特征提取(feature selection),或者叫作特征工程(feature engineering),是数据科学家选择哪些变量用于预测结果的过程。根据重要性对特征排序,本书涵盖的算法在特征工程过程中可以起到一定的辅助作用,这样可以抛掉一些主观臆测的东西,让预测过程更具有确定性。

1.2 什么是惩罚线性回归方法

惩罚线性回归方法是由普通最小二乘法(ordinary least square,OLS)衍生出来的,而普通最小二乘法是在大约200年前由高斯(Gauss)和勒让德(Legendre)提出的。惩罚线性回归设计之初的想法是克服最小二乘法的一些根本限制。最小二乘法的一个根本问题是有时它会过拟合。如图1-1所示,考虑用最小二乘法通过一组点来拟合一条直线。这是一个简单的预测问题:给定一个特征x,预测目标值y。例如,可以根据男人的身高来预测其收入。根据身高是可以稍微预测一下男人的收入的(但是女人不行)。

如图1-1所示,图中点代表(男人的身高,男人的收入),直线代表使用最小二乘法对这个预测问题的解决方案。从某种意义上说,这条直线代表了已知男人身高的情况下,对男人收入的最佳预测模型。现在这个数据集有6个点,但只能获得其中的两个点。想象下有一组点,就像图1-1中的点,但是读者不能获得全部的点。可能的原因是要获得所有这些点代价太昂贵了,就像前面提到的基因组数据。只要有足够多的人手就可以分离出犯罪分子的基因,但是因为代价的原因,读者不可能获得全部基因序列。

以简单的例子来模拟这个问题,想象一下只给读者提供6个点中任意两个点。那么会如何改变这条直线的性质呢?这将依赖于读者得到的是哪两个点。想要知道这会产生多大的影响,来实际看一看这些拟合的效果,可以从图1-1中任意选出两个点,然后想象穿过这两个点的直线。图1-2展示了穿过图1-1中两个点的可能的直线。可以注意到拟合出来的直线依赖于这两个点是如何选择的。

图1-1 普通最小二乘法拟合

图1-2 只有两个点的情况下拟合的直线

使用两个点来拟合一条直线的主要问题是针对直线的自由度(degree of freedom)[3]没有提供足够的数据。一条直线有两个自由度。有两个自由度意味着需要两个独立的参数才能唯一地确定一条直线。可以想象在一个平面抓住一条直线,在这个平面上下滑动这条直线,或者旋转它以改变其斜率。与x轴的交点和斜率是相互独立的,它们可以各自改变,两者联合起来确定了一条直线。一条直线的自由度可以表示成几种等价的方式(可以表示成与y轴的交点和斜率,该直线上的两个点等)。所有这些确定一条直线的表示方法都需要两个参数。

[3] 统计学上的自由度(degree of freedom, df)是指当以样本的统计量来估计总体的参数时,样本中独立或能自由变化的自变量的个数。

当自由度的个数与点数相同时,预测效果并不是很好。连接这些点构成了直线,但是不同的点对可以形成大量不同的直线。在自由度与点数相同的情况下,所做的预测并不能报太大的信心。图1-1是6个点拟合一条直线(两个自由度)。也就是说6个点对应两个自由度。从大量的人类基因中找到可导致遗传疾病的基因的问题可以阐明相似的道理。要从大约20 000个人类基因中分离出病因,如果可选择的基因越多,则需要的数据也将更多。20 000个不同的基因就代表20 000个自由度,甚至从20 000个不同的人那里获取的数据都不足以得到可靠的结果,在很多情况下,一个相对合理的研究项目只能负担得起大约500个人的样本数据。在这种情况下,惩罚线性回归可能是最佳的选择了。

惩罚线性回归通过一种方法来系统地减少自由度使之与获得的数据规模、实质问题的复杂度相匹配。对于具有很多自由度的问题,这些方法获得了广泛的应用。在下列问题中更是得到了青睐:基因问题,通常其自由度(也就是基因的数目)是数以万计的;文本分类问题,其自由度可以超过百万。第4章将提供更多的细节:这些方法如何工作、通过示例代码说明算法的机制,以及用Python包实现一个机器学习系统的过程示例。

1.3 什么是集成方法

本书涵盖的另一类算法是集成方法(ensemble method)。集成方法的基本思想是构建多个不同的预测模型,然后将其输出做某种组合并作为最终的输出,如取平均值或采用多数人的意见(投票)。单个预测模型叫作基学习器(base learner)。计算学习理论的研究结果证明如果独立的预测模型的数目足够多,只要基学习器比随机猜测稍微好一些,那么集成方法就可以达到相当好的效果。

研究人员已经注意到的一个问题导致了集成方法的提出:某些机器学习算法表现出不稳定性。例如在现有数据集上增加新的数据会导致相应的预测模型或性能的突变。二元决策树和传统的神经网络就有这种不稳定性。这种不稳定性会导致预测模型性能的高方差,取多个模型的平均值可以看作一种减少这种方差的方法。技巧在于如何产生大量独立的预测模型,特别是当它们都用同样的基学习器的时候。第6章将深入讨论这是如何做到的。这些技术很巧妙,理解其运作的基本使用原则也相对容易。下面是其概述。

集成方法为了实现最广泛的应用通常将二元决策树作为它的基学习器。二元决策树通常如图1-3中所示。图1-3中的二元决策树以一个实数x作为最初的输入,然后通过一系列二元(二值)决策来决定针对x的最终输出是何值。第1次决策是判断x是否小于5。如果回答“否”,则二元决策树输出值为4,在由决策的方框下面标为“否”的分支引出的圆圈内。每个可能的x值通过决策树都会产生输出y。图1-4将输出y表示为针对二元决策树的输入x的函数。

图1-3 二元决策树示例

图1-4 二元决策树示例的输入-输出图

由此形成的问题是,这些比较值是如何产生的(例子中的x<5?),输出的值是如何确定的(图1-3 决策树的底部圆圈中的值)。这些值都来自基于输入数据的二元决策树的训练。训练算法不难理解,在第6章会有详细的叙述。需要注意的很重要的一点是给定输入数据,训练所得的二元决策树的值都是确定的。一种获得不同模型的方法是先对训练数据随机抽样,然后基于这些随机数据子集进行训练。这种方法叫作投票(bagging)法,是自举汇聚(bootstrap aggregating)的简化说法。此方法可以产生大量的具有稍许差异的二元决策树。这些决策树的输出经过平均(或分类器投票)产生最终的结果。第6章将描述此项技术的细节和其他更有力的技术。

1.4 算法的选择

表1-4给出了这两类算法的概要比较。惩罚线性回归的优势在于训练速度非常快。大规模数据集的训练时间可以是几小时、几天,甚至是几周。要获得一个可以部署的解决方案往往需要进行多次训练。过长的训练时间会影响大规模问题的开发和部署。训练所需时间当然越短越好,因此惩罚线性回归因其训练所需时间短而获得广泛使用显而易见。依赖于问题分类,这类算法相比集成方法可能会有一些性能上的劣势。第3章将更深入地分析,哪类问题适用于惩罚回归,哪类问题适用于集成方法。即使在某些情况下,惩罚线性回归的性能不如集成方法,但它也可以是开发过程中有意义的第一步尝试。

表1-4 惩罚线性回归与集成方法权衡比较

训练速度

预测速度

问题复杂度

处理大量特征

惩罚线性回归

+

+

+

集成方法

+

在系统开发的早期阶段,为了特征选择和特征工程的目的,以及为了进一步明确问题的形式化描述,训练过程往往需要进行多次迭代。决定将哪些特征作为预测模型的输入是需要时间来考虑的。有时这个过程是显而易见的,但是通常需要多次迭代之后才会逐渐显现出来。把所能找到的所有特征都输入进去通常并不是一个好的解决方案。

试错法是确定模型的最佳输入的典型方法。例如,如果读者想预测访问网站的用户是否会点击一个广告链接,那么可能尝试利用访问者的人口统计数据。但是可能结果并不能达到读者想要的精度,因此读者可能尝试导入关于访问者在此网站过去行为的数据——在过去的网站访问过程中,此用户点击过哪些广告或购买过哪些产品。可能增加访问者访问此网站之前访问的其他网站的相关信息也会有些帮助。这些问题都导致了一系列的实验:导入新的数据,然后看一看新的数据对结果是否有帮助。这种迭代过程在两个方面都是很耗时的:数据的处理和预测模型的训练。惩罚线性回归通常要比集成方法快,而这种时间上的差异性是机器学习系统开发阶段需要考虑的一个重要因素。

例如,如果训练集在GB级别,惩罚线性回归的训练时间在30 min这个级别,则集成方法可能需要5~6h。如果特征工程阶段需要10次迭代来选择最佳特征集合,则单单这个阶段就会产生1天或1周的时间差异。一个有用的技巧是在开发的早期阶段,如特征工程阶段,利用惩罚线性回归模型进行训练。这给数据科学家一个基本的判断哪些变量(特征)是有用的、重要的,同时提供了一个后续阶段其他算法在性能上进行比较的基线。

除了可以获得训练时间上的收益,惩罚线性回归产生预测结果的速度也比集成方法快得多。产生预测涉及使用训练好的模型。对于惩罚线性回归,训练好的模型是一系列实数列表,其中每个实数对应一个用于做预测的特征。所涉及的浮点操作的次数是被用来做预测的变量数。对于对时间高度敏感的预测,例如高速在线交易、互联网广告置入,计算时间上的差异往往代表着是盈利还是亏损。

对于某些问题,线性方法相比集成方法可以提供同等或更好的性能。一些问题不需要复杂的模型。第3章将详细讨论问题复杂度的特性,数据科学家的任务是平衡问题的复杂度、预测模型的复杂度和数据集规模以获得一个最佳的可部署模型。基本思想是如果问题不是很复杂,而且不能获得足够多的数据,与更加复杂的集成方法相比,线性方法可能会获得全面且更优的性能。基因数据是此类典型问题。

一般的直观感受是基因数据的规模是巨大的。当然以位为单位,基因数据集确实是非常庞大的,但是如果想要产生准确的预测,则它们的规模远远谈不上庞大。为了理解两者之间的差别,考虑下面一个假想的实验。假设有两个人,一个人有遗传疾病,另外一个人没有。如果有这两个人的基因序列,那么能确定哪个基因是负责这个遗传疾病的吗?显然,这是不可能的,因为这两个人之间有很多基因是不同的。那么需要多少人才能完成这个任务呢?至少人数要与基因数相等,如果考虑到测量中存在的噪声,就需要更多的人了。人类大约有20 000个基因,因计算方法不同而略有差异。获得每条数据大约需要1 000美元,要获得足够多的数据以完美地解决此问题至少需要2 000万美元。

就像本章前面讨论的那样,这种情况与用两个点来拟合一条直线非常相似。模型需要比数据规模更少的自由度。数据集规模通常是自由度的倍数。因为数据集的规模是固定的,所以需要调整模型中的自由度。惩罚线性回归的相关章节将介绍惩罚线性回归如何支持这种调整以及依此如何达到最优的性能。

注意

本书所涵盖的两大类算法分类与作者和杰里米·霍华德(Jeremy Howard)在2012年O’Reilly Strata 国际会议中提出的相匹配。杰里米负责介绍集成方法,作者负责介绍惩罚线性回归,并就两者的优缺点进行了有趣的讨论。事实上,这两类算法占当前作者构建的预测模型的80%,这是有原因的。

第3章将更详细地讨论为什么对于给定的问题,一个算法相比另一个算法是更好的选择。这与问题的复杂度和算法内在所固有的自由度有关。线性模型训练速度快,并且经常能够提供与非线性集成方法相当的性能,特别是当能获取的数据有限的时候。因为它们的训练速度快,所以在早期特征提取阶段训练线性模型是很方便的,可以据此大致估计一下针对特定问题可以达到的性能。线性模型提供变量重要性的相关信息,可以辅助特征提取阶段的工作。在有充足数据的情况下,集成方法通常能提供更佳的性能,也可以提供一些间接的关于变量重要性的措施。

1.5 构建预测模型的步骤

使用机器学习需要几项不同的技能。一项是编程技能,本书不会把重点放在这。其他的技能与获得合适的模型进行训练和部署有关。这些技能将是本书重点关注的。这些技能具体包括哪些内容?

最初,问题是用多少有些模糊的日常语言来描述的,如“向网站的访问者展示他们很可能点击的链接”。要将其转换为一个实用的系统,需要用具体的数学术语对问题进行重述,找到预测所需的数据集,然后训练预测模型,预测网站访问者点击出现的链接的可能性。用数学术语对问题进行重叙,其中就包含了从可获得的数据资源中抽取何种特征以及如何对这些特征构建模型的假设。

当遇到一个新问题时,应该如何着手?首先,需要浏览一下可获得的数据,确定哪类数据可能用于预测。“浏览数据”的意思是对数据进行各种统计意义上的检测分析以了解这些数据透露了什么信息,这些信息又与要预测的有怎样的关系。在某种程度上,直觉也可以指导读者做一些工作。也可以量化结果,测试潜在的预测特征与结果的相关性。第2章将详细介绍分析测试数据集的过程,本书余下部分所述的算法使用这些数据集并进行算法相互间的比较。

假设通过某种方法选择了一组特征,开始训练机器学习算法。这将产生一个训练好的模型,然后估计它的性能。接下来考虑对特征集进行调整,包括增加新的特征或删除已证明没什么帮助的特征,或者更改为另外一种类型的训练目标(也叫作目标函数),通过上述调整观察是否能够提高性能。可能需要反复调整设计决策来确定是否能够提高性能。可能会把导致性能比较差的数据单独提出来,然后尝试是否可以从中发现背后的规律。这可能会将新的特征添加到预测模型中,也可能把数据集分成不同的部分分别考虑,分别训练不同的预测模型。

本书的目的是让读者熟悉上述处理过程,以后遇到新问题时就可以自己独立完成上述开发步骤。当构造问题并开始提取用于训练和测试算法的数据时,需要对不同的算法所要求的输入数据结构比较熟悉。此过程通常包括如下步骤。

(1)提取或组合预测所需的特征。

(2)设定训练目标。

(3)训练模型。

(4)根据测试数据评估性能表现。

注意

在完成第一遍过程后,可以通过选择不同的特征集、不同的目标函数等手段来提高预测的性能。

机器学习不仅要求熟悉一些包,它还需要理解和开发一个可以实际部署的模型的全部过程。本书的目标是在这方面提供帮助。本书假设读者具有大学本科的基础数学知识、理解基本的概率和统计知识,但是不预设读者具有机器学习的背景知识。同时,本书倾向于直接给读者提供针对广泛问题具有最佳性能的算法,而不需要通览机器学习相关的所有算法或方法。有相当数量的算法很有趣,但是因为各种原因并没有获得广泛的使用,例如,这些算法可能扩展性不好,不能对内部的运行机理提供直观的解释,或者难以使用等。例如,众所周知梯度提升算法(本书6.3节将会介绍)在在线机器学习算法竞争中遥遥领先。通常有非常切实的原因导致某些算法经常被使用,本书的目标是在读者通读完本书后对这方面有充分的了解。

1.5.1 构造一个机器学习问题

参加机器学习算法竞赛可以看作解决真实机器学习问题的一个仿真。机器学习算法竞赛会提供一个简短的描述(如宣称一个保险公司想基于现有机动车保险政策更好地预测保费损失率)。作为参赛选手,读者要做的第一步就是打开数据集,仔细审视数据集中的数据,并确定需要做哪种形式的预测才有用。通过对数据的审视,可以获得直观的感受:这些数据代表什么,它们是如何与预测任务关联起来的。数据通常可以揭示可行的方法。图1-5描述了从通用语言对预测目标的描述开始,到作为机器学习算法的输入的数据排列方向移动的基本步骤。

图1-5 构造一个机器学习问题

泛泛的说法“获得更好的结果”首先应转换成可度量可优化的具体目标。作为网站的拥有者,“更好的结果”可以是提高点击率或有更高的销售额(或更高的利润)。下一步是收集有助于预测的数据:特定用户有多大可能性会点击各种不同类型的链接或购买在线提供的各种商品。图1-5将这些数据表示为特征的矩阵。以网站为例,这些特征可能包括网站访问者之前浏览的其他网页或访问者之前购买的商品。除了用于预测的特征,针对此类问题的机器学习算法还需要将已知正确的答案用于训练。在图1-5中表示为“目标”。本书涵盖的算法通过访问者过去的行为来发现访问者的购买模式,当然,算法不是单纯地记忆用户过去的行为,毕竟一个用户不可能重复购买昨天刚刚购买的商品。第3章将详细讨论不是单纯地记忆过去行为的预测模型的训练过程是如何起作用的。

通常,解决一个机器学习各个阶段的问题可以采用不同的方法。这就导致了问题的构造、模型的选择、模型的训练以及模型性能评估这一过程会发生多次迭代,如图1-6所示。

随问题而来的是定量的训练目标,或者是数据提取(称为设定目标或标签)。例如,考虑建立一个自动化预测证劵交易的系统。为了实现交易的自动化,第一步可能是预测证券的价格变化。这些价格是很容易获得的,因此利用历史数据构建一个训练模型来预测未来价格的变化在概念上是容易理解的。但即使是这一过程也包含了多种算法的选择和实验。未来价格的变化仍然可以用多种方法来计算。这种价格的变化可以是当前价格与10 min之后的价格差异,也可以是当前价格与10天之后的价格差异,还可以是当前价格与接下来的10 min内价格的最高值/最低值之间的差异。价格的变化可以用一个二值的变量来表示:“高”或“低”,这依赖于10 min之后价格升高还是降低。所有这些选择将会导致不同的预测模型,这个预测模型将用于决定是买入还是卖出证券,需要通过实验来确定最佳的选择。

图1-6 从问题形式化到性能评估的迭代过程

1.5.2 特征提取和特征工程

确定哪些特征可用于预测也需要实验尝试,这个过程是特征提取和特征工程。特征提取是一个把自由形式的各种数据(如一个文档或一个网页中的字词)转换成行、列形式的数字的过程。例如,垃圾邮件过滤的问题,输入是邮件的文本,需要提取的东西包括文本中大写字母的数量、所有大写的词的数量、在文档中出现“买”字的次数等,诸如此类的数值型特征,基于这些特征把垃圾邮件从非垃圾邮件中区分出来。

特征工程是对特征进行操作、组合以达到更富有信息量的过程。建立一个证券交易系统包括特征提取和特征工程。特征提取将决定哪些特征可以用来预测价格。过往的价格、相关证券的价格、利率、从最近发布的新闻提取的特征都被纳入公开讨论的各种交易系统。而且证券价格还有一系列的工程特征,包括随机、指数平滑异同移动平均线(moving average convergence and divergence,MACD)、相对强弱指数(relative strength index,RSI)等。这些特征都是过往价格的函数,它们的发明者认为这些特征对于证券交易都是非常有用的。

选好一系列合理的特征后,就像本书描述得那样,需要训练一个预测模型,评价它的性能,然后决定是否部署此模型。通常需要对所选取的特征进行调整,除非模型的性能已经足够满足要求了。一个确定使用哪些特征的方法是尝试所有的组合,但是这样时间代价太大。不可避免地,读者面临着提高性能的压力,但是又需要迅速地获得一个训练好的模型投入使用。本书讨论的算法有一个很好的特性,它们提供每个特征对最终预测结果的贡献的度量。经过一轮训练,将会对特征排名以标识其重要性。这些信息可以帮助加速特征工程的过程。

注意

数据准备和特征工程估计会占用开发一个机器学习模型的80%~90%的时间。

模型的训练也是一个过程,每次都是先选择作为基线的特征集合进行尝试。作为一个现代机器学习算法(如本书描述的算法),通常需要训练100~5 000个不同的模型,然后从中精选出一个模型进行部署。产生如此多的模型的原因是提供不同复杂度的模型,这样可以挑选出一个与问题、数据集最匹配的模型。如果不想因模型太简单而放弃性能,又不想因模型太复杂而出现过拟合问题,那么就需要从不同复杂度的模型中选择一个最合适的。

1.5.3 确定训练好的模型的性能

一个模型合适与否由此模型在测试数据集上的表现来决定。这点在概念上虽然很简单,却是非常重要的一步。需要留出一部分数据,不用于训练,只用于模型的测试。在训练完成之后,用这部分数据集测试算法的性能。本书讨论了留出这部分测试数据的方法。不同的方法各有优势,主要依赖于训练数据的规模。就像字面上理解的那样,要不断地提出各种复杂的方法让测试数据“渗入”训练过程。在这个过程的最后,读者将获得一个算法,此算法筛选输入数据以产生准确的预测,读者可能需要监控条件的变化,这种变化的条件往往会导致潜在的一些统计特性的变化。

1.6 各章内容及其依赖关系

读者可以依赖于自己的背景以及是否有时间了解基本原理,采用不同的方式来阅读本书。图1-7展示了本书各章之间的依赖关系。

图1-7 各章依赖关系

第2章仔细审视各种数据集。这些数据集用于本书中的问题实例,来说明算法的使用,以及各种算法之间基于性能和其他特征的比较。面对一个新的机器学习问题的起点就是深入探究数据集,深入理解数据集,了解它们的问题和特质。第2章的部分内容是展示Python中可以用于数据集探索的一些工具集。只要浏览第2章中的一部分例子就可以了解整个流程。当在后续章节遇到具体的应用实例的时候,可以返回到第2章阅读相关的部分。

第3章主要介绍在机器学习问题中要考虑的在各种因素之间的权衡和贯串本书的关键概念。一个关键概念是预测问题的数学描述,也会涉及分类和回归问题的基本差别。第3章还会介绍如何使用样本外数据来评测预测模型的性能。样本外数据是指在模型训练过程中不包括的数据。一个好的机器学习实践要求开发人员对一个实际部署的预测模型的性能表现有相对稳定的预估。这就要求使用训练数据集以外的数据来模拟新的数据。第3章会介绍这么做的原因、实现的方法以及在这些方法之间如何取舍。另外一个重要的概念是系统性能的评价方法。第3章会描述这些方法以及它们之间的取舍。对机器学习比较熟悉的读者可以浏览这一章,快速略过代码实例,而不需要仔细阅读代码并运行代码。

第4章展示训练惩罚回归模型的核心思想,介绍基本概念及算法的推导。第3章引入的一些实例,用于导致惩罚线性回归方法的产生。第3章还会展示解决惩罚线性回归训练问题的核心算法代码,还介绍了线性回归方法的几种扩展。一种扩展是将因素变量(factor variable)编码为实数,这样就可以使用线性回归方法。线性回归方法只能用在特征值是数值的情况下,也就是说需要对特征值进行量化。许多实际重要问题的特征经常是这样的形式,如“单身、已婚或离异”等,这种变量对做预测很有帮助。如果要引入此种类型的变量(类别变量,categorical variable)到一个线性回归模型中,则意味着需要设计一种转换方法将类别变量转换为实数变量,第4章会介绍这些方法。第4章还会介绍一种叫作基扩展(basis expansion)的方法,此方法从非线性回归中获得非线性函数,有时用于进一步提升线性回归的性能。

第5章将第4章介绍的惩罚回归算法应用于第2章提到的问题中。这一章概述实现惩罚回归算法的Python包,并用这些包来解决问题。这一章的目的是尽可能覆盖广泛的各类问题的变体,这样当读者遇到一个问题的时候,可以找到一个最接近的问题作为借鉴。除了量化并比较预测的性能,第5章也考查了这些算法的其他特性,理解变量的选择、变量的排序(对最终预测结果的贡献)是很重要的,这种理解能力可以加快面临新问题时的开发进程。

第6章关注集成方法。因为集成方法在绝大多数情况下基于二元决策树,第一步是理解训练和使用二元决策树的原则。集成方法的很多特性都是直接继承于二元决策树。基于上述理解,这一章介绍3个主要的集成方法:投票法、梯度提升法和随机森林法。这一章介绍了上述每个算法的使用原则和核心算法的代码,这样读者就会了解如何使用这些算法。

第7章应用集成方法来解决第2章中的问题,然后对各种算法进行对比分析。对比分析的内容包括预测的性能、训练所需的时间和性能等。所有的算法都会给出特征的重要性排序。在不同的算法中对于特定的问题会进行对比分析特征。

以我的经验,向开发人员和计算机科学家教授机器学习,代码实例要优于数学公式。这是本书所采用的方法:提供一些基础的数学知识、算法框架和代码实例来说明算法的关键点。本书所讨论的绝大多数算法可以在本书或网站上的代码中找到,这么做的初衷是提供可破解代码让读者能够尽快运行代码并解决面临的实际问题。

1.7 小结

本章详述了本书要解决的问题,描述了构建预测模型的处理流程。本书关注两类算法族。限定介绍的算法的数量,可以让我们更透彻地解释这些算法的背景知识以及这些算法的运行机理。本章介绍了可以用于对这两类算法进行选择的性能对比结果,讨论了这两类算法族的特性和各自的优势,并且详细描述了各自所适合解决的问题类型。

本章还展示了开发一个预测模型的步骤,以及每个步骤的权衡折中和输出结果。非模型训练时所使用的数据可以用来对预测模型的性能进行评估。

本书的目的是对机器学习了解不多的开发人员通过学习本书,能够胜任将机器学习技术引入项目的工作。本书并不关注大量的算法。相反,只关注当前一流的算法,这些算法可以满足对性能、灵活性和清晰度的要求。一旦了解了它们是怎么工作的,并且拥有了使用它们的一些经验,就会发现它们很容易上手。这些算法可以解决很多种问题,而不需要先做大量的训练,这也是帮助读者理解这些算法高性能的原因。

相关图书

Python极客项目编程(第2版)
Python极客项目编程(第2版)
动手学自然语言处理
动手学自然语言处理
Python财务应用编程
Python财务应用编程
深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
Web应用安全
Web应用安全
Python+ChatGPT办公自动化实战
Python+ChatGPT办公自动化实战

相关文章

相关课程