前言
从数据中提取有助于决策的信息正在改变着现代商业的组织,同时也对软件开发人员产生了直接的影响。一方面是对新的软件开发技能的需求,市场分析师预计到 2018 年对具有高级统计和机器学习技术的人才需求缺口将达 140000 ~ 190000 人。这对具有上述技能的人员来说意味着丰厚的薪水和可供选择的多种有趣的项目。另一方面对开发人员的影响就是逐步出现了统计和机器学习相关的核心工具,这减轻了开发人员的负担。当他们尝试新的算法时,不需要重复发明“轮子”。在所有通用计算机语言中,Python 的开发人员已经站在了最前沿,他们已开发了当前最先进的机器学习工具包,但从拥有这些工具包到如何有效地使用它们仍然存在一定的距离。
开发人员可以通过在线课程、阅读质量上乘的书籍等方式来获得机器学习的相关知识。
它们通常都对机器学习的算法、应用实例给出了精彩的阐述,但是因为当前算法如此之多,以至于很难在一门课程或一本书中覆盖全部算法的相关细节。
这给实践者带来了困难。当面临众多算法时,机器学习新手可能需要多次尝试才能做出决定,这往往需要开发人员来填补从问题提炼到最终问题解决之间的所有算法使用方便的细节。
本书尝试填补这一鸿沟,所采用的方法就是只集中于两类核心的“算法族”,这两类算法族已在广泛的应用领域中证明了其最佳的性能。此论断的证据如下:这两类算法在众多机器学习算法竞争者中已获得支配性地位,新开发的机器学习工具包都会率先支持此两类算法,以及研究工作给出的性能对比结论(见第 1 章)。重点关注这两类算法使我们可以更详细地介绍算法的使用原则,并通过一系列的示例细节来展示针对不同问题如何使用这些算法。
本书主要通过代码实例来展示所讨论的算法的使用原则。以我在加州山景城的黑客道场(Hacker Dojo)授课的经验来看,我发现开发人员更愿意通过直接看代码示例来了解算法原理,而不是通过数学公式推导。
本书使用 Python 语言,因为它能提供将功能和专业性良好结合的机器学习算法包。
Python 是一种经常使用的计算机语言,以产生精炼、可读性代码而著称。这导致目前已有相当数量的业界旗舰公司采用 Python 语言进行原型系统开发和部署。Python 语言开发人员获得了广泛的支持,包括大量的同业开发人员组成的社区、各种开发工具、扩展库等等。
Python 广泛应用于企业级应用和科学研究领域。它有相当数量的工具包支持计算密集型应用,如机器学习。它也收集了当前机器学习领域的代表性算法(这样就可以省去重复性劳动)。Python 相比专门的统计语言如 R 或 SAS(Statistical Analysis System)是一门更通用的语言,它的机器学习算法包吸收了当前一流的算法,并且在一直扩充。
本书的目标读者
本书主要面向想提高机器学习技能的 Python 开发人员,不管是针对某一特定的项目,还是只想提升相关技能。开发人员很可能在工作中遇到新问题需要使用机器学习的方法来解决。当今机器学习的应用领域如此之广,使其已成为简历中一项十分有用的技能。
本书为 Python 开发人员提供如下内容:
✦ 机器学习所解决的基本问题的描述;
✦ 当前几种最先进的算法;
✦ 这些算法的应用原则;
✦ 一个机器学习系统的选型、设计和评估的流程;
✦ 流程、算法的示例;
✦ 可进一步修改扩展的代码。
为了能够顺利地理解这本书,读者所需的背景知识包括:了解编程、能够读写代码。
因为本书的代码示例、库、包都是 Python 语言的,所以本书主要适用于 Python 开发人员。
本书通过运行算法的核心代码来展示算法的使用原则,然后使用含有此算法的工具包来展示如何应用此算法来解决问题。开发人员通过源代码可以获得对算法的直观感受,就像其他人通过数学公式的推导来掌握算法。一旦掌握了算法的核心原理,应用示例就直接使用 Python 工具包,这些工具包都包含了能够有效使用这些算法必需的辅助模块(如错误检测、输入输出处理、模型所需数据结构的处理、基于训练模型的预测方法的处理,等等)。
除了编程背景,懂得相关数学、统计的知识将有助于掌握本书的内容。相关数学知识包括大学本科水平的微分学(知道如何求导,少量线性代数知识)、矩阵符号的意义、矩阵乘、求逆矩阵。这些知识主要是帮助理解一些算法中的求导部分,很多情况下就是一个简单函数的求导或基本的矩阵操作。能够理解概念层面上的数学计算将有助于对算法的理解。明白推导各步的由来有助于理解算法的强项和弱项,也帮助读者面对具体的问题时,决定哪个算法是最佳选择。
本书也用到了一些概率和统计知识。对这方面的要求包括熟悉大学本科水平的概率知识和概念,如实数序列的均值、方差和相关系数。当然即使这些知识对读者来说有些陌生,也不会影响读者对代码的理解。
本书涵盖了机器学习算法的两大类:惩罚线性回归(penalized linear regression),如岭回归算法(ridge)、Lasso 算法;集成方法(ensemble methods),如随机森林算法(random forests)、梯度提升算法(gradient boosting)。上述两大类算法有一些变体,都可以解决回归和分类的问题(在本书开始部分将会介绍分类和回归的区别)。
如果读者已熟悉机器学习并只对其中的一类算法感兴趣,可以直接跳到相关的二章。
每类算法由两章组成,一章介绍基本原理,另外一章介绍针对不同类型问题的用法。惩罚线性回归由下列两章组成:第 4 章“惩罚线性回归模型”和第 5 章“利用惩罚线性回归方法来构建预测模型”;集成方法由下列两章组成:第 6 章“集成方法”和第 7 章“用Python 构建集成模型”。快速浏览第 2 章“通过理解数据来了解问题”将有助于理解算法应用章节中的问题。刚刚进入机器学习领域准备从头到尾通读的读者可以把第 2 章留到阅读那些算法应用章节前。
本书包含的内容
如上所述,本书涵盖两大类算法,这些算法近期都获得了发展,并将仍然获得持续性研究,它们都起源于早期的技术,但已使这些早期技术黯然失色。
惩罚线性回归代表了对最小二乘法回归方法(least squares regression)的相对较新的改善和提高。惩罚线性回归具有的几个特征使其成为预测分析的首选。惩罚线性回归引入了一个可调参数,使最终的模型在过拟合与欠拟合之间达到了平衡。它还提供不同的输入特征对预测结果的相对贡献的信息。上述这些特征对于构建预测模型都是十分重要的。
而且,对于某些问题惩罚线性回归可以产生最佳的预测性能,特别是对于欠定的问题以及具有很多输入参数的问题,如基因领域、文本挖掘等。进一步,坐标下降法(coordinate descent methods)等新方法可以使惩罚线性回归模型训练过程运行得更快。
为了帮助读者更好地理解惩罚线性回归,本书也概要介绍了线性回归及其扩展,如逐步回归(stepwise regression),主要是希望能够培养读者对算法的直观感受。
集成方法是目前最有力的预测分析工具之一。它可以对特别复杂的行为进行建模,特别是过定的问题,通常这些都是与互联网有关的预测问题(如返回搜索结果和预测点击率)。由于集成方法的性能,许多经验丰富的数据科学家在做第一次尝试时都使用该方法。
集成方法使用相对简单,而且可以依据对预测的贡献程度对输入特征排序。
目前集成方法与惩罚线性回归齐头并进。然而惩罚线性回归是从克服一般回归方法的局限性进化而来的,集成方法是从克服二元决策树的局限性进化而来的。因此本书介绍集成方法时,也会涉及二元决策树的背景知识,因为集成方法继承了二元决策树的一些属性。
了解这些将有助于培养对集成方法的直觉。
本书的组织
本书遵循了着手解决一个预测问题的基本流程。开始阶段包括对数据的理解、如何形式化表示问题,然后开始尝试使用算法解决问题,评估其性能。在这个过程中,本书将概要描述每一步采用的方法及其原因。第 1 章给出本书涵盖的问题和所用方法的完整描述,本书使用来自 UC Irvine 数据仓库的数据集作为例子;第 2 章展示了一些数据分析的方法和工具,帮助读者对新数据集具有一定的洞察力。第 3 章“预测模型的构建:平衡性能、复杂性以及大数据”主要介绍由上述三者带给预测分析技术的困难以及所采用的技术,勾勒了问题复杂度、模型复杂度、数据规模和预测性能之间的关系,讨论了过拟合问题以及如何可靠地感知到过拟合,以及不同类型问题下的性能评价标准。第 4 章、第 5章分别介绍惩罚线性回归的背景及其应用,即如何解决第 2 章所述的问题。第 6 章、第 7章分别介绍集成方法的背景及其应用。
如何使用本书
为了运行书中的代码示例,需要有 Python2.x、SciPy、NumPy、Pandas 和 scikit-learn。
由于交叉依赖和版本的问题,这些软件的安装可以会有些困难。为了简化上述软件安装过程,可以使用来自 Continuum Analytics(http://continuum.io/)的这些包的免费分发版。
Continuum Analytics 提供的 Anaconda 软件包可自由下载并且包含 Python2.x 在内的运行本书代码所需的全部软件包。我在 Ubuntu 14.04 Linux 发行版上测试了本书的代码,但是没有在其他的操作系统上测试过。
约定
为了便于对本书的理解,本书通篇采用如下的约定。
警告 这些方框表示是与其周围文本直接相关的不能忘记的重要信息。
注释 表示与当前讨论相关的注释、说明、提示和技巧。
源代码
研究本书示例代码时,可以选择手工敲入这些代码,也可以直接使用随书带的源代码文件。本书用到的所有源代码都可以从 http://www.wiley.com/go/pythonmachinelearning 中下载获得。在本书代码片段旁会有一个下载的小图标,并注明文件名,这样就可以知道此文件在下载的源代码中,并且可以很轻松地从下载源代码中找到此文件。读者可访问上述网站,定位到本书书名(可以使用搜索框或书名列表),在本书详细介绍页面点击“Download Code”链接就可以获得本书的全部源代码。
注释 因为很多书的书名都非常相似,最简单的方法就是通过 ISBN 来查找,本书的 ISBN 是 978-1-118-96174-2。
下载源代码后,只需用你惯用的解压缩工具解压缩即可。
勘误表
我们已尽最大可能避免在文本和代码中出现错误。但是没有人是完美的,同样错误也难免会发生。如果读者在书中发现了错误,诸如拼写错误、代码错误等等,能及时反馈,我们将非常感谢。提交勘误表,能减少其他读者的困惑,同时也帮助我们提供更高质量的内容。
获得本书勘误表的方法:访问 http://www.wiley.com,通过搜索框或书名列表定位到本书;然后进入本书的详细介绍页面,点击“Book Errata”链接,可以看到关于本书所有已提交的并由 Wiley 出版社编辑上传的勘误表。
本书评论