书名:Python机器学习实战
ISBN:978-7-115-49385-9
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 刘宇熙(Hayden Liu)
译 杜春晓
责任编辑 武晓燕
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Copyright ©2020 Packt Publishing. First published in the English language under the title Python Machine Learning By Example.
All rights reserved.
本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
机器学习是近年来比较热门的一个领域,Python语言经过一段时间的发展也已成为主流的编程语言之一。本书结合了机器学习和Python语言两个热门的领域,通过实用案例来详细讲解机器学习的相关知识,以便更好地引起读者的阅读兴趣并帮助读者理解相关内容。
全书共有8章。第1章讲解了Python和机器学习的基础知识,第2~7章通过多个案例详细讲解了文本分析算法、朴素贝叶斯、支持向量机、对率回归及回归算法等知识,案例主要包括探索新闻组数据集、检测垃圾邮件、微新闻话题分类、预测点击率以及预测股价等。第8章是最佳实践,主要介绍机器学习方案的整个工作流的最佳实践。
本书适合Python程序员、数据分析人员、机器学习领域的从业人员以及对算法感兴趣的读者阅读。
刘宇熙是加拿大多伦多市一家跨国网络媒体公司的数据科学家,他从事消息应用优化工作。他的研究方向是社交网络挖掘、社交个性化(social personalization)、用户人口统计学特征和兴趣预测、垃圾信息监测和推荐系统。他曾在多家程序化广告投放公司工作,担任数据科学家职位,他将机器学习专业知识应用于广告优化、点击率和转化率预测、点击欺诈检测等。Yuxi拥有多伦多大学的硕士学位,研究生期间曾发表过5篇IEEE期刊文章和会议论文。他喜欢爬取网络数据,并从中获取有价值的信息。他还热衷于投资。
阿尔贝托•搏斯凯帝(Alberto Boschetti)是一名数据科学家,他的专长是信号处理和统计学。他拥有通信工程博士学位,目前在伦敦生活和工作。他每天都要面对自然语言处理(Natural Language Processing,NLP)、机器学习和分布式处理方面的挑战。他对工作充满激情,紧跟数据科学技术的最新进展,不断更新自己的知识,经常参加相关聚会、会议和其他活动。他著有Python Data Science Essentials、Regression Analysis with Python和Large Scale Machine Learning with Python等图书,以上图书均由Packt出版。
他想说:“感谢我的家人、朋友和同事。感谢开源社区。”
26年前,Python发布了1.0版本。20多年来,它全面发展,终成为一门通用型编程语言。在科学计算方面,它建立了完善的生态系统:(高性能)数值计算、数据可视化、并行和分布式计算、(大)数据存储、人工智能、机器学习、贝叶斯统计、生物信息学、地理信息学、符号数学、数论和量子系统等领域。在这些领域,Python都有相关的库或包。再来看机器学习,如今以深度学习为代表的统计机器学习,20年前已是机器学习的主流,但最近几年才真正火起来,走入大众视野。机器学习俨然成为数据技术时代的一门基础学科、一门显学。Python和机器学习的结合,在一定程度上降低了这一学科的入门难度。
机器学习有着广阔的应用前景,读到这里想必你已摩拳擦掌,跃跃欲试。本书就是要带你跑步进入Python机器学习的广阔世界,让你一览Python机器学习全景。本书将用机器学习的基础概念、完整工作流和最佳实践武装你,为你进一步学习深度学习等更深奥的技术打下基础。本书第1章统领全书,介绍Python、机器学习的基本概念和开发环境Anaconda。考虑到数据预处理占据机器学习工作量的大头,第2章通过新闻组数据集文本分析这个例子,介绍了自然语言处理、数据获取、特征抽取和数据预处理等技术。后续几章,讲解了机器学习的两大任务——分类和回归,涉及的算法有朴素贝叶斯、支持向量机、决策树、随机森林、对率回归等。作者使用的数据集有新闻组语料、安然邮件、胎心宫缩监护数据、Kaggle广告点击率预测数据和道琼斯工业指数。第8章介绍了机器学习工程的18个最佳实践,为你投入生产环境做好铺垫。
本书的一大特点是,在讲解算法的原理和用scikit-learn库封装好的方法实现算法之前,先通过几个例子,教会你具体的计算方法,让你手动实现算法。例如,讲解决策树算法之前,先教你怎么计算基尼不纯度、信息增益和熵。跟着作者的思路,拿张纸写下计算步骤,你就能彻底理解如何选取决策节点,逐层构造决策树。本书的另一特点是,书中的代码比较连贯,可直接粘贴到Jupyter Notebook中运行,这一点对初学者非常有帮助。当然,本书还是假定读者有一定的Python基础。此外,作者对公式的使用也比较克制,不会动不动拿公式来吓唬你。但你若是对公式实在感兴趣,读完本书后,可研读高维数据统计学等更偏数理统计的图书。
近几年,Python和机器学习逐渐升温,尤其是在过去的几年,深度学习、TensorFlow框架、NIPS大会、Kaggle竞赛等专业性很强的词语借助媒体铺天盖地地宣传,深入人心。其实,前几年也有一些词很热,比如云计算、移动互联网等。今天再回头看这些词,发现它们已成为信息基础设施的一部分。开发者使用的虚拟主机、视频存储空间、自然语言翻译和人脸识别服务等,无一不是云计算产品。移动互联网也已在我们的生产和生活中发力。如今外出,只需带一部手机,就能搞定问路、购票、打车、预订酒店和就餐等一系列复杂事项,这在几年前还做不到。所以,一项技术若有可能为生产力赋能,它就会很快由热词转化为实实在在的产品或服务。当非洲农民通过用TensorFlow驱动的手机应用来检测粮食作物槽有无遭受病害时,我们是不是会由衷地赞叹科技的力量?当这些技术不再热的时候,它们并未消亡,而是已走向成熟。Python和机器学习,也绝不是来蹭热点的,而是数据技术时代发展选择了它们。不管未来如何,今天开始学Python机器学习是一个很不错的选择!最好有点紧迫感,要知道小学生都开始学Python了!
感谢大洋彼岸的刘宇熙为Python社区贡献了一本机器学习的入门佳作。在翻译过程中,我向宇熙请教过多次问题。记得有次,他在上班途中,书没在身边,就让我发他截图,我发过之后,他很快就回复了我,再次向他表示诚挚的谢意。感谢人民邮电出版社陈冀康、武晓燕等为本书的编校排默默付出的各位编辑。翻译期间,我有幸旁听了北大的神经网络与深度学习、自然语言处理和计量经济学的部分内容,听到了很多新鲜的机器学习、自然语言处理概念和数学知识,在此一并表示衷心的感谢。感谢北京谷歌开发区社区举办的TensorFlow开发者峰会回顾活动。
本人学识有限,且时间仓促,书中翻译错误、不当和疏漏之处在所难免,敬请读者批评指正。
杜春晓
2020年5月23日
杜春晓,现就职于国家新闻出版广电总局出版融合发展(外研社)重点实验室,从事基于大数据的双语通识阅读生态体系建设工作,担任爱洋葱阅读产品经理。他在曲阜师范大学获得英语语言文学学士,在北京大学获得软件工程硕士学位。他的其他译著有《Python数据挖掘入门与实践》《Python数据分析实战》《机器学习Web应用》《电子达人—我的第一本Raspberry Pi入门手册》《可穿戴设备设计》等。工作之余,他喜欢到大学旁听课程、听讲座,是PyCon北京的忠实听众。新浪微博:@宜_生。
如今,数据科学和机器学习高居技术领域热词榜的前几位。人们重新燃起对机器学习的兴趣,同样的原因,数据挖掘和贝叶斯分析比以往更受欢迎。本书将带你步入机器学习的殿堂。
第1章:开始Python和机器学习之旅,本章是渴望进入Python机器学习领域的读者的起点。学完本章,你将熟悉Python和机器学习的基础知识,并在自己机器上安装和配置好必备的软件。
第2章:用文本分析算法探索20个新闻组数据集,本章解释数据获取、数据的特征和预处理等重要概念,还涵盖了降维技术、主成分分析和k近邻算法。
第3章:用朴素贝叶斯检测垃圾邮件,本章涵盖了分类、朴素贝叶斯及其详细的实现方法、分类性能评估、模型选择和调试、交叉检验。本章还会讲解垃圾邮件检测等例子。
第4章:用支持向量机为新闻话题分类,本章涵盖了多分类、支持向量机及其在新闻话题分类中的用法。本章还讨论了内核技术、过拟合和正则化等重要概念。
第5章:用基于树的算法预测点击率,本章通过解决广告点击率预测问题,深入讲解决策树和随机森林。
第6章:用对率回归预测点击率,本章深入讲解了对率回归分类器。本章还详细介绍了类别型变量编码、L1和L2正则化、特征选择、线上学习和随机梯度下降等概念。
第7章:用回归算法预测股价,本章分析如何用Yahoo/Google财经这类数据和其他可能的附加数据来预测股市行情。本章还介绍了股价预测的难点,并简要解释了相关概念。
第8章:最佳实践,本章旨在帮你查缺补漏,弥补先前章节学习的不足,做好一头扎入生产环节的准备。
认真学习和实践本书讲解的多个项目之后,读者将对Python机器学习生态系统有全面的认识。
你可以用64位架构、CPU频率为2GHz、RAM容量为8GB的机器来完成本书所有程序的开发。此外,你至少需要8GB的硬盘空间。
本书是写给渴望学习用机器学习方法研究数据科学的读者,读者应具备基本的Python编程知识。
本书使用不同的文本样式来区分不同类别的内容,以下是常用样式及其用途说明。
正文中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、URL地址、用户输入的内容和Twitter用户名,显示方式如下:
“键target_names
给出了20个新闻组的名称。”
所有的命令行输入或输出,均使用下面这种样式:
ls -1 enron1/ham/*.txt | wc -l
3672
ls -1 enron1/spam/*.txt | wc -l
1500
此图标表示警告或重要信息。
此图标表示提示或技巧。
我们热忱地欢迎读者朋友给予反馈,告诉我们你对这本书的所思所想——你喜欢或不喜欢哪些内容。大家的反馈对我们来说至关重要,将帮助我们生产读者真正需要的内容。
如果你有一般性建议的话,请发邮件至feedback@packtpub.com,请在邮件主题中写清楚书的名称。
如果你是某一方面的专家,对某个主题特别感兴趣,有意向自己创作或是与别人合著一本书,请到Packt官网查阅我们为作者准备的帮助文档。
为自己拥有一本Packt出版的书而自豪吧!为了让你的书物有所值,我们还为你准备了以下内容。
如果你是从Packt官网网站购买的图书,用自己的账号登录后,可以下载所有已购图书的示例代码。如果你是从其他地方购买的,请访问Packt网站并注册[1],我们会用邮件把代码文件直接发给你。
代码文件下载步骤如下:
(1)用邮箱和密码登录或注册我们的网站;
(2)鼠标指针移动到页面顶部的SUPPORT选项卡下;
(3)单击Code Downloads & Errata;
(4)在搜索框Search中输入书名;
(5)选择你要下载代码文件的图书;
(6)从下拉菜单中选择你从何处购买该书;
(7)单击Code Download下载代码文件。
代码下载后,请确保用以下解压工具的最新版本,解压或抽取文件。
本书的代码包也可在异步社区上下载。
即使我们竭尽所能来保证图书内容的正确性,错误也在所难免。如果你在我们出版的任何一本书中发现错误——可能是在文本或代码中——倘若你能告诉我们,我们将会非常感激。你的善举足以减少其他读者在阅读出错位置时的纠结和不快,帮助我们在后续版本中更正错误。如果你发现任何错误[2],请访问Packt官网,选择相应书籍,单击“Errata Submission Form”链接,输入错误之处的具体信息。你提交的错误得到验证后,我们就会接受你的建议,该处错误信息将会上传到我们网站或添加到已有勘误表的相应位置。
访问Packt官网,在搜索框中输入书名,可查看该书已有的勘误信息。这部分信息会在Errata部分显示。
所有媒体在互联网上都面临的一个问题就是侵权。对Packt来说,我们严格保护我们的版权和许可证。如果你在网上发现针对我们出版物的任何形式的盗版产品,请立即告知我们地址或网站名称,以便我们进行补救。
请将盗版书籍的网址发送到copyright@packtpub.com。
你这么做,就是在保护我们的作者,保护我们,只有这样我们才能继续以优质内容回馈像你这样热心的读者。
你对本书有任何方面的问题,都可以通过questions@packtpub.com 邮箱联系我们,我们也将尽最大努力来帮你答疑解惑。
[1] 注册时,输入验证码环节可能会遇到问题,验证码所用接口在国内无法访问。配套代码文件可到异步社区(http://www.epubit. com.cn)本书主页下载,而不用去Packt网站下载。——译者注
[2] 阅读本书时发现错误,可到异步社区(http://www.epubit.com/)本书主页提交勘误。——译者注
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书提供如下资源:
要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。
如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
本章从机器学习的基本概念讲起,以此开启我们的Python和机器学习之旅,这些概念虽然基础却很重要。我们首先介绍机器学习是什么,为什么需要它,并了解过去几十年它经历了怎样的发展历程。然后,我们讨论常见的机器学习任务,探索数据处理和建模的必备技术。本章是Python机器学习入门的好起点,我们寓乐于学,请相信我。学完本章,我们也将安装和配置好本书所需的软件和工具。
在本章中,我们将深入讲解以下主题。
机器学习的英文词组(machine learning)于1960年前后首次提出,该术语由两个单词组成——机器和学习,机器是指计算机、机器人或其他设备,学习是指人类所擅长的一种活动或事件模式。
那么,我们为什么需要机器学习呢?我们为什么想让机器像人那样去学习呢?因为很多问题会牵扯到大型数据集或复杂的计算,对于这种问题,最好让计算机来完成所有的工作。一般而言,计算机和机器人不会疲倦,无须睡觉,而且成本也许还更低。还有一种新兴的思想流派,名为主动学习(active learning)或人类参与的学习(human-in-the-loop),它倡导将懂得学习的机器和人的成果结合起来。该思想认为有些枯燥的例行工作更适合用计算机处理,创造性任务则更适合交由人处理。根据这种理念,机器按照人设计的规则(或算法)去学习,并完成本期望由人完成的重复性的任务和某些逻辑推理任务。
机器学习不涉及使用业务规则的传统类型的编程。有一个广为流传的说法,说世界上大部分代码要处理的简单规则,很可能已用Cobol语言实现,这些Cobol代码覆盖了大部分的可能的职员的交互场景。既有此先例,我们为何不雇佣很多软件程序员,继续编写代码,实现新规则?
原因之一是随着时代的发展,定义、维护和更新规则的成本越来越高。一项活动或事件,可能的模式也许数不胜数,因而穷尽所有情况不现实。动态发展、一直处于变化中或实时演进的事件,为其编写规则的难度更大。而开发学习规则或算法,让计算机从海量数据中学习、抽取模式和理解数据之间的关系则更简单,效率更高。
另一个原因是数据量呈指数级增长。如今,文本、音频、图像和视频数据的洪流滚滚而来,我们难以洞察它们。物联网(Internet of Things,IoT)是最近发展起来的一种新型因特网,它要打通日常生活所用的各种设备。物联网将把家用设备和自动驾驶汽车的数据推至数据处理的前沿阵地。当今,一般公司大多数职员是活生生的人,但也不全是,比如社交媒体公司往往拥有很多机器人账号。该趋势很可能会持续下去,机器人越来越多,它们之间的沟通也会多起来。不仅是数量,数据的质量在过去几年随着存储价格的下降也在不断提升。这些因素为机器学习算法和数据驱动的解决方案的演进,提供了强有力的支持。
阿里巴巴集团的马云(Jack Ma)在一次演讲中解释道,信息技术(Information Technology,IT)是过去20年和现在的重头戏,接下来30年,我们将过渡到数据技术(Data Technology,DT)时代。在信息技术时代,计算机软件和基础设施的发展,使得很多公司得以成长壮大。如今,大多数行业的公司已积攒了海量数据,现在该利用数据技术洞察数据、找出模式、推动新业务成长了。概括而言,机器学习技术使得公司不仅能够更好地理解顾客的行为,与顾客打成一片,还能借此优化运营管理。我们个人也享受到了机器学习技术带来的日常生活的改善。
我们都熟悉的一种机器学习应用是垃圾邮件过滤;另外一种是在线广告,投放信息类型广告的广告主利用从我们这里收集的信息,自动投放广告。别“换台”,坚持看下去,后续章节我们将学习如何研制算法来解决这两个问题。我们离了几乎没法生活的一种机器学习应用是搜索引擎,它利用信息检索技术,解析我们要寻找的信息,查询相关记录,并按照话题相关度和个人的喜好为网页排序,这两种排序方式分别称为基于上下文的排序和个性化排序。电子商务和媒体公司一直处于推荐系统应用的前沿,它们帮助顾客更快找到商品、服务和文章。机器学习应用无处不在,我们每天都会听到由它驱动的新应用出现的消息,比如信用卡欺诈检测、疾病诊断、总统选举预测、实时语音翻译、机器人顾问等,真是应有尽有!
1983年上映的电影《战争游戏》(War Games)中,一台计算机做出的关乎生死的决策,可能会引爆第3次世界大战。据我们所知,机器学习技术目前还不能赢得这种风头。然而,1997年深蓝超级计算机确实击败了一名国际象棋冠军。2005年,斯坦福大学研制的自动驾驶汽车在荒漠中自动行驶了209km[1]。2007年,另一团队研制的自动驾驶汽车在市区常规交通的场景中行驶了80km以上。2011年,Watson计算机战胜人类对手,赢得智力竞赛。2016年,“阿尔法狗”(AlphaGo)程序击败了世界上最厉害的围棋大师。如果计算机硬件被认为是限制因素,那么我们可推断未来机器智能还会有新的突破。Ray Kurzweil正是这么推断的,他认为2029年前后,机器能达到人的智力水平。那再以后呢?
机器学习模仿人类的思维方式,是人工智能的一个分支,而人工智能研究系统的创建,属于计算机科学领域。软件工程是计算机科学的另一领域。通常,我们可将Python编程看作软件工程的一种类型。机器学习还与线性代数、概率论、统计学和数学优化密切相关。我们通常根据统计学、概率论和线性代数建立机器学习模型,然后用数学优化方法优化模型。本书的大部分读者,应该具备足够的Python编程知识。对自己的数学知识不够自信的读者,也许想知道应花多少时间学习或复习前面提到的这些学科。不要慌。本书在不深入任何数学细节的情况下,就能让读者把机器学习算法运行起来,从而解决各种任务。本书只要求读者具备一些很基础的概率论和线性代数的知识,这些知识有助于理解机器学习技术和算法的原理。书中所讲的每个模型,我们首先都会手动从头实现,然后再用流行的Python机器学习库和包提供的方法实现。Python这门语言也是大家喜欢和熟悉的,因此本书学起来比较容易。
你若想系统地研究机器学习,可攻读计算机科学、人工智能或近年推出的数据科学硕士学位。此外,你也可以考虑各种数据科学训练营。然而,训练营的选择通常更受限制,它们更偏向就业,项目周期往往只有4到10周,比较短。另外,你也可以从免费的大规模开放在线课程(MOOC)平台学习,比如吴恩达(Andrew Ng)的机器学习课程就很受欢迎。最后,业界的一些博客和网站也是很棒的资源,我们可从中了解机器学习的最新发展。
机器学习不仅是一项技能,它也有点运动的属性。我们可参加多种机器学习比赛:有时是为了可观的奖金,有时是为了快乐,大多数时候是为了提升能力。然而,要赢得这些比赛,我们也许要用到一些特殊的技巧,而这些技巧只适用于比赛。要解决真实的业务问题,它们就派不上用场了。这没问题,“天下没有免费的午餐”定理在这里也适用。
机器学习系统以数据作为输入,数据可以是数值、文本、视频或音频类型。系统通常会有输出,输出可以是一个浮点型数字,比如自动驾驶汽车的加速度,也可以是表示类别(category,亦称class,译为类)的一个整数,比如识别图像中的形象是猫还是狗。
机器学习的主要任务是探索和构造算法,从历史数据中学习,对新输入的数据作预测。对于数据驱动的方案,我们需要定义(或算法帮我们定义)一个损失函数(loss function)或代价函数(cost function),用这个评估函数度量模型的学习能力有多强。在建模阶段,我们建立一个最优化问题,以实现效率最高和最有效的学习方式为目标。
根据所学数据的性质,机器学习可大致分为以下3类。
一下子讲这么多抽象概念,是不是感觉有点迷糊?别担心。后续章节我们将会介绍这几种机器学习任务的具体例子。第2章,我们要完成一个无监督学习任务,并探索多种无监督学习技术和算法;第3章到第6章,我们将学习一些有监督学习任务和几种分类算法;第7章,我们继续介绍另一种有监督学习任务——回归,并学习各式各样的回归算法。
实际上,机器学习算法有多种,它们的受欢迎程度随时间而改变。我们大致可将其分为4大类:基于逻辑的学习、统计学习、人工神经网络和遗传算法。
最初,占主导地位的是基于逻辑的学习系统。该类系统用人类专家确定的基本规则,尝试利用形式逻辑、背景知识和假设进行推理。20世纪80年代中期,人工神经网络(Artificial Neural Network,ANN)异军突起,但20世纪90年代,它又被统计学习系统推到一边。人工神经网络模仿动物大脑,它由相互连接的神经元组成,这些神经元模仿的也是生物的神经元。这类系统尝试为输入和输出之间的复杂关系建模,从而捕获数据中的模式。遗传算法(Genetic Algorithm,GA)流行于20世纪90年代,它模仿生物进化过程,试图利用变异和交叉等方法,寻找最优方案。
当前(2017年)正在经历一场深度学习(deep learning)的革命,我们也可将其看作神经网络的品牌再造。深度学习这一术语发明于2006年附近,指的是包含多层的深度神经网络。深度学习之所以能够取得突破,整合和利用图像处理单元(GPU)功不可没,它可以大幅提升计算速度。GPU原本是为渲染视频游戏而设计的,很擅长处理并行矩阵和向量代数。深度学习类似于人类的学习方式,因此我们利用机器学习技术也许有可能实现具备感知能力的机器。
你也许已听说过摩尔定律——计算机硬件的性能随时间呈指数级提升,这是一个经验观测值。该定律首先由英特尔的联合创始人Gordon Moore于1965年提出。根据摩尔定律,一块芯片上的晶体管数量,每两年[2]翻一番。由图1-1可见,摩尔定律很好地经受住了时间的考验(气泡的大小代表同时期GPU中晶体管数量的平均值):
图1-1 摩尔定律&晶体管数量
GPU中晶体管数量的增长趋势,似乎表明摩尔定律应该在几十年内依然有效,前面提到Ray Kurzweil预测2029年实现真正的机器智能,这么说来有一定的可信性。
我们有海量数据可利用,这可是件大好事,但揪心的是,这些数据难以处理。数据的多样性和噪音是难点所在。人类通常会处理耳朵和眼睛感知到的数据。这些输入被转换为电子或化学信号。从非常底层的角度讲,计算机和机器人处理的也是电子信号。这些电子信号又被转换为1和0。然而,本书使用Python语言编写程序,在这一层级,我们通常将数据表示为数字、图像或文本。实际上,图像和文本不太容易处理,因此我们需要将其转换为数值。
尤其是有监督学习这种情况,我们所面对的场景与备考学习相仿。我们要做很多练习题,最后要参加真正的考试。考试时,我们应该能够在不知道答案的情况下回答问题。这称为泛化(generalization)——从练习题学得知识,希望能将其应用到其他相似问题。再回到机器学习,这些练习题对应的是训练集(training set)或训练样本(training sample),模型正是从这里面找出模式。实际考试对应测试集(testing set)或测试样本(testing sample),也就是模型最终的用武之地,模型是否名副其实,一试便知。在做练习题和参加实际考试之间,我们还要参加模拟考试,以评估我们在真实考试中表现如何,从而帮助我们复习。这些模拟考试对应于机器学习中的验证集(validation set)或验证样本(validation sample)。它们帮助我们验证模型在模拟环境中性能如何,以便我们微调模型,争取获得更好的效果。
传统的程序员,一般会在跟业务分析师或其他专家讨论后,实现一条规则,比如编写税收规则,或者新增一个值,这个值又乘上另一个值。在机器学习场景中,我们向计算机提供输入值和输出值的示例。或者,如果野心更大的话,只提供实际的税收文件也行,让机器自己把处理数据的任务也做了,就像自动驾驶汽车不需要人提供很多输入一样。
在机器学习场景中,我们所做的其实是寻找某个函数,比如税收公式。物理研究的情况与我们所面临的情形几乎相同。我们想知道宇宙的运行机制,并用数学语言来表示其中的规律,但不知道确切的函数是什么,我们所能做的是度量构造的函数产生的误差有多大,并尝试最小化误差。在有监督学习任务中,我们比较所得结果和预期结果之间的差异。在无监督学习中,我们用相关的度量标准来度量学习结果的成败与否。比如,我们希望分成的几个簇合乎道理,度量标准可以是同一簇内数据点的相似度有多高,不同簇的数据点的差异有多大。在增强学习中,程序评估自身的移动,比如象棋比赛用事先定义好的函数来评估走子所带来的回报。
过拟合(overfitting)这个概念很重要,因此我决定还是早点讲。
接前面备考的例子,我们若是做了大量习题,即使是跟考试科目无关的习题,我们也能总结出解答方法。比如,给定5道习题,我们发现题干中只要提到两个土豆和一个西红柿,答案总是A,题干只要提到一个土豆和三个西红柿,答案总是B,然后,我们据此得出结论,这个规则普遍适用,之后再遇到类似问题,即使科目或答案本与土豆或西红柿无关,我们仍沿用该规则。更糟糕的是,我们甚至可能会死记硬背,逐字逐句地把题目和答案都记在脑子里,这样我们能在练习中得高分。我们这样做,自然希望实际考试的试题跟练习题相同。然而,在实际考试中,我们得分很低,因为考试题目跟平常练习相同的情况,实属罕见。
记忆这种现象可能会引发过拟合。我们从训练集抽取过多信息,模型只是在训练集上能取得很好的效果,该现象在机器学习中称为低偏差(low bias)。然而,从训练集抽取过多信息无助于我们将数据泛化,找出蕴藏其中的模式,因此所得模型在之前从未见过的数据集上表现较差,该现象称为高方差(high variance)。
当我们尝试根据数量相对较少的观察数据而不是数据之间的潜在关系来描述学习规则时,就会产生过拟合,比如前面土豆和西红柿那个例子。我们尝试建立极其复杂的模型,并拟合每个训练样本,也会导致过拟合,比如前面记住所有问题的答案这种情况。
与过拟合相对的是欠拟合(underfitting)。欠拟合的模型不仅在训练集上表现不好,在测试集上的表现也不好,它没能捕捉数据蕴藏的模式。训练模型使用的数据量不够,就可能导致欠拟合,就好比是我们看的复习资料不够多,考试会挂科一样;训练的模型,相对数据而言是错误的,也会导致欠拟合,这就好比我们的思路有误,学习方法不对,那么不论练习还是最后的考试分数都很低。这在机器学习中称为高偏差(high bias),即使模型在两个数据集上的方差都很低。方差低是因为模型的性能在训练集和测试集上同样糟糕。
过拟合和欠拟合,我们都想避免。偏差的根源是学习算法的错误假设,高偏差导致欠拟合。方差度量的是模型的预测能力对数据集变动的敏感程度。因此,我们需要避免偏差或方差升高的情况。那么,这是否意味着我们应该总是控制偏差和方差,使其尽可能低?我们能做到的话,答案是肯定的。但在实际应用中,两者是很明显的此消彼长的关系。这就是所谓的偏差—方差权衡(bias-variance tradeoff)。听起来很抽象?我们来看看下面这个例子吧。
我们接到一个任务,根据电话调查数据来预测一位候选人当选下一届总统的概率。电话调查是按照邮政编码开展的。选中一个邮政编码,从该地区的调查数据中随机抽取样本,预估候选人有61%的可能性当选总统。但实际结果却是候选人落选了。那么,我们的模型错在哪里?首先想到的是,预估时我们只使用了一个地区的少量样本,这是高偏差的根源。另外,同地区的人往往具有相似的人口统计学特征。然而,这却使得估计结果的方差较小。那么,使用多个地区的样本是否就能解决这个问题?是的,但不要高兴得太早。因为,这同时也许会增加估计的方差。我们需要找到最佳的样本量和地区数量,将总体偏差和方差降至最小。最小化模型的总误差,需要仔细权衡偏差和方差。给定一组训练样本,,…, 及其目标值,, …, ,我们想找到一个回归函数,尽可能准确地估计真正的关系。用均方误差(Mean Squared Error,MSE)来度量估计的误差和回归模型的好坏:
表示期望。误差可分解为偏差和方差两部分,推导方法如下(理解该推导过程,需要一点概率论的基础知识):
偏差项度量的是估计的误差,方差项描述的是估计值在均值周围的波动情况。学习模型越复杂,训练样本量越大,偏差就越低。然而,为了更好地拟合数据点的增加,模型的漂移会越来越大。因此,方差就会增大。
我们通常采用交叉检验[3](cross-validation)技术来衡偏差和方差,寻找最优模型,并且降低过拟合。
最后一项[4]是不可降误差(irreducible error)。
前面例子提到,在练习和考试之间,可能有模拟考试,我们可借此评估自己在实际考试中的表现,有必要的话,勤加复习。切换到机器学习场景,验证过程帮助我们在模拟环境中评估模型泛化到独立于训练集之外或未见到的数据集的能力。验证过程,传统的做法是将原始数据集切分为3个子集,通常训练集用60%的样本,验证集和测试集各用20%。若切成3个子集后,训练样本量够多,并且我们仅需大体估计模型在模拟环境的性能,这样做就可以。否则,最好使用交叉检验。
交叉检验的每一轮都将原始数据集切分为训练集和测试集(或验证集)两个子集,分别用作训练和测试,并记录在测试集上的性能。同理,多轮交叉检验在多次切分得到的不同的子集上进行训练和测试。最后,对所有轮得到的测试结果取均值,这能更加准确地估计模型的性能。交叉检验有助于降低方差,因而能抑制过拟合等问题。
目前常用的交叉检验方案主要有两种:彻底和不彻底的交叉检验。彻底的交叉检验,每一轮留出固定数量的观察数据作为测试(或验证)样本,将剩余观察数据作为训练样本。重复该过程,直到所有可能的不同样本子集都测试了一遍。例如,我们可采用留一法交叉检验(Leave-One-Out-Cross-Validation,LOOCV),每个样本仅在测试集出现一次。大小为的数据集,留一法要求轮交叉检验。随着的增大,速度会变慢。
不彻底的交叉检验,顾名思义,不去尝试所有可能的切分方法。该方案使用最多的方法是折交叉检验(k-fold cross-validation)。将原始数据集随机切分为大小相同的折。每一轮检验,用其中的一折测试,其余各折用于训练。我们重复该过程次,使得每一折都用作一次测试集。最后,我们对折的测试结果取均值,以此度量模型的性能。常取3、5或10。表1-1展现了5折交叉检方案的测试集和训练集的分配情况:
表1-1 5折交叉检验测试集和训练集的分配情况
迭代 |
第1折 |
第2折 |
第3折 |
第4折 |
第5折 |
---|---|---|---|---|---|
1 |
测试集 |
训练集 |
训练集 |
训练集 |
训练集 |
2 |
训练集 |
测试集 |
训练集 |
训练集 |
训练集 |
3 |
训练集 |
训练集 |
测试集 |
训练集 |
训练集 |
4 |
训练集 |
训练集 |
训练集 |
测试集 |
训练集 |
5 |
训练集 |
训练集 |
训练集 |
训练集 |
测试集 |
我们亦可多次随机地将数据集切分为训练集和测试集。该方法的学名叫留出法(holdout)。该算法存在的问题是,一些样本可能从未出现在测试集,而另一些也许已选入测试集多次。嵌套交叉检验(nested cross-validation)也很重要,它综合了多种交叉检验方法。它包括两个阶段:
在第3~7章,我们将大量使用交叉检验。在这之前,先通过下面这个例子,看看交叉检验是怎么回事,以帮助我们更好地理解。
一位数据科学家计划开车上班,他的目标是每天9点前到工作地点。他需要确定出门时间和开车路线。他分别在每周的周一、周二和周三尝试这两个参数的不同组合,每次尝试后,他都记录下到达的时间。然后,他找出最佳的出行方案,每天遵照执行。然而,这套方案并没有预期那么好。结果表明日程模型过拟合每周前3天的数据点,但是对于周四和周五的数据点拟合程度一般。更佳的方案应该是,从周一到周三数据集上得到的参数,需要在周四和周五的数据集上测试它们的表现,并以类似的方式,用不同的工作日作为训练集和测试集,重复该检验过程。这种类似于交叉检验的方法,可确保选择的出行方案适用于一周的每一天。
总而言之,交叉检验整合模型在数据集的不同子集上性能的度量结果能更准确地评估出模型的性能。这种技术不仅能降低方差,避免过拟合,还能洞察模型在实际应用中的大体表现。
另一种防止过拟合的方法是正则化(regularization)。前面讲过,模型不必要的复杂度是过拟合的原因之一。交叉检验是消灭过拟合的一种常见技术,而正则化同样可以避免过拟合,它为我们努力最小化的误差函数增加额外的参数,以惩罚复杂的模型。
根据奥卡姆剃刀(Occam’s Razor)原则,更简单的方法更受欢迎。William Occam是一位修士,也是一位哲学家。1320年前后,他提出了拟合数据的最简单的假设是最好的这一想法。能够支持这一想法的一个事实是,我们能发明的简单模型比复杂模型要少。例如,我们凭直觉知道高次多项式模型比线性模型要多。原因在于,一条直线()只受两个参数约束——截距和斜率。一条直线取所有可能的参数,构成的是一个二维平面。二次多项式的二次项增加了一个额外的系数,二次多项式取所有可能的系数,构成一个三维空间。因而,寻找一个高次多项式函数作为模型,完美捕捉所有参与训练的数据点会更容易,因为它的搜索空间比线性模型大得多。然而,这些很容易得到的模型的泛化能力,比线性模型差远了,它们更容易导致过拟合。当然,更简单的模型,计算时间也少。图1-2展示了如何用高次多项式函数和线性函数拟合数据。
图1-2 用高次多项式函数和线性函数拟合数据
线性模型更可取,因为对于从潜在的分布中抽取的更多数据点,线性模型的泛化能力也许更强。我们可使用正则化来惩罚多项式的高次项,从而降低其影响。这将会牺牲复杂度,甚至导致从训练数据中学到的规则不那么准确和严格。
从第6章开始,我们将频繁使用正则化。现在,先来看看下面这个例子,对照着它能加深我们对正则化的理解。
一位数据科学家想赋予他的机器看门狗识别陌生人和朋友的能力。他向看门狗输入如表1-2所示的访客学习样本。
表1-2 访客学习样本
男性 |
年轻 |
高 |
戴眼镜 |
穿灰衣服 |
朋友 |
---|---|---|---|---|---|
女性 |
中年 |
中等 |
不戴眼镜 |
穿黑衣服 |
陌生人 |
男性 |
年轻 |
矮 |
戴眼镜 |
穿白衣服 |
朋友 |
男性 |
老年 |
矮 |
不戴眼镜 |
穿黑衣服 |
陌生人 |
女性 |
年轻 |
中等 |
戴眼镜 |
穿白衣服 |
朋友 |
男性 |
年轻 |
矮 |
不戴眼镜 |
穿红衣服 |
朋友 |
看门狗也许很快就学到了以下规则:任何不戴眼镜、穿黑衣服、中等个的中年女性都是陌生人;任何不戴眼镜、穿黑衣服、矮个老年男性都是陌生人;其他人则都是主人的朋友。虽然这些规则可以完美地拟合训练数据,但是它们太过于复杂,无法很好地泛化到新访客。相反,这位数据科学家可以限制学习内容。一条能很好地适用于成千上万名新访客的宽松规则可以是:任何不戴眼镜、穿黑衣服的都是陌生人。
除了惩罚复杂度,我们还可以早点停止训练过程,将其作为一种正则化方法使用。限制模型的学习时间,或者设置一些内部的停止规则,这些规定有助于我们生成一个更为简单的模型,从而控制模型的复杂度,降低过拟合的可能性。用机器学习术语来讲,该方法叫作提前停止(early stopping)。
最后一点也很重要,正则化应该适度,或更确切地说,应精心调试到最佳水平。正则化的惩罚力度太小,不起作用,但太大又会使得模型偏离实际情况,导致欠拟合。本书主要在第6章和第7章,探讨如何实现最优的正则化效果。
我们通常将数据表示为数字网格(矩阵)。每一列表示一个变量,机器学习中将其称为特征。在有监督学习问题中,数据矩阵的一个变量实际上不是特征,而是要预测的标签,矩阵的每一行是可用作训练或测试的样例。特征的数量与数据的维度相等。采用哪种机器学习方法,取决于数据的维度和样例的数量。例如,文本和图像是高维数据,而股票市场数据的维度相对较少。若拟合高维数据,则计算开销很大,并且由于复杂性高,很容易发生过拟合现象。而高维数据无法可视化,因而在遇到问题时简单的诊断方法不适用。
不是所有特征都有用,它们也许只会给我们的结果增加随机性。因而,选取好的特征往往很重要。特征选取是指从所有特征中挑选出显著特征子集,以建立更佳的模型。在实际应用中,并不是数据集的每个特征都蕴含有助于区分样本的信息;有些特征不是冗余就是不相关,抛弃它们损失的信息很小。
原则上讲,特征选取可归结为多个二分类问题:是否包含一个特征。若有个特征,我们就有个特征集,特征很多的话,特征集的数量非常大。例如,数据集有10个特征,就有1024个可能的特征集(比如,对于决定穿什么衣服这个任务,特征可以是气温、下雨、天气预报和要去哪里等)。特征数达到一定的量,再靠蛮力使用所有特征,就不切实际。在本书第6章中,我们将讨论更好的特征选取方法。基本上,我们有两种选择:要么一开始使用所用特征,再以迭代的方式删除特征,或者我们从最少量的特征开始,迭代增加特征。每次迭代只使用最佳特征集,然后比较它们的效果。
另一种常用的降维方法是,将高维数据转换到低维空间中。这种转换会损失信息,但是可将损失降至最低。稍后,我们还会更加详细地讲解该方法。
风靡于20世纪90年代的数据挖掘(data mining)是数据科学(研究数据的科学)的前身。数据挖掘社区常用的一种方法叫作跨行业数据挖掘标准流程(Cross Industry Standard Process for Data Mining,CRISP DM)。该流程发明于1996年,沿用至今。之所以提到CRIS DM,我不是要为其背书,而是因为我喜欢它的总体框架。CRISP DM包括以下几个不相互排斥、可并行处理的阶段。
我们要学习,就得有高质量的学习材料。我们无法从文理不通的材料中学习,我们会自动忽略毫无意义的内容。机器学习系统,无法识别文理不通的材料,因此我们需要帮它清洗输入数据。大家常说清洗数据占据机器学习工作量的大头。有时,别人为我们清洗数据,但你不能以为这就万事大吉了。我们只有熟悉数据,才能确定数据的清洗方式。在一些项目中,我们尝试自动探索数据,做一些智能化加工,比如生成报告。但不幸的是,目前尚无可靠的方案,有些工作你还得自己做。
我们可以做两件事:一是扫描数据,二是可视化数据,它们并不互斥。两者取决于所要处理的数据的类型,即我们拿到的数据是否是数字网格、图像、音频、文本或其他类型。数字网格是最便于处理的格式,我们总是努力将其他形式的特征转换为数值特征。在本节后续内容中,我假定有一个各元素为数字的表格。
我们想知道特征是否含有缺失值,以及特征值的分布和特征的类型。特征值可能近似服从正态分布、二项分布、泊松分布或其他分布。特征可以是二值型:是或否、积极或消极等。特征也可以是类别型:属于某个类别,比如哪个大洲(非洲、亚洲、欧洲、拉丁美洲、北美洲等)。类别型变量也可以是有序的——比如高、中等和低。特征也可以是定量的,比如用度数表示的温度,或用美元表示的价格。
特征工程(feature engineering)是指创建或改造特征的过程。它更像一门暗黑艺术而不是科学。特征通常是根据常识、领域知识或先前的经验来创建。创建特征当然有一些通用的技术,然而却并不能保证新创建的特征能改善模型的结果。有时,我们可将无监督学习分成的簇作为额外特征。深度神经网络往往能够自动创建特征。
某些特征的值可能丢失,这种现象很常见,原因多种多样,比如不方便收集每个样本的每个特征值,即使方便收集但成本很高,或是因为每个样本的每个特征根本不可能都有值,也可能是因为过去我们没有合适的设备,无法度量某一特定的量,或者我们当时根本不知道哪个特征是相关的。这些原因固然存在,但事实是缺失了以往的部分数据影响了我们当前的工作。有时,我们很容易就能发现我们缺失数据,只要扫描数据,或者统计某个特征的特征值数量,然后拿它与我们期望的特征值数量(也就是行数)相比,就能发现有无缺失值。一些系统用其他数值代替缺失值,比如用999 999。若合法的特征值远小于999 999,这样做是合理的。幸运的话,数据文件的创建者还会以数据字典或元数据的形式给出特征的相关信息,从中可了解是否有缺失值。
我们一旦知道缺失数据,问题就变为如何处理这些缺失值。最简单的做法是直接忽略它们。然而,一些算法无法处理缺失值,程序遇到缺失值时就会停止运行。还有些情况会忽略缺失值,导致得到的结果不准确。另一种方案是用固定的值代替缺失值——该方案称为插值(imputing)。
我们可用一个特征所有合法特征值的算数平均数、中位数或众数插值。最理想的是,几个特征之间或一个特征变量各取值之间存在某种可靠的关系。比如,我们知道某个地区每个季节的平均气温,就能为给定日期缺失的气温插一个估计的值。
人类能够处理多种类型的数据。与之不同的是,机器学习算法要求数据是数值型。举个例子,我们若向算法输入Ivan这样的一个字符串,除非我们使用特制的软件,否则程序不知道该做什么。我们或许可将要处理的姓名看作类别型特征。我们可考虑将每个独一无二的姓名看作一个标签。(该例中,我们还需考虑如何处理大小写——是否将Ivan和ivan看作同一个特征值)然后,我们可用整数—标签编码(integer-label encoding)替换每一个标签。这种方法可能会带来问题,学习者也许会认为标签之间是有顺序的。
一位有效编码(one-of-K或one-hot-encoding)方案使用虚拟变量(dummy variable)来为类别型特征编码。它最初应用于数字电路。虚拟变量就像二进制的位,可能的取值只有两个——1或0(等价于真或假)。比如,我们要为五大洲编码,可以创建几个虚拟变量,比如is_asia(是亚洲),如果该洲是亚洲,那么该变量的值为真,反之为假(见表1-3)。一般而言,虚拟变量的数量为独一无二的标签数量减去1。虚拟变量是互斥的,因此我们可以根据虚拟变量的值自动确定其中一个标签。如果所有虚拟变量都为假,那么正确的标签就是我们没有为其创建虚拟变量的那一个标签。
表1-3 为五大洲编码
是亚洲 |
是欧洲 |
是非洲 |
是美洲 |
是大洋洲 |
|
---|---|---|---|---|---|
亚洲 |
真 |
假 |
假 |
假 |
假 |
欧洲 |
假 |
真 |
假 |
假 |
假 |
非洲 |
假 |
假 |
真 |
假 |
假 |
美洲 |
假 |
假 |
假 |
真 |
假 |
大洋洲 |
假 |
假 |
假 |
假 |
真 |
编码后生成的矩阵(数字网格)包含大量的0(假值)和少量的1(真值)。这种矩阵称为稀疏矩阵。SciPy包能很好地处理稀疏矩阵,因此稀疏矩阵应该不是个大问题。本章稍后将介绍SciPy包。
不同特征的取值,数量级可能不同。有时,这意味着较大的值会支配较小的值,具体取决于我们使用的算法。一些算法要求我们调整数值范围才能正常工作。调整数据范围的常用策略如下。
假如有两个特征和,我们怀疑这两个特征和预测结果之间存在多项式关系,比如。我们可将该多项式中的每一项作为一个特征,那么我们就有3个特征。和的乘积称为交互项(interaction)。交互项不一定是乘积的形式,虽然乘积是最常见的,但也可以是和、差或比值的形式。我们若用比值的形式,为避免被0除,我们应该为除数和被除数增加一个很小的常数。在多项式关系中,特征的数量和多项式的次数是没有限制的。然而,若是遵照“奥卡姆剃刀”原则,我们应该避免使用高次多项式和很多特征的交互项。在实际应用中,复杂的多项式关系往往难以计算,并且不会增加多大价值,但你若确实想得到更好的结果,可以考虑使用多项式特征。
幂次转换(power transform)函数是指将数值特征转换为更易于操作的形式的函数,比如将数值特征转换为更贴近正态分布的形式。量级不同的数值,经常用的转换方法是取对数。考虑到0 和负数的对数没有定义,在取对数前,我们需要为相关特征的特征值加上一个常数。正数我们也可以取平方根,当然也可以用它们的平方形式,或其他需要的任意次幂。
另一种常用的转换方法是Box-Cox转换,它是以发明者的名字命名的。Box-Cox转换试图寻找最佳幂次,将原始数据转换为接近正态分布的数据。该转换方法的定义如下:
有时,将特征值分到几个面元(bin)很有用。例如,我们也许只关注某天是否会下雨,而不关心下得多大。若给定降雨量,我们可将其二值化,如果降水量不为0,特征值为真,反之为假。我们还可以用统计学方法将特征值划分为高、低和中等3个面元。
划分面元(binning)的过程不可避免地会损失信息。然而,这也许不是问题,实际上这还会降低过拟合的可能性,具体取决于你的目标。当然,划分面元也会提升速度,消耗更少的内存或存储。
(中学)学生时代,我们和其他同学坐在一起,相互学习,但是考试时就不能这样了。原因当然是老师想知道我们学得怎么样,若是只抄袭同学的答案,我们也许什么都学不到。但毕业后,我们发现团队合作很重要。例如,本书就是整个团队,甚或是几个团队共同努力的结果。
一个团队显然比个人单打独斗能取得更好的结果。然而,这却违背了“奥卡姆剃刀”原则,因为比起一个团队,个人能提出更简单的理论。但是在机器学习领域,我们却更喜欢按以下策略综合利用多个模型:
自助聚集(bootstrap aggregating)或装袋法(Bagging)是Leo Breiman于1994年提出的一种算法,该算法采用Bootstrapping方法解决机器学习问题。Bootstrapping是一系列的统计学步骤,它对已有数据有放回地采样,生成数据集。Bootstrapping可用于分析算数平均数、方差或其他统计量可能的取值。
该算法用以下步骤降低过拟合的可能性。
(1)对输入的训练数据有放回地采样,然后生成新的训练集。
(2)用每次新生成的训练集拟合模型。
(3)利用平均法或绝对多数投票法(majority voting),综合考虑多个模型的结果。
对于有监督机器学习,我们将仅稍微好于基准(比如随机分类或使用均值)的学习器称为弱学习器。弱学习器就像蚂蚁一样,虽然单个作战很弱,但是组合在一起就能实现令人意想不到的结果。我们综合使用多个学习器时,可根据其学习能力赋予不同的权值。这种思想称为增强(boosting)。Boosting算法有多种,它们之间的主要区别是权值策略不同。若是有备考经历,你也许已采用过类似的策略,比如找出不太会做的习题,把复习重点放在这些难题上。
识别图像中的脸部,使用的是一种专用框架,它也用到了Boosting算法。检测图像或视频中的人脸是一种有监督学习。我们为学习器提供的是包含人脸区域的示例。但两个类别的样本数不均衡,不包含人脸的区域通常更多(大约是包含人脸区域的1万倍之多)。在学习过程中,一组分类器逐步过滤掉不包含人脸的区域。在每轮迭代中,分类器使用更少图像窗口的更多特征。该算法的思路是,将大部分时间用在包含人脸的图像区域上。在人脸识别应用场景下,Boosting是用来选取特征和整合结果的。
Stacking方法将机器学习估计器的输出输入另一算法中。当然,你可以将更高层级算法的输出输入到另一个预测器中。使用任意的拓扑结构都是可以的,但出于实际考虑,应首先尝试简单的结构,这里同样要遵照“奥卡姆剃刀”原则。
Blending方法是赢得Netflix比赛100万美金的获胜者提出的。Netflix公司举办电影推荐比赛,参赛选手需找出向公司用户推荐电影的最佳模型。Netflix用户可为电影评1到5星,作为对电影的印象分。用户显然不可能为每部电影都打分,因此用户的电影打分矩阵是稀疏矩阵。Netflix公开了隐去用户名的训练集和测试集。后来研究者找到一种方法,将Netflix数据和IMDB数据关联起来。出于隐私考虑,Netflix不再公开他们的数据集。2008年,几个团队将他们的模型组合起来,赢得了比赛。Blending是Stacking的一种形式。但Blending最终的估计器只用一小部分训练数据训练。
我们可用绝对多数投票法(majority voting)或平均法(averaging)得到最终结果。我们也可以为集成的几种模型赋予不同的权值。对于平均法而言,我们可以用几何平均或调和平均代替算数平均。通常,综合考虑几个高度相关的模型的结果不会带来太大的改善。模型之间最好有差异化,我们可使用不同的特征或算法来建模。若发现两个模型强相关,可从集成学习中删除其中一个模型,将所删除模型的权值加到与之强相关的模型上去。
在本书的大部分项目中,我们要用到scikit-learn和matplotlib。这两个包依赖于NumPy,如前所述,处理稀疏矩阵还要用到SciPy。机器学习库scikit-learn在性能上做了优化,大部分代码的运行速度与其C语言的实现相当,NumPy和SciPy亦是如此。提升代码速度的方法有很多,但是它们超出了本书的讲解范围,如欲了解更多,请参考相关文档。
matplotlib包用于绘图和可视化。可视化还可以使用seaborn包。Seaborn包底层使用matplotlib。Python还有几个可视化包,它们适用于不同的使用场景。matplotlib包和seaborn包主要用于中小规模数据集的可视化。NumPy包提供了ndarray类和多种实用的数组函数。ndarray类可以实现一维或多维数组。该类还有多个子类,可表示矩阵、掩码数组(masked array)和异构记录阵列(heterogeneous record array)。从事机器学习工作的人员主要用NumPy数组存储特征向量或由特征向量组成的矩阵。SciPy使用NumPy数组,提供多种科学和数学函数。若处理数据,我们还要用到pandas库。
本书将使用Python 3。你也许知道,官方自2020年起不再支持Python 2,因此我强烈建议你切换到Python 3。你若是坚持使用Python 2,修改示例代码,应该也能运行。依我之见,Anaconda Python 3是最佳选择。Anaconda是Python的一个免费发行版,适用于数据分析和科学计算。它有自己的包管理器conda。该发行版囊括了200多个Python包,使用起来很方便。对于普通用户,Miniconda发行版也许是更佳选择。Miniconda内置了conda包管理器和Python。
Anaconda和Miniconda的安装步骤类似。显然,Anaconda占的硬盘空间更多。按照Anaconda官网提供的指南安装即可。首先,根据你的操作系统选择合适的安装包,请留意Python的版本。你还可选择安装界面GUI或命令行的安装包。我使用Python 3安装包,虽然我系统的Python版本是2.7。这样做是可以的,因为Anaconda内置了自己的Python。安装后,Anaconda在home目录下生成一个anaconda目录,大约900MB。Miniconda安装程序则会在home目录下生成miniconda目录。NumPy的安装指南请见官网。
你还可以用pip安装NumPy:
$ [sudo] pip install numpy
若用Anaconda,NumPy的安装方法如下:
$ conda install numpy
如要安装其他依赖包,将上述命令中的NumPy替换为要安装的包名即可。请仔细阅读相关文档,所有安装方法并不是每种操作系统都适用。pandas的安装文档请见官网。
当前,最好的论坛是stackoverflow[6],你也可以加入邮件列表或IRC频道。相关邮件列表如下。
IRC频道。
我们刚跑完Python和机器学习旅程的头1km!通过本章的学习,我们熟悉了机器学习的基础知识。我们从机器学习是什么讲起,介绍了它(在数据时代背景下)的重要性、简史和最近发展趋势。我们还学习了常见的机器学习任务,探讨了数据处理和建模的几种必备技术。我们用机器学习基础知识武装好自己,并安装和配置好了常用软件和工具。准备开始学习后续章节源自业界的机器学习实例吧!
[1] 原书此处的“130 kilometers”,单位应为英里。下文的80 km,原文为“50 kilometers”,单位也应是英里。——译者注
[2] 1965年,Moore发表题为“Cramming More Components onto Integrated Circuits”的论文,他在这篇论文中表示“the complexity for minimum component costs has increased at a rate of roughly a factor of two per year”,即每年翻一番。后来,Moore将其改为每两年翻一番。——译者注
[3] 另一常见的叫法是“交叉验证”。——译者注
[4] 方差。——译者注
[5] bining,若用分位数划分数据,可译为分箱。——译者注
[6] 我们在有些招聘启事中,会看到高SO积分是加分项这样的说法,这里所说的SO积分,就是程序员在这个网站获得的积分。——译者注