零基础学机器学习

978-7-115-54599-2
作者: 黄佳
译者:
编辑: 颜景燕王旭丹

图书目录:

详情

本书的目标,是让非机器学习领域甚至非计算机专业出身但有学习需求的人,轻松地掌握机器学习的基本知识,从而拥有相关的实战能力。 
本书通过AI“小白”小冰拜师程序员咖哥学习机器学习的对话展开,内容轻松,实战性强,主要包括机器学习快速上手路径、数学和Python 基础知识、机器学习基础算法(线性回归和逻辑回归)、深度神经网络、卷积神经网络、循环神经网络、经典算法、集成学习、无监督和半监督等非监督学习类型、强化学习实战等内容,以及相关实战案例。本书所有案例均通过Python及Scikit-learn 机器学习库和Keras 深度学习框架实现,同时还包含丰富的数据分析和数据可视化内容。 本书适合对AI 感兴趣的程序员、项目经理、在校大学生以及任何想以零基础学机器学习的人,用以入门机器学习领域,建立从理论到实战的知识通道。


图书摘要

版权信息

书名:零基础学机器学习

ISBN:978-7-115-54599-2

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

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

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

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


版  权

著    黄 佳

责任编辑 颜景燕

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

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

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

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内 容 提 要

本书的目标,是让非机器学习领域甚至非计算机专业出身但有学习需求的人,轻松地掌握机器学习的基本知识,从而拥有相关的实战能力。

本书通过AI“小白”小冰拜师程序员咖哥学习机器学习的对话展开,内容轻松,实战性强,主要包括机器学习快速上手路径、数学和Python基础知识、机器学习基础算法(线性回归和逻辑回归)、深度神经网络、卷积神经网络、循环神经网络、经典算法、集成学习、无监督和半监督等非监督学习类型、强化学习实战等内容,以及相关实战案例。本书所有案例均通过Python及Scikit-learn机器学习库和Keras深度学习框架实现,同时还包含丰富的数据分析和数据可视化内容。

本书适合对AI感兴趣的程序员、项目经理、在校大学生以及任何想以零基础学机器学习的人,用以入门机器学习领域,建立从理论到实战的知识通道。

推荐语

《零基础学机器学习》跳脱出俗套,真正从初学者视角为我们呈现了一幅人工智能的技术画卷,令人耳目一新。

——清华大学长聘教授,计算机网络技术研究所副所长,青年长江学者 李丹

AI 是未来,它将重塑每个行业和领域。对于这种迎面而来的宏大变化,是临渊羡鱼还是退而结网?如果你是后者,《零基础学机器学习》是一种轻松打开 AI 世界的方式。

——壹心理创始人 黄伟强

20年前,黄佳是我算法课上的高才生。廿载光阴荏苒,如白驹过隙。他在国外多年,现在已是世界知名公司的高级顾问。欣闻他在繁忙工作之余,还创作了如此优秀的机器学习书。愿黄佳的新书把更多读者引入人工智能领域,也衷心希望机器学习技术的落地越来越实际。

——北京师范大学教授,未来教育学院副院长 孙波

黄佳在《零基础学机器学习》中反复强调机器学习是非常接地气的技术,希望大家用来解决自己工作,甚至是生活中的具体问题。本书的“实战案例”讲解得都很细、很透。期待本书把机器学习技术推入“寻常百姓家”。

——中国信息通信研究院安全研究所主任,工业互联网产业联盟安全组副主席 田慧蓉

写法新颖,内容也出彩:理论严谨,案例实用,算法剖析简明扼要。全书读罢,相信读者能够高效地掌握书中所介绍的各种基础知识和算法工具。

——阿里巴巴蚂蚁集团教授级高工,LedgerDB创始人 杨新颖

如何引导编程知识有限、实践经验相对较少的IT新人进入机器学习的世界?本书真正做到了化繁为简,全面覆盖了机器学习的基础知识点,且读起来毫不费力。这是一本值得大力推荐的用心之作。

——对外经济贸易大学信息学院教授 李兵

阅读了黄佳的作品《零基础学机器学习》,我非常喜欢他对于线性回归、逻辑回归和神经网络等内容循序渐进、层层深入的理论剖析。他用灵活的方法诠释深奥的理论,在课程深度上也拿捏到位。此外,该书的集成学习和强化学习部分也很精彩,简略但重点突出,概念介绍特点鲜明。我向希望入门机器学习的朋友们推荐此书。

——中国人民大学信息学院副教授,人工智能专家 刘桃

本书深入浅出,切入点与市面上已有的人工智能和机器学习书迥然不同,十分易读易懂。全书结构严谨,脉络清晰,能让读者轻松进入机器学习的殿堂。

——中国人民大学信息学院副教授,《区块链核心算法解析》译者 陈晋川

很难想象,作者竟然把一本“硬核”计算机图书写得这么有趣。本书在输出技术知识点的同时插播了轻松笑点,有梗有料,又毫无违和感。能看出作者是一个热爱生活的人,也把自己工作和传道授业的过程当成了一种乐趣。

——思维发展型学校联盟发起人,第1~7届全国思维教学年会大会主席 赵国庆

黄佳的《零基础学机器学习》,是难得一见的“人人都能读懂”的人工智能书。我期待它的问世,并会介绍给公司的员工阅读学习。

——矽景科技创始人,工业自动化机器人专家 陆大为

前 言

这是一个充满变革与挑战的时代。今天的体系和风向在明天就有可能突然调转,而一场流行疾病的到来,可以一夜之间改变整个社会的生存方式。

然而,风险与机遇共存。任风云变幻,人类的恒常议题仍然是如何在充满挑战的环境中生存与发展,继续前行。新的发展和突破性的变革,将由科技的不断创新,尤其是日益成熟的5G通信、大数据和人工智能技术所驱动。万物互联,人们足不出户,就可以与家人和同事无障碍沟通;出门则能随时随地接收云端信息、享受云音乐和云影视;我们刷脸购物,而机器人为我们送餐、送货、或提供清洁、消毒服务。这一切,不再是科幻电影,而已逐步成为了现实。因此,未来可期!

在此背景之下,人工智能(Artificial Intelligence,AI)及其关键技术机器学习,成了当前IT领域毋庸置疑的热点。

这股热潮的出现,并不是单纯地“炒作热点”,而是时代的必然,是“自然选择”的结果。因为机器学习的应用范围的确广泛,具体技术已经“落地”各行各业。尤其是“互联网大厂”的诸多产品,背后都有海量数据。而大数据的背后,核心竞争力必然是机器学习。机器学习以大数据为基础,发现数据背后的规律,优化产品的性能,可解决很多日常问题,也可为战略决策提供方向。从淘宝的商品推荐系统,到大规模疾病的防控,从Google的搜索结果,再到计算机视觉和自然语言处理,都离不开机器学习的身影。

所以,时代要发展(时代无论如何都会进一步发展,而且还会是爆发式的发展),机器学习技术要更广泛地应用,就需要越来越多的人掌握机器学习知识,参与其相关的项目和应用的领域。目前,优秀的机器学习人才还远不能满足市场的需求。人才的匮乏,可以说在某种程度上制约着技术应用的速度和质量。

因此,拿起这本书的您,应该是希望了解机器学习的知识,抑或已经决定选择机器学习技术作为专攻方向。然而问题是只有基本的IT知识或实战经验尚不丰富的学生或职业人士,该如何轻松且快捷地领会机器学习内涵、掌握基本机器学习知识、精通机器学习算法,从而拥有在人工智能领域进一步深耕的能力?这就是本书所力求解决的问题的关键之处。

机器学习书籍很多,其中的知识点也多,体系庞大繁杂,对于初学者来说,一不小心就会被淹没在浩瀚的知识海洋中,觉得学习难以继续。本书给出了一个机器学习入门路线图,从一个零基础的初学者(主角小冰)的视角出发,让读者跟着她一步一步向前,循序渐进地学习知识;老师咖哥将即时解答其各种疑问,手把手地帮忙扫清路途中的障碍,轻松地把大家引入机器学习的知识殿堂。

本书还有以下特色。

本书的具体内容包括以下部分。

总而言之,本书的写作初衷是降低机器学习的门槛,设计出比较合理的学习路线图,让入门变得更容易,让大家都能学,而且是快乐地学。在写作过程中,我时时刻刻告诉自己要写一本读者能看得懂、学得进去的书。读者需要读一本风格轻松的书,而不是论文集,如果要读论文,网上有很多。

那么我的写作目标——写一本“轻松”而“实用”的机器学习入门书,是否实现了呢?这就留待大家去检验了,您随便翻几页,应该就看得出我在写作风格方面的努力与尝试。

如果大家在书中发现任何差错,可以联系yanjingyan@ptpress.com.cn指正。如果大家希望了解更多机器学习的相关内容,欢迎关注公众号“咖哥数据科学讲习所”,让我们共同进步。

最后,还必须要感谢各位机器学习领域的前辈,如吴恩达、李宏毅、莫烦等老师,他们无私分享的机器学习教学资源,以及Kaggle网站中的机器学习数据集,都是包括我在内的每一个探索者在学习之路上不可或缺的财富。感谢我的朋友武卫东和夏新松在本书写作期间对我的鼓励和建议,也要感谢人民邮电出版社的编辑老师们,尤其是责任编辑颜景燕女士,从全书的内容结构到文字细节,再到版式设计,她都倾注了大量精力。没有以上各位朋友的支持与参与,这本书就无法呈现于读者面前。

黄佳

2020年4月

资源与支持

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

配套资源

本书为读者提供如下配套资源:

要获得以上配套资源,请在异步社区本书页面中找到“配套资源”栏,按提示进行操作。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

提交勘误

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

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

与我们联系

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

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

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

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

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

关于异步社区和异步图书

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

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

异步社区

微信服务号

引 子 AI菜鸟的挑战——100天上线智能预警系统

小冰,“90后”,研究生毕业,非资深程序员,目前在一家软件公司工作。工作虽忙但尚能应付,还和朋友合伙开了一个网店。她的生活风平浪静。

故事从大老板今天早晨踏进她们项目组这一刻开始。

她到公司比别人早,刚刚收拾了一下混乱的房间,正要打开电脑,大老板进来了。

“小冰,你们经理呢?还没来吗?这都10点了!”老板似乎生气了。

小冰说:“昨天经理带着我们赶进度,到晚上12点多才走,可能今天要晚到一会儿。”

“唉,算了。不等他了。就你吧,你跟我过来一下。还有你们两个,”老板指着其他项目组的另外两个同事说,“也来一下。”

到了会议室,老板开口了:“我这边有一个很紧急、也很重要的项目哈。合作方是老客户了,因为信任咱们,才直接交给咱们。但是时间非常非常紧,100天内必须上线。我琢磨着你们手头上的几个项目都在收尾阶段了,本来是准备跟你们经理商量,抽调一两个人做这个新项目。但是他们又都迟到,我这儿又着急。算了,我也不和他们商量了,就定你们几个吧!”说完,又补了一句:“叫他们带头迟到!”

小冰和其他几位同事面面相觑。

过了3秒,小冰弱弱地问:“请问是什么方面的项目?”

老板答:“人工智能!

小冰他们吓了一跳。

小冰被新项目吓了一跳

老板接着说:“不是让你们去研发一个会端茶倒水的机器人。具体讲,是机器学习方面的项目。机器学习,听说过吗?属于人工智能的一个分支领域,最近是热得很呢。这是一个银行客户,他们的信用卡申请系统是我们前年做的,现在也开始做大数据和机器学习的项目了。这次是请我们给他们做一个诈骗行为预警的应用,根据现有的数据智能化地判断哪些客户可能存在欺诈性的刷卡行为。这个项目如果完成得好,他们还会继续开发一个人脸识别应用,加入信用卡的申请验证过程,那就需要深度学习的技术了。深度学习也算是机器学习的分支吧。”

老板一谈起项目,那是滔滔不绝啊!停都停不下来。但是几个听众有点觉得云山雾罩的。

“可是…… 这些技术我们都不懂啊……”几人在同一时间表达了同一个意思。

学啊!” 老板说。

“有那么容易吗?”一个比较大胆的同事问,“我看过一些机器学习的文档,也买过几本书,里面的数学公式、算法,难度可不低啊,我一个专业程序员都感觉看不大懂。”

“嗯,这样啊……” 老板思索了一下,“我倒觉得这机器学习项目,门槛没有你们想象的那么高。以你们目前的编程背景和数学知识,如果学习路线正确,应该可以快速上手。不过,我其实也考虑到这点了,如果没有一个适当的培训来引导你们,完全自学的话应该还是挺艰苦的。我安排了一个短期培训,找的是专家,一个在大厂任资深数据科学家的朋友。让他带一带你们,先入门。据他说,他的第一个机器学习项目也是临危受命,同样是半年之内从不懂到懂,‘摸爬滚打’几个月之后,最终完成了。因此,几个月搞定这个项目不算是开玩笑。我们做IT的,哪个项目不是这样边学边做拼出来的?”

紧接着老板大手一挥,斩钉截铁地说:“好,这事儿就这么定了!这是好事,别人想要做这机器学习项目还没机会呢。”

“明天开始机器学习培训!”

这样,小冰似乎不是很情愿,而又幸运地开启了她的机器学习之旅。

第1课 机器学习快速上手路径——唯有实战

第二天清晨,小冰准时来到上课地点。

出乎她的意料,等待他们的讲师——老板口中的“大厂资深数据科学家”竟然是她很久没见的高中同桌。这位哥从小喜欢编程,经常熬夜,年纪轻轻就养成了喝浓咖啡的习惯,因此人称“咖哥”。毕业时小冰只知道他考入了某校计算机系,之后就再也没联系过了。

意外重逢,二人很是激动。不过,他们只能简单寒暄几句,咖哥迅速进入正题。

“同学们好,”咖哥说,“你们可知道为什么来上这门课程?”

“要做机器学习项目。”3人很默契地回答道。

“好,既然是为了做项目而学,那么我们会非常强调实战。当然理论是基础,在开始应用具体技术之前,总要先厘清概念。机器学习,是属于人工智能领域的技术,小冰,你怎么理解‘人工智能’这个概念?”

“啊,你还真问倒我了,”小冰说,“成天说人工智能,可是我还真说不清楚它到底是什么。”

咖哥说:“好,我们就从人工智能究竟是什么说起。不过,先给出本课重点。”

1.1 机器学习的家族谱

人工智能,也就是我们每天挂在嘴边的AI,可以被简单地定义为努力将通常由人类完成的智力任务自动化[1]。这个定义内涵模糊而外延广阔,因而这个领域可谓异彩纷呈:手机里的Siri、围棋场上的AlphaGo、购物时出现的推荐商品、无人驾驶的汽车,它们无不与人工智能有关。为了后面方便讲述,我们[2]就用其英文缩写“AI”来代替。

[1] 肖莱.Python深度学习[M].张亮,译.北京:人民邮电出版社,2018.

[2] 从本节开始,所有正文文字除小冰和同学们的提问之外,都是咖哥课程讲述内容,为保证真实课堂体验,将以咖哥为第一人称叙述。其中的“我”均指代咖哥。

1950年,图灵发表了一篇划时代的论文《计算机器与智能》,文中预言了创造出“有智慧的机器”的可能性。当时他已经注意到“智能”这一概念难以确切定义,因而提出了著名的图灵测试:如果一台计算机可以模仿特定条件下的人类反应,回答出特定领域的问题,而提问者又无法正确判断回答者是人类还是机器,就可以说它拥有人工智能。后来,1956年,众多的学者和学科奠基人在达特茅斯学院举行了一次大会,现代AI学科从此正式成立。

老板通知咖哥:咖哥本人的图灵测试未通过

这之后大概每隔一二十年,就会出现一波AI热潮,热潮达到顶点后又会逐渐“冷却”,进入低谷期。这形成了周而复始的AI效应,该效应包括以下两个阶段。

(1)AI将新技术、新体验带进人类的生活,完成了一些原本需要人类智慧才能完成的工作,此时舆论会对AI期待极高,形成一种让人觉得“真正的”AI时代马上就要到来的氛围。人们兴奋不已,大量资金涌入AI研发领域。

(2)然而一旦大家开始习惯这些新技术,就又开始认为这些技术没什么了不起,根本代表不了真正的人类智慧,此时又形成一种对AI的现状十分失望的氛围,资金也就纷纷“离场”。

小冰插嘴:“这也太悲催了!”

咖哥说:“但是AI的定义和应用的领域正是在上述循环的推动下不断地被升级、重构,向前发展的。”

一旦大家习惯新技术,就觉得没什么了不起

目前第三波AI热潮正火热兴起。AI是当前整个IT业界的热点,而AI领域内的热点,就是这里要讲的两个技术重点——机器学习和深度学习。机器学习是AI的分支技术,而深度学习是机器学习的技术之一。从人工智能到机器学习,再到深度学习,它们之间是一种包含和被包含的关系,如下图所示。

人工智能、机器学习和深度学习的关系

这种热点的形成有多方面的原因。

首先,是数据。在大数据时代,我们终于拥有了算法所需要的海量数据。如果把机器学习比作工业革命时的蒸汽机,那么数据就是燃料。有了燃料,机器才能够运转。

其次,在硬件方面,随着存储能力、计算能力的增强,以及云服务、GPU(专为执行复杂的数学和几何计算而设计的处理器)等的出现,我们几乎能够随意构建任何深度模型(model)。

最重要的是,两种技术都有特别良好的可达性,几乎能够触达任何一个特定行业的具体场景。简单地说就是实用、“接地气”,大大拓展了AI的应用领域。小到为客户推荐商品、识别语音图像,大到预测天气,甚至探索宇宙星系,只要你有数据,AI几乎可以在任何行业落地。这种可达性和实用性,才是机器学习和深度学习的真正价值所在。

1.1.1 新手入门机器学习的3个好消息

说到这次课程的具体目的,那就是快速入门机器学习。不得不说,媒体把机器学习、深度学习“渲染”得太夸张了。它们其实没那么神奇,门槛也没有大家想象得那么高。业界的共识是:机器学习技术不能是曲高和寡的“阳春白雪”,应该让它走出象牙塔,“下凡到人间”。既然这两种技术的实用性强,那么当务之急就是将其部署到一个个应用场景,也就是需要让尽可能多的人接触这门技术,尤其是非专家、非研究人员。未来,非IT专业背景的人群也应该了解、学习AI技术。只有推广给大众,才能充分发挥技术的全部潜能

在这一理念的驱动之下,简单实用的机器学习和深度学习框架、库函数不断涌现,可重用的代码和技术层出不穷。分享与合作也成了AI业界的精神内核之一。这对于初学者来说,无疑是天大的好事。而像我们这样的普通软件工程师,在AI落地的过程中肯定是要起到重要作用的。

此时咖哥用期待的眼光向同学们望去,好像在说:“天将降大任于我们啊,同学们!”

然而同学们仍然略有困惑。“真的不难吗?” 小冰开口问道,“听说机器学习对数学要求高啊。数学从来都不是我的强项,高中之后的数学知识都还给老师了。”

咖哥笑着回答:“以你们现在的基础,肯定没问题。而且关于机器学习新手入门,我总结出来了3个好消息。先给你们背首“诗”吧。”

C程序犹如拿着剃刀在刚打过蜡的地板上劲舞

C++学起来很难,因为它天生如此

Java从很多方面来说,就是简化版的C++

接下来请欣赏与众不同的表演[3]

[3] Magnus Lie Hetland. Python基础教程(第3版)[M].袁国忠,译.北京:人民邮电出版社,2018.

小冰说:“嘿,咖哥,我这儿都急得睡不好觉了,你还在这儿乱侃!”

咖哥道:“这首‘诗’,隐喻的是目前最流行的机器学习语言Python。它是一种非常容易上手的编程语言,很多小孩子都在学。你作为一个研究生,还写过Java代码,学Python会有什么问题呢?而且Python功能性超强,很实用,自带很多强大的框架和库函数,你说这有多方便!这就是第一个好消息。”

“我再给你们背首‘诗’吧。”咖哥接着说。

“不用了,”小冰说,“请直接说第二个好消息的要点。”

第二个好消息是,机器学习的确需要一些数学基础,但是就入门阶段来说,要求并不高,也就是函数、概率统计,再加上线性代数和微积分最基础的内容。而且,机器学习中的数学内容重在理解,不重在公式的推演

最后,也是最给力的好消息就是刚才提过的AI业界的分享精神了。我们学机器学习,学的是各种模型(也就是算法),并用它们进行实战。这比的不是多高的编程水平和数学水平,而是模型的选择、整合、参数的调试。这要求的主要是逻辑分析与判断能力,再加上点直觉和运气。有人甚至把搭建机器学习模型的过程形容为“搭积木”。因此,说以“游戏的态度”学机器学习、做机器学习项目也不算是不负责任的说法。

所以,机器学习没什么可怕的,我自己的项目团队里面文科生都有好几个呢。不过学习路线图很重要,因为机器学习领域的覆盖面非常的庞杂,初学者很容易“找不着北”。所以如果在学习过程中能有正确的引导,可以省下很多力气,那么入门就更顺利了。

有人甚至把搭建机器学习模型的过程形容为“搭积木”

同学们此时都以十分期待的眼光看着咖哥。

咖哥微笑着点头说道:“你们猜对了,这门课程,正是要为你们梳理出一条清晰而顺畅的入门脉络,我本人有信心让你们在较短的时间内把握机器学习的本质,领略机器学习的威力,并顺利进入机器学习的殿堂!”

1.1.2 机器学习就是从数据中发现规律

那么何为机器学习?其实机器学习(machine learning)这个概念和AI一样难以定义。因为其涵盖的内容太多了。美国作家Peter Harrington在他的《机器学习实战》一书中说“机器学习就是把无序的数据转换成有用的信息”[4]。英国作家Peter Flach在他的《机器学习》一书中,将机器学习概括为“使用正确的特征来构建正确的模型,以完成既定的任务”[5]。这里面的特征,其实也是数据的意思。

[4] HARRINGTON P.机器学习实战[M].李锐,李鹏,曲亚东等译.北京:人民邮电出版社:2013.

[5] FLACH P.机器学习[M].段菲,译.北京:人民邮电出版社:2016.

既然学者们的定义并不统一,那么我也来说说自己的看法——机器学习的关键内涵之一在于利用计算机的运算能力从大量的数据中发现一个“函数”或“模型”,并通过它来模拟现实世界事物间的关系,从而实现预测或判断的功能。

这个过程的关键是建立一个正确的模型,因此这个建模的过程就是机器的“学习”。

小冰打断咖哥:“你能不能讲大家能听懂的话?什么是现实世界事物间的关系的模拟,说清楚一点。”

咖哥回答:“现实世界中,很多东西是彼此相关的。”

比如,爸爸(自变量x1)高,妈妈(自变量x2)也高,他们的孩子(因变量y)有可能就高;如果父母中有一个人高,一个矮,那么孩子高的概率就小一些;当然如果父母都矮,孩子高的概率就非常小。当然,孩子的身高不仅取决于遗传,还有营养(自变量x3)、锻炼(自变量x4)等其他环境因素,可能还有一些不可控的或未知的因素(自变量xn)。

又比如,一颗钻石的大小(自变量x1)、重量(自变量x2)、颜色(自变量x3)、密度(自变量x4)和它的价格(因变量y)的关系,也体现出了明显的相关性,如下图所示。

机器学习——从特征到标签

咖哥发言

有一点你先记住,这些自变量(x1, x2, x3, …, xn),在机器学习领域叫作特征(feature),因变量y,在机器学习领域叫作标签(label),有时也叫标记。这两个名词现在听起来比较怪,但是用着用着就会习惯。

机器学习,就是在已知数据集的基础上,通过反复的计算,选择最贴切的函数(function)去描述数据集中自变量x1, x2, x3, …, xn和因变量y之间的关系。如果机器通过所谓的训练(training)找到了一个函数,对于已有的1000组钻石数据,它都能够根据钻石的各种特征,大致推断出其价格。那么,再给另一批同类钻石的大小、重量、颜色、密度等数据,就很有希望用同样的函数(模型)推断出这另一批钻石的价格。此时,已有的1000组有价格的钻石数据,就叫作训练数据集(training dataset)。另一批钻石数据,就叫作测试数据集(test dataset)。

因此,正如下图所示,通过机器学习模型不仅可以推测孩子身高和钻石价格,还可以实现影片票房预测、人脸识别、根据当前场景控制游戏角色的动作等诸多功能。

机器学习就是从数据中发现关系,归纳成函数,以实现从A到B的推断

听到这里,小冰叫了起来:“啊?这不就是数学吗,有什么深奥的!——统计学,大学学过的,对不对?”

咖哥回答道:“小冰,你说得没错。”

其实所谓机器学习,的确是一个统计建模的过程。但是当特征数目和数据量大到百万、千万,甚至上亿时,原本属于数学家的工作当然只能通过机器来完成喽。而且,机器学习没有抽样的习惯,对于机器来说,数据是多多益善,有多少就用多少。

下面的图展示了机器从数据中训练模型的过程,而人类的学习,是从经验中归纳规律,两者何其相似!越是与人类学习方式相似的AI,才是越高级的AI!这种从已知到未知的学习能力是机器学习和以前的符号式AI最本质的区别。

机器:从数据中学习;人类:从经验中学习。两者何其相似

机器学习的另外一个特质是从错误中学习,这一点也与人类的学习方式非常相似。

你们看一个婴儿,他总想吞掉他能够拿到的任何东西,包括硬币和纽扣,但是真的吃到嘴里,会发生不好的结果。慢慢地,他就从这些错误经验中学习到什么能吃,什么不能吃。这是通过试错来积累经验。机器学习的训练、建模的过程和人类的这个试错式学习过程有些相似。机器找到一个函数去拟合(fit)它要解决的问题,如果错误比较严重,它就放弃,再找到一个函数,如果错误还是比较严重,就再找,一直到找到相对最为合适的函数为止,此时犯错误的概率最小。这个寻找的过程,绝大多数情况不是在人类的“指导”下进行的,而是机器通过机器学习算法自己摸索出来的。

因此,机器学习是突破传统的学习范式,它与专家系统(属于符号式AI)中的规则定义不同。如下图所示,它不是由人类把已知的规则定义好之后输入给机器的,而是机器从已知数据中不断试错之后,归纳出来规则。

机器学习是突破传统的学习范式,是从数据中发现规则,而不是接受人类为它设定的规则

上述这些能够引导机器进行自我学习的算法,我们只是要在“理解的基础上使用”,而算法的设计,那是专业人士才需要进行的工作。因此,重点在于解释这些算法,并应用它们建立机器学习模型(函数)来解决具体问题

1.1.3 机器学习的类别——监督学习及其他

机器学习的类别多,分类方法也多。最常见的分类为监督学习(supervised learning)、无监督学习(unsupervised learning)和半监督学习(semi-supervised learning)。监督学习的训练需要标签数据,而无监督学习不需要标签数据,半监督学习介于两者之间。使用一部分有标签数据,如下图所示。

以分类问题展示监督、无监督和半监督学习的区别

“停,”小冰喊道,“刚才讲的听不大懂!”

咖哥说:“那么我换一种比较容易理解的说法。如果训练集数据包含大量的图片,同时告诉计算机哪些是猫,哪些不是猫(这就是在给图片贴标签),根据这些已知信息,计算机继续判断新图片是不是猫。这就是一个监督学习的示例。如果训练集数据只是包含大量的图片,没有指出哪些是猫,哪些是狗,但是计算机经过判断,它能够把像猫的图片归为一组,像狗的图片归为一组(当然它无法理解什么是什么,仅能根据图片特征进行归类而已)。这就是一个无监督学习的示例。”

“那么半监督学习又是怎么一回事呢?”小冰问。

简而言之,半监督学习就是监督学习与无监督学习相结合的一种学习方法。因为有时候获得有标签数据的成本很高,所以半监督学习使用大量的无标签数据,同时使用部分有标签数据来进行建模。

当然,机器学习分类方式并不只有上面一种,有时候人们把监督学习、无监督学习和强化学习并列起来,作为机器学习的几大分类,但各类机器学习之间的界限有时也是模糊不清的。

1.1.4 机器学习的重要分支——深度学习

上面说的监督学习与无监督学习,主要是通过数据集有没有标签来对机器学习进行分类。本课程中的一个重点内容深度学习(deep learning),则是根据机器学习的模型或者训练机器时所采用的算法进行分类。

也可以说,监督学习或无监督学习,着眼点在于数据即问题的本身;是传统机器学习还是深度学习,着眼点在于解决问题的方法。

那么深度学习所采用的机器学习模型有何不同呢?答案是4个字:神经网络。当然这种神经网络不是我们平时所说的人脑中的神经网络,而是人工神经网络(Artificial Neural Network,ANN),是数据结构和算法形成的机器学习模型,由大量的所谓人工神经元相互联结而成,这些神经元都具有可以调整的参数,可以实现监督学习或者无监督学习。

咖哥发言

大家千万不要被什么人工神经元、神经网络之类的专业名词吓住,觉得这些东西离自己太过于遥远,其实这些数学模型的结构简单得令人吃惊。

初期的神经网络模型比较简单,后来人们发现网络层数越多,效果越好,就把层数较多、结构比较复杂的神经网络的机器学习技术叫作深度学习,如下图所示。这其实是一种品牌重塑,因为神经网络在AI业界曾不受重视,起了一个更高大上的名字之后果然“火了起来”。当然,火起来是大数据时代到来后的必然结果,换不换名字其实倒无所谓。

深度学习中的神经网络是神经元组合而成的机器学习模型

神经网络本质上与其他机器学习方法一样,也是统计学方法的一种应用,只是它的结构更深、参数更多。

各种深度学习模型,如卷积神经网络(Convolutional Neural Network, CNN)、循环神经网络(Recurrent Neural Network,RNN),在计算机视觉、自然语言处理(Natural Language Processing,NLP)、音频识别等应用中都得到了极好的效果。这些问题大多很难被传统基于规则的编程方法所解决,直到深度学习出现,“难”问题才开始变简单了。

而且深度学习的另一大好处是对数据特征的要求降低,自动地实现非结构化数据的结构化,无须手工获取特征,减少特征工程(feature engineering)。特征工程是指对数据特征的整理和优化工作,让它们更易于被机器所学习。在深度学习出现之前,对图像、视频、音频等数据做特征工程是非常烦琐的任务。

小冰说:“什么是‘自动地实现非结构化数据的结构化’,听着像绕口令,你还是再解释一下。”

咖哥:“好,解释一下。”

有些数据人很容易理解,但是计算机很难识别。比如说,下图中一个32px×32px的图片,我们一看到就知道写的是8。然而计算机可不知道这图片8背后的逻辑,计算机比较容易读入Excel表格里面的数字8,因为它是存储在计算机文件系统或者数据库中的结构化数据。但是一张图片,在计算机里面存储的形式是数字矩阵,它很难把这个32px×32px的矩阵和数字8联系起来。

从图片“8”到数字“8”,图形逐渐变得“计算机友好”

然而,通过深度学习就能够完成图片上这种从非结构化到结构化的转换,你们可以研究一下上图中的这个从图片“8”到数字“8”的过程。通过卷积神经网络的处理,图片‘8’变成了[0000000010]的编码,虽然这样的编码未必让人觉得舒服,但是对于计算机来说这可比32px×32px数字的矩阵好辨认多了。”

因此,数据结构化的目标也就是:使数据变得“计算机友好”。

看一看下图所示的这个图片识别问题的机器学习流程。使用传统算法,图片识别之前需要手工做特征工程,如果识别数字,可能需要告诉机器数字8有两个圈,通常上下左右都对称;如果辨别猫狗,可能需要预定义猫的特征、狗的特征,等等,然后通过机器学习模型进行分类(可麻烦了)。而深度学习通过神经网络把特征提取和分类任务一并解决了(省了好多事儿)!

深度学习的优势——减少手工进行的特征工程任务

因此,深度学习的过程,其实也就是一个“数据提纯”的过程!在大数据时代,深度学习能自动搞定这个提纯过程,可是很了不起的事儿。

1.1.5 机器学习新热点——强化学习

强化学习,也是机器学习领域中一个很抢眼的热点。

强化学习(reinforcement learning)研究的目标是智能体(agent)如何基于环境而做出行动反应,以取得最大化的累积奖励。如下图所示,智能体通过所得到的奖励(或惩罚)、环境反馈回来的状态以及动作与环境互动。其灵感据说来源于心理学中的行为主义理论——根据正强化或负强化(也就是奖惩)的办法来影响并塑造人的行为。

强化学习——智能体通过奖励、状态以及动作与环境互动

强化学习和普通机器学习的差异在于:普通机器学习是在开放的环境中学习,如自动驾驶,每一次向前驾驶都带给机器新的环境,新环境(新数据)永无止息;而强化学习的环境是封闭的,如智能体玩游戏,击中一个敌人,环境中就减少一个敌人,如AlphaGo下围棋,每落一个子,棋盘就少一个目,棋盘永远不会增大或减小。那么在这样的闭环中,就比较容易实现对机器刚才所采取的策略进行奖惩。

而强化学习和监督学习的差异在于:监督学习是从数据中学习,而强化学习是从环境给它的奖惩中学习。监督学习中数据的标签就是答案,具有比较明显的对、错倾向,如果把本来是猫的图片当成狗的图片,就要把权重往猫的方向调整;而强化学习得到惩罚后(比如下棋输了),没人告诉它具体哪里做错了,所以它调整策略的时候需要的智能更强,要求它的思路也更加广阔、更为长远。它不一定每次都明确地选择最优动作,而是要在探索(未知领域)和利用(当前知识)之间找到平衡

注意了,除了上面说的监督学习、无监督学习、半监督学习、深度学习、强化学习之外,还有很多其他的机器学习方法(算法),比如说集成学习(ensemble learning)、在线学习(online learning)、迁移学习(transfer learning)等,每隔一段时间,就会有新的学习热点涌现。因此,一旦你们踏进了机器学习领域,也就等同于踏进了“终身学习”之旅了。

“看来,不好好‘学习’真的不行啊。”小冰说。

1.1.6 机器学习的两大应用场景——回归与分类

机器学习都能做些什么呢?

它的各种应用早就已经“飞入寻常百姓家”了。从我们每天用的搜索引擎到淘宝的商品推荐系统,哪里没有机器学习的身影呢?因为应用场景太多了,所以已经不可能给出一个完整的机器学习应用列表了。

这样只好从要解决的问题类型来分析机器学习,那么请记住回归(regression)和分类(classification)是两种最常见的机器学习问题类型,如下图所示。

目前分类问题的机器学习应用场景比回归问题的更广泛

1.1.7 机器学习的其他应用场景

当然,除回归问题和分类问题之外,机器学习的应用场景还有很多。比如,无监督学习中最常见的聚类(clustering)问题是在没有标签的情况下,把数据按照其特征的性质分成不同的簇(其实也就是数据分类);还有一种无监督学习是关联规则,通过它可以找到特征之间的影响关系。

又比如时间序列,指在内部结构随时间呈规律性变化的数据集,如趋势性数据、随季节变化的数据等。时间序列问题其实也就是和时间、周期紧密关联的回归问题。具体应用场景包括预测金融市场的波动,推断太阳活动、潮汐、天气乃至恒星的诞生、星系的形成,预测流行疾病传播过程等。

还有结构化输出。通常机器学习都是输出一个答案或者选项,而有时需要通过学习输出一个结构。什么意思呢?比如,在语音识别中,机器输出的是一个句子,句子是有标准结构的,不只是数字0~9这么简单(识别0~9是分类问题),这比普通的分类问题更进一步。具体应用场景包括语音识别——输出语法结构正确的句子、机器翻译——输出合乎规范的文章。

还有一部分机器学习问题的目标不是解决问题,而是令世界变得更加丰富多彩,因此AI也可以进行艺术家所做的工作,例如以下几种。

我们可以把这种机器学习应用称为生成式学习

还有些时候,机器学习的目标是做出决定,这时叫它们决策性问题。决策性问题本质上仍然是分类问题,因为每一个决策实际上还是在用最适合的行为对环境的某一个状态进行分类。比如,自动驾驶中的方向(左、中、右),以及围棋中的落点,仍然是19×19个类的其中之一。具体应用场景包括自动驾驶、智能体玩游戏、机器人下棋等。在很多决策性问题中,机器必须学习哪些决策是有效的、可以带来回报的,哪些是无效的、会带来负回报的,以及哪些是对长远目标有利的。因此,强化学习是这种情况下的常用技术。

总体来说,机器学习的诀窍在于要了解自己的问题,并针对自己的问题选择最佳的机器学习方法(算法),也就是找到哪一种技术最有可能适合这种情况。如果能把场景或任务和适宜的技术连接起来,就可以在遇到问题时心中有数,迅速定位一个解决方向。下图将一些常见的机器学习应用场景和机器学习模型进行了连接。

将一些常见的机器学习应用场景和机器学习模型进行连接

看到有些同学微微皱起了眉头,咖哥说:“同学们不要有畏难情绪嘛,图中的名词儿你们觉得太多、太陌生,这很正常。当我们把课程学完,回头再看它们时,就变得容易啦!”

还要说一点:机器学习不是万能的,它只能作用于和已知数据集类似的数据,不能抽象推广——在猫狗数据集中已经训练成功的神经网络如果读到第一张人类图片,很可能会“傻掉”。因此,机器的优势仍在于计算量、速度和准确性,尚无法形成类似人类的智力思维模式(因为人类的智力思维模式难以描述,也难以用算法来形容和定义)。这大概是AI进一步发展的瓶颈所在吧。

不过,虽然道路是曲折的,但前途仍然是光明的,AI的更多突破,指日可待。让我们群策群力,为AI领域已经相对成熟的技术,如机器学习的普及,添砖加瓦。

1.2 快捷的云实战学习模式

大家听了咖哥这一番剖析,感觉概念上清晰多了,也受到了很大的鼓舞,决心“面对”而不是“逃避”老板“丢过来”的挑战。现在,小冰甚至觉得有点小兴奋:攻克一个与未来息息相关的技术是多么有趣的事情。

咖哥接着说:“说了半天各种‘学习’的类型和特点,那些也只是概念和理论。现在,咱们亲自运行一个机器学习实例,看一看机器学习的项目实战是什么模样,到底能解决什么具体问题。”

“不过,我听说机器学习对硬件要求挺高的,好像需要配置很贵的GPU?”小冰问。

“也不一定!”咖哥说。

咖哥对这个时代的学习方式有他的看法:他觉得,需要去培训中心进修,或者要先安装一大堆东西才能开始上手一项新技术的日子已经一去不复返了。

“学习新技能的门槛比以前低太多了。因为在线学习这么发达,最新的知识、技术甚至论文每时每刻都会直接被推送至世界的每一个角落,所以相对贫穷的地方也涌现出了一大堆高科技人才。在线学习,这是低成本自我提升的最好方法。”咖哥说,“不管是在通州、德州,还是在徐州、广州,你们完全可以和斯坦福大学的学生学习相同的AI课程。”

咖哥告诉小冰,在线学习非常方便

1.2.1 在线学习平台上的机器学习课程

想学机器学习的人,不大可能没有听说过吴恩达。他开设的机器学习课程已经造就了数以万计的机器学习人才,如果英文好,你们可以去他的Coursera网站看看。那是众多的大规模开放在线课程(Massive Open Online Course,MOOC)平台之一,里面还有一些免费课程。

吴恩达老师采用Octave和MATLAB作为他的机器学习教学环境。我当年学他的课程时,就惊讶于MATLAB Online的强大,什么都不用安装,就可以直接上网实战,如下图所示。

直接上网使用MATLAB Online进行机器学习项目实战

小冰插嘴问道:“既然吴老师的机器学习课程这么好,又是免费的,我直接和他学不就好了?”咖哥笑答:“也可以啊,但还是大有不同。吴老师的课程虽然深入浅出,不过仍有门槛,他已经尽量压缩了数学内容,可公式的推导细节还是不少啊!”咖哥喝了一口咖啡,很自信地说:“我会把机器学习的门槛进一步降低,还会着重介绍深度学习的内容。我保证,能让你们更轻松地听懂我设计的全部内容。”

1.2.2 用Jupyter Notebook直接实战

注意,吴老师课程中的MATLAB环境虽然是机器学习的好工具,但它可不是开源软件,长期使用它需要购买版权。那么,有没有基于Python的免费平台,直接在线进行机器学习的实战?——有,而且还不止一个!

答案就是使用在线的Jupyter Notebook。你们可以把Jupyter Notebook想象成一个类似于网页的多媒体文档,里面有字、有图、能放公式、有说明。但是,比普通网页更高一筹的是,它还能运行Python代码(如下图所示)。

一个在线的Jupyter Notebook

有了在线的Jupyter Notebook,根本不需要在本机安装Python运行环境就可以“玩”机器学习。而且大多的Python库、机器学习库和深度学习库,在线的Jupyter Notebook都支持。

免费提供在线的Jupyter Notebook的网站有很多,比如Binder、Kaggle Notebooks、Google Colaboratory、Microsoft Azure Notebooks、CoCalc和Datalore等,都挺不错的,但是全部都介绍的话内容太多了。挑两个比较常用的说一说,让大家见识一下上手机器学习实战的速度。

1.2.3 用Google Colab开发第一个机器学习程序

Google Colaboratory(简称Colab),是Google提供的一个AI研究与开发平台。Colab给广大的AI开发者提供了GPU,型号为Tesla K80。在Colab中可以轻松地运行Keras、TensorFlow、PyTorch等框架。下面的图中,我随便写了一个“Hello World!!”程序。

在Colab中写一个Hello World程序

在Colab中,也自带了很多非常优秀的机器学习入门教程以及示例代码,你们如果有兴趣,也可以去看一看,练习一下那些示例。话不多说,我们现在从头到尾写一个属于自己的机器学习程序。

本课程有配套的代码包和数据集,第一个程序的文件保存在“X:源码包\第1课 机器学习实战\教学用例1 加州房价预测”中,大家可以自行取用。

在搜索引擎中搜一下Colab,通过链接直接进入其环境,选择“文件”→“新建Python 3记事本”,如下图所示。

在Colab中新建Python 3记事本

咖哥发言

如果访问Colab有困难,可以试试其他Jupyter Notebook网站,如Kaggle、Binder、Datalore等。代码是通用的,但是要注意各个平台的不同设定选项。比如,在Kaggle中,要访问Internet上的文件和数据集,需打开屏幕右侧Setting中的Internet选项。

首先,请大家注意这个运行环境里面的代码段和文字信息段都是一块一块的。所以不需要把整个程序都编译完成后才进行调试。写一段,就运行一段。这样很容易及早发现问题。等到程序完成后,也可以通过整体运行功能从头到尾执行全部代码。

在新创建的Python 3记事本中输入下面几行代码:

import pandas as pd #导入Pandas, 用于数据读取和处理
# 读入房价数据,示例代码中的文件地址为internet链接,读者也可以下载该文件到本机进行读取
# 如,当数据集和代码文件位于相同本地目录,路径名应为"./house.csv",或直接为"house.csv"亦可
df_housing = pd.read_csv("https://raw.githubusercontent.com/huangjia2019/house/master/house.csv") 
df_housing.head #显示加州房价数据

上面的代码解释如下。

单击代码左侧箭头就可以运行代码,读取并显示出加州房价数据集中的信息,结果如下:

<        longitude  latitude  ...  median_income  median_house_value
0        -114.31     34.19  ...         1.4936             66900.0
1        -114.47     34.40  ...         1.8200             80100.0
2        -114.56     33.69  ...         1.6509             85700.0
...          ...       ...  ...            ...                 ...
16997    -124.30     41.84  ...          3.0313            103600.0
16998    -124.30     41.80  ...          1.9797             85800.0
16999    -124.35     40.54  ...          3.0147             94600.0
 
[17000 rows x 9 columns]>

如果上面这个数据读入和显示的过程通过其他语言来实现,可要费不少力气了。但是Python的功能性在这儿就体现出来了——通过一个函数或一个方法,直接完成一件事儿,不拖泥带水。

说一下这个数据集。这是加州各地区房价的整体统计信息(不是一套套房子的价格信息),是1990年的人口普查结果之一,共包含17 000个样本。其中包含每一个具体地区的经度(longitude)、纬度(latitude)、房屋的平均年龄(housing_median_age)、房屋数量(total_rooms)、家庭收入中位数(median_income)等信息,这些信息都是加州地区房价的特征。数据集最后一列“房价中位数”(median_house_value)是标签。这个机器学习项目的目标,就是根据已有的数据样本,对其特征进行推理归纳,得到一个函数模型后,就可以用它推断加州其他地区的房价中位数。

然后构建特征数据集X和标签数据集y,如下段代码所示。注意,Python是大小写区分的,而且在机器学习领域,似乎有一种习惯是把特征集X大写,把标签集y小写。当然,也并不是所有人都会遵循这个习惯。

X = df_housing.drop("median_house_value", axis = 1) #构建特征集X
y = df_housing.median_house_value #构建标签集y

上面的代码使用drop方法,把最后一列median_house_value字段去掉,其他所有字段都保留下来作为特征集X,而这个median_house_value字段就单独赋给标签集y

现在要把数据集一分为二,80%用于机器训练(训练数据集),剩下的留着做测试(测试数据集)如下段代码所示。这也就是告诉机器:你看,拥有这些特征的地方,房价是这样的,等一会儿你想个办法给我猜猜另外20%的地区的房价。

from sklearn.model_selection import train_test_split #导入sklearn工具库
X_train, X_test, y_train, y_test = train_test_split(X, y, 
        test_size=0.2, random_state=0) #以80%/20%的比例进行数据集的拆分

其实,另外20%的地区的房价数据,本来就有了,但是我们假装不知道,故意让机器用自己学到的模型去预测。所以,之后通过比较预测值和真值,才知道机器“猜”得准不准,给模型打分。

下面这段代码就开始训练机器:首先选择LinearRegression(线性回归)作为这个机器学习的模型,这是选定了模型的类型,也就是算法;然后通过其中的fit方法来训练机器,进行函数的拟合。拟合意味着找到最优的函数去模拟训练集中的输入(特征)和目标(标签)的关系,这是确定模型的参数

from sklearn.linear_model import LinearRegression #导入线性回归算法模型
model = LinearRegression() #确定线性回归算法
model.fit(X_train, y_train) #根据训练集数据, 训练机器, 拟合函数

运行代码段后,Colab会输出LinearRegression模型中一些默认设定项的信息:

LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

好了,此时已经成功运行完fit方法,学习到的函数也已经存在机器中了,现在就可以用model(模型)的predict方法对测试集的房价进行预测,如下段代码所示。(当然,等会儿我们也可以偷偷瞅一瞅这个函数是什么样……)

y_pred = model.predict(X_test) #预测验证集的y值
print ('房价的真值(测试集)', y_test)
print ('预测的房价(测试集)', y_pred)

预测好了!来看看预测值和真值之间的差异有多大:

房价的真值(测试集) [171400. 189600. 500001. ... 142900. 128300. 84700.]
预测的房价(测试集) [211157. 218581. 465317. ... 201751. 160873. 138847.]

虽然不是特别准确,但基本上预测值还是随着真值波动,没有特别离谱。那么显示一下这个预测能得多少分:

print("给预测评分:", model.score(X_test, y_test)) #评估预测结果

结果显示:0.63213234分!及格了!

给预测评分:0.63213234

小冰问道:“等等,什么及格了?总得有个标准。0.63213234分到底是怎么来的?”

咖哥说:“Sklearn线性回归模型的score属性给出的是R2分数,它是一个机器学习模型的评估指标,给出的是预测值的方差与总体方差之间的差异。要理解这个,需要一点儿统计学知识哦,现在你们只要知道,要比较不同的模型,都应采用相同的评估指标,在同样的标准下,哪个分数更高,就说明哪个模型更好!”

还有,刚才说过可以看这个机器学习的函数是什么样儿,对吧?现在可以用几行代码把它大致画出来:

import matplotlib.pyplot as plt #导入Matplotlib库
#用散点图显示家庭收入中位数和房价中位数的分布
plt.scatter(X_test.median_income, y_test, color='brown')
#画出回归函数(从特征到预测标签)
plt.plot(X_test.median_income, y_pred, color='green', linewidth=1)
plt.xlabel('Median Income') #x轴:家庭收入中位数
plt.ylabel('Median House Value') #y轴:房价中位数
plt.show() #显示房价分布和机器学习到的函数模型

x轴的特征太多,无法全部展示,我只选择了与房价关系最密切的“家庭收入中位数”median_income作为代表特征来显示散点图。下图中的点就是家庭收入/房价分布,而绿色线就是机器学习到的函数模型,很粗放,都是一条一条的线段拼接而成,但是仍然不难看出,这个函数模型大概拟合了一种线性关系。

函数模型大概拟合了一种线性关系(请见339页彩色版插图)

加州各个地区的平均房价中位数有随着该地区家庭收入中位数的上升而增加的趋势,而机器学习到的函数也同样体现了这一点

“这说明什么呢,同学们?” 咖哥自问自答,“物以类聚,人以群分,这显示的就是富人区的形成过程啊!”

好,现在咱们看一下Colab的界面,这个Jupyter Notebook代码加上一部分输出大致如下图所示。

Colab程序

至此,一个很简单的机器学习任务就被完成了!麻雀虽小,五脏俱全。不到20行的代码,我们已经应用线性回归算法,预测了大概3000多个加州地区的房价中位数。当然,很多代码你们可能还是一知半解的。而且这个示例很粗糙,没有做特征工程,没有数据预处理,机器学习模型的选择也很随意。但是那并不会影响,随着更深入的学习,同学们会越来越清楚自己在做什么,而且在以后的课程中,还会深入剖析LinearRegression这个模型背后到底隐藏了些什么。

“现在,最重要的是,你们已经能够开始利用Colab编写自己的Python程序代码了。Jupyter Notebook正是为新手训练所准备的。一边试试代码,一边写一些文字笔记,这真是一种享受啊……”咖哥似乎十分开心,抿了一口手边的咖啡……

1.2.4 在Kaggle上参与机器学习竞赛

下面大力推荐我的最爱——Kaggle网站,同学们搜一下“Kaggle”就能找到它。对于机器学习爱好者来说,Kaggle大名鼎鼎,而且特别实用。它是一个数据分析和机器学习竞赛平台:企业和研究者在上面发布数据,数据科学家基于这些数据进行竞赛以创建更好的机器学习模型。Kaggle的口号是Making Data Science a Sport(使数据科学成为一项运动)。

Kaggle就是一个机器学习小项目集散地。在这里,你们几乎可以找到你们想要的任何东西:竞赛(也就是机器学习实战项目)、数据集、源代码、课程、社区。这里是机器学习初学者的天堂。而且,你们有没有觉得Kaggle、Kaggle这发音很像“咖哥、咖哥”?

同学们忽然觉得咖哥相当自恋。

咖哥浑然不觉,接着说:“好,现在你们去那儿先注册一个账号吧。”

账号注册好之后,在Notebooks中单击“New Notebook”,就可以新建一个自己的机器学习应用程序,页面会提示是创建一个比较纯粹的Python Script还是一个Notebook,如下图所示。不过,我还是更喜欢图文并茂的Notebook。

Kaggle:新建Notebook

咖哥发言

同学们注意,Kaggle里面的Notebook原来叫作Kernel,后来跟着其他网站的习惯,统一用Notebook。然而在Kaggle网站中,很多地方还是沿用Kernel这个名称。

比起Colab,Kaggle最大的优势可能在于自带很多的数据集(Datasets),这些数据集各有特色。在Kaggle中,“牛人”们纷纷创建自己的Notebook针对同一个数据集进行机器学习实战,然后互相比拼谁的更优秀,如下图所示。这种学习方式也大大地节省了自己搜集数据的时间。

Kaggle中的数据集:可以基于数据集创建Notebook

如何把Kaggle Notebook和数据集链接在一起呢?主要有以下几种方法。

(1)选择任何一个数据集,然后单击“New Notebook”按钮,就可以基于这个数据集开始自己的机器学习之旅了。

(2)选择Datasets之后,单击“Notebooks”,看看各路“大咖”针对这个数据集已经开发出了一些什么东西,然后喜欢的话单击“Copy and Edit”,复制其Notebook,慢慢研习,在“巨人的肩膀上”继续开发新模型。这里的课程中也是借鉴了一些大咖们的Notebooks代码,当然我已经通过邮件得到了他们的授权。

(3)直接选择Notebooks,单击“New Notebook”,有了Notebook之后,然后再通过“File”→“Add or upload dataset”菜单项选择已有的数据集,或者把自己的新数据集上传到Kaggle,如下图所示。

上传自己的新数据集到Kaggle

我个人比较喜欢用Kaggle而不是用Colab,因为Kaggle强在其大量的共享数据集和大咖们无私分享的Notebooks。另外,要在Colab中使用自己的数据集,需要先上传到Google Drive,然后用特定方式读取,这样总觉得操作起来多了一些麻烦,不如Kaggle的Datasets用起来那么直接。

而且Kaggle也有GPU,型号还是比T80更新的P100!通过Notebooks页面右侧的Settings选项(如下图所示),咱也能用上它(不过好像每周只有几小时的GPU配额)!

Kaggle的GPU选项

还有,TPU是比GPU更快的硬件加速器,Google和Kaggle都免费提供给大家使用。另外,也有人声称Colab比Kaggle Notebook更稳定,比较不容易在网页的刷新过程中丢失代码。这只是道听途说而已,我使用Kaggle的时候还没出现过丢失代码的情况。

1.2.5 在本机上“玩”机器学习

如果还是希望在自己的电脑上安装一个开发工具,那么Anaconda是首选。Anaconda下载页面如下图所示。

Anaconda下载页面

Anaconda是当前数据科学领域流行的Python编辑环境之一,安装使用都极为简单。从上面的图示中也可以看出,其中预装了很多Python数据科学工具库,比如NumPy、Pandas等。而且支持多种操作系统,比如Windows、macOS,以及Linux。

这里不赘述具体安装过程了,在官网上跟着说明进行安装即可。

由于Anaconda封装了很多的Python库,安装之后在本机创建Jupyter Notebook非常容易。而且无论是在线还是本机运行,Jupyter Notebook最大优势是简单易用、强交互、易展示结果,即可视化功能很强,我们可以查看每一段代码的输出与运行效果。

作为入门学习工具,Jupyter Notebook非常适合,但它也有局限性,比如版本控制难、不支持代码调试(debug)等。因此,在大型、复杂的机器学习和工程实践中,还需要配合更为强大的开发环境来使用。同学们进阶之后,也可以尝试用一用PyCharm这样的能够调试,以及便捷地查看数组结构和交互式图表的Python集成开发环境 (IDE),如下图所示。

Python集成开发环境 ——PyCharm

1.3 基本机器学习术语

咖哥问:“刚才我们进行了一次简单的机器学习项目实战,并且介绍了几个Jupyter Notebook开发平台。现在考一考同学们已经学过的内容。谁能说说机器学习的定义是什么?”

一位同学回答:“机器学习,就是机器基于输入数据集中的信息来训练、确立模型,对以前从未见过的数据做出有用的预测。”

咖哥说:“总结得不错。下面给出机器学习中其他一些基本术语的定义,如表1-1所示。”

表1-1 机器学习的基本术语

术语

定义

数学描述

示例

数据集

数据的集合

{(x1y1),…,(xnyn)}

1000个北京市房屋的面积、楼层、位置、朝向,以及部分房价信息的数据集

样本

数据集中的一条具体记录

x1y1

一个房屋的数据记录

特征

用于描述数据的输入变量

x1x2,…,xn}也是一个向量

面积(x1)、楼层(x2)、位置(x3)、朝向(x4

标签

要预测的真实事物或结果,也称为目标

y

房价

有标签样本

有特征、标签,用于训练模型

xy

800个北京市房屋的面积、楼层、位置、朝向,以及房价信息

无标签样本

有特征,无标签

x,?)

200个北京市房屋的面积、楼层、位置、朝向,但是无房价信息

模型

将样本的特征映射到预测标签

fx),其实也就是函数

通过面积、楼层、位置、朝向这些信息来确定房价的函数

模型中的参数

模型中的参数确定了机器学习的具体模型

fx)这个函数的参数

fx)= 3x + 2中的3和2

模型的映射结果

通过模型映射出无标签样本的标签

y'

200个被预测出来的房价

机器学习

通过学习样本数据,发现规律,得到模型的参数,从而得到能预测目标的模型

确定fx)和其参数的过程

确定房价预测函数和具体参数的过程

再稍微详细地说一说上表中最为重要的3个术语:特征、标签和模型。

1.3.1 特征

特征是机器学习中的输入,原始的特征描述了数据的属性。它是有维度的。特征的维度指的是特征的数目(不是数据集里面样本的个数),不同的数据集中的数据特征的维度不同,有多有少。

举例来说,如果预测商品的销量,把商品的类别、价格和推荐级别这3个属性定义为商品的特征,那么这个数据集就是三维特征数据集。其中的一个样本的格式如下:

x1x2x3

然而,所谓三维特征,其实只是二维数据结构中的一个轴(另一个轴是样本轴)上的数据个数。为了避免混淆,我们以后会把向量、矩阵和其他张量的维度统称为,或者称为1D向量、2D矩阵、3D张量等。因此,以后一提“维”,主要指的就是数据集中特征X的数目。一般来说,特征维度越高,数据集越复杂。这里的“维”和“阶”有点绕,以后还会反复强调。

咖哥发言

这里提到的张量是机器学习的数据结构,其实也就是程序中的数组。在第2课中,才会很详细地讲解各种张量的结构。向量、矩阵都是张量的一种。简单地理解,向量张量是一个1D数组,而矩阵张量是一个2D数组。

1.3.2 标签

标签,也就是机器学习要输出的结果,是我们试图预测的目标。示例里面的标签是房价。实际上,机器学习要解决什么问题,标签就是什么。比如:未来的股票价格、图片中的内容(猫、狗或长颈鹿)、文本翻译结果、音频的输出内容、AlphaGo的下一步走棋位置、自动导购汽车的行驶方向等。

下面是一个有标签数据样本的格式:

x1x2x3y

标签有时候是随着样本一起来的,有时候是机器推断出来的,称作预测标签y'(也叫y-hat,因为那一撇也可放在y的上方,就像是戴了一个帽子的y)。比较yy'的差异,也就是在评判机器学习模型的效果。

表1-2显示的是刚才实战案例中加州房价数据集中的部分特征和标签。

表1-2 加州房价数据集中的特征和标签

人口特征

房屋数量特征

家庭收入中位数特征

房价中位数标签

322

126

8.325 2

452 600

2 401

1 138

8.301 4

358 500

496

177

7.257 4

352 100

558

219

5.643 1

341 300

565

259

3.846 2

342 200

413

193

4.036 8

269 700

1 094

514

3.659 1

299 200

并不是所有的样本都有标签。在无监督学习中,所有的样本都没有标签。

1.3.3 模型

模型将样本映射到预测标签y'。其实模型就是函数,是执行预测的工具。函数由模型的内部参数定义,而这些内部参数通过从数据中学习规律而得到。

在机器学习中,先确定模型的类型(也可以说是算法),比如是使用线性回归模型,还是逻辑回归模型,或者是神经网络模型;选定算法之后,再确定模型的参数,如果选择了线性回归模型,那么模型fx) = 3x + 2中的3和2就是它的参数,而神经网络有神经网络的参数。类型和参数都确定了,机器学习的模型也就最终确定了。

1.4 Python和机器学习框架

大家有没有想过,为什么Python不知不觉中成了最流行的机器学习语言之一?

1.4.1 为什么选择用Python

Python像Java、C++、Basic一样,是程序员和计算机交互的方式。

但是,为什么选择用Python。有句话大家可能都听过:人生苦短,Python是岸。

这话什么意思呢?Python易学、易用、接地气。这就好比一个学编程的人,在程序设计的海洋里面遨游,游啊,游啊,总觉得这海实在太浩瀚了,找不着北。突然发现了Python这种语言,就上岸了……

Python是一种很简洁的语言,容易写、容易读,而且在机器学习方面有独特的优势。

机器学习的目的是解决实际问题,而不是开发出多强大的应用软件。因此,编写程序代码是工具而非目的,追求的是方便。搞数据科学和机器学习的人并不一定都是资深程序员,他们希望将自己头脑中的公式、逻辑和思路迅速转化到计算机语言。这个转化过程消耗的精力越少越好,而程序代码就不需要有多么高深、多么精致了。

而Python正是为了解决一个个问题而生的,比如数据的读取、矩阵的点积,一个语句即可搞定,要是用传统的C++、Java,那还真的很费力气。还有切片、广播等操作,都是直接针对机器学习中的数据结构——张量而设计的。

上面说的数据操作如此容易,很大程度上也是NumPy的功劳,我们以后还会反复提到NumPy这个数学函数库(扩展包)。因此,另外特别重要的一点就是Python的开发生态成熟,除NumPy外,还有非常多的库,这些库就是机器学习的开放框架。有很多库都是开源的,拿来就可以用。

综上,便捷和实用性强似乎是Python的天然优势。我觉得Python和一些老牌语言相比,有点像口语和文言文的区别,文言文虽然高雅,但是不接地气。因为Python接地气,所以用户社群强大、活跃。机器学习圈的很多大咖们也隶属于这个Python社群,开发了很多优质的库。这样一来Python在AI时代,搭着数据科学和机器学习顺风车,弯道超车Java和C++,成了最流行的编程语言之一。

1.4.2 机器学习和深度学习框架

大家可能听说过机器学习和深度学习“框架”这个名词,这个框架的作用可是很大的。想象一下,有一天老板说:“来,给你们一个任务,用机器学习的方法给咱们这些图片分类。”你们去Google查询了一下,发现这种图片分类任务用卷积神经网络来解决最好。但是你们很疑惑从头开始编写一个卷积神经网络是好做法吗?

Python的机器学习框架,也就是各种Python库,里面包含定义好的数据结构以及很多库函数、方法、模型等(即API)。我们只需要选择一个适合的框架,通过调用其中的API,编写少量代码,就可以快速建立机器学习模型了。为什么刚才的机器学习实战中只用了不到20行代码就能够完成预测加州房价这么“艰巨”的任务?其中最大的秘密就是使用了框架中的API。

良好的框架不仅易于理解,还支持并行化计算(即硬件加速),并能够自动计算微分、链式求导(“不明觉厉”是吧?不要紧,正因为框架把这些都做了,同学们就无须自己做这些不懂的东西)。

下图中,给出了8个机器学习中常用的库。

8个机器学习常用的库

这8个库,可分为3大类:Pandas和NumPy提供数据结构,支持数学运算;Matplotlib和Seaborn用于数据可视化;后面4个库提供算法,其中的Scikit-learn是机器学习框架,TensorFlow、Keras和PyTorch则是深度学习框架,可以选择一个来用。另有一些曾经有影响力的框架,如Theano、Caffe、CNTK等,随着“江山代有才人出”,使用率已经大大下降。而新的更方便的库呢?那也一定会继续涌现。

下面分别简单说说它们。

1. Pandas

我们已经使用过Pandas了!请回头看一下第一个机器学习项目的第一行代码,如下段代码所示。通过这一行代码,就可以把整个Pandas中的所有函数、数据结构导入当前机器学习程序的运行环境。

import pandas as pd #导入Pandas, 用于数据读取和处理

Pandas是基于NumPy的数据分析工具,里面预置了大量库函数和标准数据结构,可以高效地操作大型数据集。Pandas,连同其下层的NumPy,是使Python成为强大而高效的数据分析工具的重要因素之一。

Pandas中的预置数据结构有下面几种。

我们这个课程里面Pandas数据结构用得不多,只用到了2D的数据结构DataFrame,这种数据结构用来存储表格式的数据非常方便,可以直接被机器学习模型所读取。比如,刚才的加州房价机器学习项目,就先把数据文件读入一个DataFrame,然后把DataFrame导入了线性回归模型进行学习。

2. NumPy

NumPy是Python进行科学计算的基础库,有人称它为Python的数学扩展包。它提供了一个强大的多维数组对象array,还提供了大量API支持数组运算。

本课程中将重点使用的数据结构就是NumPy中的数组

NumPy所自带的向量化运算功能在机器学习中也属于不可或缺的技能。目前的CPU和GPU都有并行处理的处理器,能够无缝衔接NumPy的向量化运算,大幅度提升机器学习的效率。

后面我们会专门讲NumPy的数组(在机器学习中称为张量)及其基本运算这部分内容。

3. Matplotlib

Matplotlib是Python及其数学扩展包NumPy的可视化操作界面,通过应用程序接口(API)向应用程序提供嵌入式绘图功能。其中还有面向其他图像处理库(如开放图形库OpenGL)的接口。

Matplotlib的设计与MATLAB的绘图功能非常相似(名字都很相似!),然而它是开源的、免费的。这自然令大家觉得物超所值。

Matplotlib好用又强大。刚才的实战过程中导入Matplotlib的绘图工具后,通过短短几行代码,就把加州房价分布的散点图和机器学习到的模型呈现出来了。

4. Seaborn

Seaborn是在Matplotlib基础上设计出的绘图库,因此是更高级的视觉化工具,可以画出特别酷炫的数学统计图形。

5. Scikit-learn

Scikit-learn刚才也已经用过了,如下段代码所示。用于预测加州房价的机器学习模型Linear Regression就是直接从那儿“拎”出来的。

from sklearn.linear_model import LinearRegression #导入线性回归算法模型
model = LinearRegression() #使用线性回归算法

它简称Sklearn,是一个相当强大的Python机器学习库,也是简单有效的数据挖掘和数据分析工具。Sklearn基于NumPy、SciPy和Matplotlib构建,其功能涵盖了从数据预处理到训练模型,再到性能评估的各个方面。

Scikit-learn真的太好用了,它里面包含的大量可以直接使用的机器学习算法,这节省了很多时间。因为不必重复编写算法,更多的精力可以放在问题定义、数据分析、调整参数、模型性能优化等这些具体项目相关的工作上面。本课程的机器学习模型,大多通过调用Scikit-learn库来实现。

6. TensorFlow

Sklearn是机器学习的工具集,而TensorFlow则是深度学习的设计利器。据说Google主要产品的开发过程都有TensorFlow的参与,并且它以某种形式进行机器学习。很惊讶吧。

但对于新手来说有个小小遗憾:TensorFlow编程建立在“图”这个抽象的概念之上,据说其难度比起其他的深度学习框架更高,至少要研究几天才能搞清楚入门内容。这太耗时了!我们学机器学习和深度学习,目标是几个小时以内上手。因此,本课程的案例不采用TensorFlow进行设计。

小冰焦急地问:“你不是说TensorFlow是很强大的深度学习工具吗?不用TensorFlow,那你用什么讲课?”

咖哥回答:“Keras!”

7. Keras

Keras建立在TensorFlow、CNTK或Theano这些后端框架之上。这也就是说,Keras比TensorFlow更高级。在计算机领域,高级是“简单”的代名词。高级意味着易学易用。

Keras才出来没两年时,就已经大受欢迎,到现在已经是除TensorFlow外最流行的、排行第二位的深度学习框架。

搞机器学习的人,就喜欢简单易用的工具。

其实,写Keras的时候是在对其后端进行调用,相当于还是在TensorFlow上运行程序,只不过将程序经过Keras中转了一下变成TensorFlow听得懂的语言,再交给TensorFlow处理。

鉴于Keras易用且高效的特点,本课程的深度学习模型,都使用Keras来实现。

8. PyTorch

PyTorch是TensorFlow的竞争对手,也是一个非常“优雅”的机器学习框架。相对TensorFlow而言,Facebook开发的PyTorch上手相对简单一些,里面所有的算法都是用Python写的,源码也很简洁。近期PyTorch用户量的增长也是相当迅速的。

1.5 机器学习项目实战架构

今天课程的最后,我们来重点讲解如何进行机器学习项目的实战:如何开始、关键的步骤有哪些,以及每个步骤中要注意些什么。

李宏毅老师曾用将大象装进冰箱来比喻机器学习。大象怎么被装进冰箱?这分为3个步骤:打开冰箱门,将大象放进去,关闭冰箱门。机器学习也就是个“三部曲”:选择函数模型,评估函数的优劣,确定最优的函数,如下图所示。

机器学习建模三部曲:选择函数模型,评估函数的优劣,确定最优的函数

这个比喻非常精彩,但它主要聚焦于“建模”过程,未强调机器学习项目其他环节。机器学习项目的实际过程要更复杂一些,大致分为以下5个环节。

(1)问题定义。

(2)数据的收集和预处理。

(3)选择机器学习模型。

(4)训练机器,确定参数。

(5)超参数调试和性能优化。

这5个环节,每一步的处理是否得当,都直接影响机器学习项目的成败。而且,如下图所示,这些步骤还需要在项目实战中以迭代的方式反复进行,以实现最优的效果。

机器学习项目实战的5个环节

现在就详细说说机器学习项目实战中的每个具体环节都在做些什么。

1.5.1 第1个环节:问题定义

机器学习项目是相当直观的。换句话说,机器学习项目都是为了解决实际的问题而存在。

第一个环节是对问题的构建和概念化。同学们想象一下一个医生接到一个病人后,如果不仔细研究病情,分析问题出在何处,就直接开药、动手术,后果会如何呢?在心理咨询领域,有一个名词叫作 “个案概念化”。它的意思是心理咨询师通过观察分析,先评估界定来访者的问题,以指导后续的咨询进程;否则,可能很多次的咨询、治疗,都是在原地绕圈。

我们做机器学习项目,道理也很类似。如果每个团队成员都知道项目要解决的是什么问题,那么项目也许已经成功了一半,然而有很多人其实是不知道大方向所在的。

因此,不是一开始就建立模型,而是首先构建你的问题。反复问一问自己、问一问客户和其他项目干系人,目前的痛点是什么、要解决的问题是什么、目标是什么。对这些关键问题的回答可以说是相当重要的,但是很奇怪的是在现实中最关键的内容反而最有可能被忽略。

举例来说,看一下下面这个问题的定义。

这就是一个定义比较清楚,有可能起到作用的机器学习项目。再看一下下面这个问题的定义。

这个“预测股市”,看起来也许是机器学习问题,实际上可能是一个伪机器学习问题。因为对目标的定义太不具体了。预测股市的什么内容?是某只股票的第二天的价格,还是未来一个月整体的走势?而且机器学习是否能在股市预测中发挥作用?似乎不大可能。我们可以运用这样一个简单的方法去评判机器学习是否会生效:如果机器学习无法预测历史,它就无法预测未来。这是因为机器学习只能识别出它曾经见过的东西。要想在过去的数据的基础上预测未来,其实存在一个假设,就是未来的规律与过去相同。但对于股价而言,事实往往并非如此[6]。也就是说,即使用1998—2007年的全部数据去训练机器,机器也不能预测出2008年的金融危机,因此它也不大可能成功预测未来。

[6] 肖莱.Python深度学习[M].张亮,译.北京:人民邮电出版社,2018.

小冰点头称是。

咖哥接着说:“下面我们一边讲,一边同步进行另一个机器学习项目的实战。”

这里要向大家介绍MNIST数据集。这个数据集相当于是机器学习领域的Hello World,非常的经典,里面包含60 000张训练图像和10 000张测试图像,都是28px×28px的手写数字灰度图像,如下图所示。”

MNIST数据集中的手写数字灰度图像

此处要解决的问题是:将手写数字灰度图像分类为0,1,2,3,4,5,6,7,8,9,共10个类别。

咖哥发言

灰度图像与黑白图像不同哦,黑白图像只有黑、白两种颜色,对应的像素的值是0和1;而灰度图像在黑色与白色之间还有许多灰度级别,取值为0~255。

1.5.2 第2个环节:数据的收集和预处理

数据是机器学习的燃料。机器学习项目的成败,数据很可能是关键。

下面主要介绍以下内容。

1. 原始数据的准备

原始数据如何获得呢?有时候是自有的数据(如互联网公司拥有的大量的客户资料、购物行为历史信息),或者需要上网爬取数据;有时候是去各种开源数据网站下载(ImageNet、Kaggle、Google Public Data Explorer,甚至Youtube和维基百科,都是机器学习的重要数据源),或者可以购买别人的数据。

2. 数据的预处理

从本机或者网络中载入原始数据之后,预处理工作包括以下几个部分。

数据预处理的原则如下。

3. 特征工程

特征工程仍然是在机器对数据集学习之前进行的操作,广义上也算数据预处理。

特征工程是使用数据的领域知识来创建使机器学习算法起作用的特征的过程。特征工程是机器学习的重要环节,然而这个环节实施困难又开销昂贵,相当费时费力。

有时,我们也会听到特征提取(feature extraction)的概念,它是特征工程的一个类型,它是通过子特征的选择来减少冗余特征,使初始测量数据更简洁,同时保留最有用的信息。

为什么要对数据的特征进行处理?因为机器学习之所以能够学到好的算法,关键看特征的质量。那就需要思考下面的问题。

(1)如何选择最有用的特征给机器进行学习?

(2)如何把现有的特征进行转换、强化、组合,创建出来新的、更好的特征?

比如,对于图像数据,可以通过计算直方图来统计图像中像素强度的分布,得到描述图像颜色的特征。又比如,通过调整原始输入数据的坐标轴的方向(坐标变换),就有可能使问题得到更好的描述。总而言之,就是通过各种手段让数据更好地为机器所用。

在深度学习时代,对于一部分机器学习问题,自动化的特征学习可以减少对手动特征工程的需求。但特征工程在另一些机器学习问题中,仍然是不可或缺的环节。

4. 载入MNIST数据集

下面用1.2.4节中介绍过的方法新建一个Kaggle Notebook,并在其中直接载入Keras自带的MNIST数据集,如下段代码所示(注意,需要打开屏幕右侧Settings的Internet选项才能载入该数据集,如下图所示)。

import numpy as np # 导入NumPy库
import pandas as pd # 导入Pandas库
from keras.datasets import mnist #从Keras中导入MNIST数据集
#读入训练集和测试集
(X_train_image, y_train_label), (X_test_image, y_test_label) =  mnist.load_data() 

Kaggle Notebook的Internet选项

单击Kaggle Notebook中的图标运行上面的代码后,这个数据集里面的数据就被读入以下NumPy张量。

数据向量化的工作MNIST数据集已经为我们做好了,可以直接显示这些张量里面的内容:

print ("数据集张量形状:", X_train_image.shape) #用shape方法显示张量的形状
print ("第一个数据样本:\n", X_train_image[0]) #注意Python的索引是从0开始的

代码运行后的输出结果如下:

数据集张量形状:(60000,28,28)
第一个数据样本:
[[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]
       … … 
       … … 
[  0   0   0   0   0   0   0   0  30  36  94 154 170 253 253 253 253 253
 225 172 253 242 195  64   0   0   0   0]
[  0   0   0   0   0   0   0  49 238 253 253 253 253 253 253 253 253 251
 93  82  82  56  39   0   0   0   0   0]
       … … 
       … … 
[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
    0   0   0   0   0   0   0   0   0   0]]

shape方法显示的是X_train_image张量的形状。灰度图像数据集是3D张量,第一个维度是样本维(也就是一张一张的图片,共60 000张),后面两个是特征维(也就是图片的28px×28px的矩阵)。因为28px×28px的矩阵太大,这里省略了部分输入内容,你们可以发现灰度信息主要集中在矩阵的中部,边缘部分都是0填充,是图片的背景。数字矩阵的内容差不多如下图所示。

再看一下标签的格式:

print ("第一个数据样本的标签:", y_train_label[0])

数字矩阵存储图片信息的方式——这个矩阵就是机器需要学习的内容

输出显示数字8——上面这么大的一个数字矩阵,到头来只变成一个简单的信息8:

第一个数据样本的标签:8

上面的数据集在输入机器学习模型之前还要做一些数据格式转换的工作:

from tensorflow.keras.utils import to_categorical # 导入One-hot编码工具
X_train = X_train_image.reshape(60000, 28, 28, 1) # 给标签增加一个维度
X_test = X_test_image.reshape(10000, 28, 28, 1) # 给标签增加一个维度
y_train = to_categorical(y_train_label, 10) # 特征转换为one-hot编码
y_test = to_categorical(y_test_label, 10) # 特征转换为one-hot编码
print ("训练集张量形状:", X_train.shape) # 训练集张量的形状
print ("第一个数据标签:", y_train[0]) # 显示标签集的第一个数据

输出新的数据格式:

训练集张量形状:(60000, 28, 28, 1)
第一个数据标签:[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]

解释一下为何需要新的格式。

(1)Keras要求图像数据集导入卷积网络模型时为4阶张量,最后一阶代表颜色深度,灰度图像只有一个颜色通道,可以设置其值为1。

(2)在机器学习的分类问题中,标签[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]就代表着类别值8。这是等会儿还要提到的one-hot编码。

1.5.3 第3个环节:选择机器学习模型

第3个环节先是选择机器学习模型的算法类型,然后才开始训练机器确定参数。

各种Python机器学习框架中有很多类型的算法,主要包括以下几种。

那么究竟用哪个呢?

答案是——这与要解决的问题有关。没有最好的算法,也没有最差的算法。随机森林也许处理回归类型问题很给力,而神经网络则适合处理特征量巨大的数据,有些算法还能够通过集成学习的方法组织在一起使用。只有通过实践和经验的积累,深入地了解各个算法,才能慢慢地形成“机器学习直觉”。遇见的多了,一看到问题,就知道大概何种算法比较适合。

那么我们为MNIST数据集手写数字识别的问题选择什么算法作为机器学习模型呢?这里挑一个图片处理最强的工具,就是大名鼎鼎的卷积神经网络。

咖哥此处忽然笑了两声。小冰说:“你笑什么呢?”咖哥说:“卷积神经网络处理这个MNIST小问题,我都觉得‘杀鸡用牛刀’了。下面看看代码吧。”

from keras import models # 导入Keras模型, 以及各种神经网络的层
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
model = models.Sequential() # 用序贯方式建立模型
model.add(Conv2D(32, (3, 3), activation='relu', # 添加Conv2D层
              input_shape=(28, 28, 1))) # 指定输入数据样本张量的类型
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Conv2D(64, (3, 3), activation='relu')) # 添加Conv2D层
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Dropout(0.25)) # 添加Dropout层
model.add(Flatten()) # 展平
model.add(Dense(128, activation='relu')) # 添加全连接层
model.add(Dropout(0.5)) # 添加Dropout层
model.add(Dense(10, activation='softmax')) # Softmax分类激活, 输出10维分类码
# 编译模型
model.compile(optimizer='rmsprop', # 指定优化器
            loss='categorical_crossentropy', # 指定损失函数
            metrics=['accuracy']) # 指定验证过程中的评估指标

这里先简单地解释一下代码中都做了些什么(当然更多的细节要以后再说)。这段代码把数据集放入卷积神经网络进行处理。这个网络中包括两个Conv2D(二维卷积)层,两个MaxPooling2D(最大池化)层,两个Dropout层用于防止过拟合,还有Dense(全连接)层,最后通过Softmax分类器输出预测标签y'值,也就是所预测的分类值。这个y'值,是一个one-hot(即“一位有效编码”)格式的10维向量。我们可以将y'与标签真值y进行比较,以计算预测的准确率。整个过程如下图所示。

咖哥发言

我当然知道上面这段话里面出现了很多生词,比如Softmax、卷积、最大池化、过拟合、one-hot、10维向量等,我们后面将一点一点把这些词语全部搞明白。现在的目的主要是解释项目实战的流程,所以大家先不要害怕新概念,耐心一点跟着我往下走。

卷积神经网络实现手写数字识别

1.5.4 第4个环节:训练机器,确定参数

确定机器学习模型的算法类型之后,就进行机器的学习,训练机器以确定最佳的模型内部参数,并使用模型对新数据集进行预测之所以说在这一环节中确定的是模型内部参数,是因为机器学习中还有超参数的概念。

下面用fit(拟合)方法,开始对机器进行5轮的训练:

model.fit(X_train, y_train, # 指定训练特征集和训练标签集
       validation_split = 0.3, # 部分训练集数据拆分成验证集
       epochs=5, # 训练轮次为5轮
       batch_size=128) # 以128为批量进行训练

在上面的训练过程中,fit方法还自动地把训练集预留出30%的数据作为验证集(马上就会讲到什么是验证集),来验证模型准确率。

输出结果如下:

Train on 42000 samples, validate on 18000 samples
Epoch 1/5
42000/42000 [==============================] - 62s 1ms/step - loss: 0.9428 - accuracy: 0.8827 - val_loss: 0.1172 - val_accuracy: 0.9677
Epoch 2/5
42000/42000 [==============================] - 61s 1ms/step - loss: 0.1422 - accuracy: 0.9605 - val_loss: 0.0917 - val_accuracy: 0.9726
Epoch 3/5
42000/42000 [==============================] - 62s 1ms/step - loss: 0.1065 - accuracy: 0.9700 - val_loss: 0.0735 - val_accuracy: 0.9807
Epoch 4/5
42000/42000 [==============================] - 61s 1ms/step - loss: 0.0885 - accuracy: 0.9756 - val_loss: 0.0602 - val_accuracy: 0.9840
Epoch 5/5
42000/42000 [==============================] - 61s 1ms/step - loss: 0.0813 - accuracy: 0.9779 - val_loss: 0.0692 - val_accuracy: 0.9842

以上显示的5轮训练中,准确率逐步提高。

小冰发问:“刚才预测加州房价也是用的fit方法,怎么没看见程序输出这个一轮一轮的训练过程信息呢?”咖哥说:“我们现在训练的是神经网络,训练一次称为一轮。刚才用的是Sklearn里面的LinearRegression模型,训练的过程也是经过了多次迭代,只是该过程已经完全封装在方法内部了,并没有显示出来。”

小冰又问:“那么训练5轮之后,咱们这个卷积神经网络模型的模型内参数都是什么呢?怎么看呢?”咖哥说:“那是看不到的,因为卷积神经网络中的参数太多了,以万为计。但是我们可以把训练好的模型保存下来,以供将来调用。”

1.5.5 第5个环节:超参数调试和性能优化

机器学习重在评估,只有通过评估,才能知道当前模型的效率,才能在不同模型或同一模型的不同超参数之间进行比较。举例来说,刚才的训练轮次——5轮,是一个超参数。我们想知道对于当前的卷积神经网络模型来说,训练多少轮对于MNIST数据集最为合适。这就是一个调试超参数的例子,而这个过程中需要各种评估指标作为调试过程的“风向标”。正确的评估指标相当重要,因为如果标准都不对,最终模型的效果会南辕北辙,性能优化更是无从谈起。

下面介绍两个重要的评估点。

1. 训练集、验证集和测试集

为了进行模型的评估,一般会把数据划分成3个集合:训练数据集、验证数据集和测试数据集,简称训练集(training set)、验证集(validation set)和测试集(test set)。在训练集上训练模型,在验证集上评估模型。感觉已经找到最佳的模型内部参数和超参数之后,就在测试集上进行最终测试,以确定模型。

小冰问:“一个训练集和一个测试集还不够吗?”

咖哥答道:“也许简单的机器学习项目,2个集合也就够了。但是大型机器学习项目,至少需要3个集合”。

机器学习模型训练时,会自动调节模型内部参数。这个过程中经常出现过拟合(overfit)的现象。过拟合现在是个新名词,不过后面我们几乎随时都要和过拟合现象作战。目前来说,大家可以把过拟合理解为模型对当前数据集的针对性过强了,虽然对训练集拟合效果很好,但是换一批新数据就不灵了。这叫作模型的泛化能力弱

解决了在训练集上的过拟合问题之后,在继续优化模型的过程中,又需要反复地调整模型外部的超参数,这个过程是在训练集和验证集中共同完成的。这个调试、验证过程会导致模型在验证集上也可能过拟合,因为调试超参数本身也是一种训练。这个现象叫作信息泄露(information leak)。也就是说,即使我们选择了对验证集效果最好的超参数,这个好结果也不一定真的能泛化到最终的测试集。

即使得到的模型在验证集上的性能已经非常好,我们关心的还是模型在全新数据上的性能。因此,我们需要使用一个完全不同的、前所未见的数据集来对模型进行最终的评估和校正,它就是测试集。在最终验证之前,我们的模型一定不能读取任何与测试集有关的任何信息,一次也不行。

下面就在MNIST测试集上进行模型效率的验证,如下段代码所示。这个测试集的任何数据信息都没有在模型训练的过程中暴露过。

score = model.evaluate(X_test, y_test) # 在验证集上进行模型评估
print('测试集预测准确率:', score[1]) # 输出测试集上的预测准确率

结果显示测试准确率达到0.983 8,成绩相当不错:

测试集预测准确率: 0.9838

2. K折验证

上面的测试集测试结果相当不错,但问题是,如果最终验证结果仍不尽如人意的话,那么继续调试和优化就会导致这个最终的测试集又变成了一个新的验证集。因此需要大量新数据的供给,以创造出新的测试数据集。

数据,很多时候都是十分珍贵的。因此,如果有足够的数据可用,一般来说按照60%、20%、20%的比例划分为训练集、验证集和测试集。但是如果数据本身已经不大够用,还要拆分出3个甚至更多个集合,就更令人头疼。而且样本数量过少,学习出来的规律会失去代表性。因此,机器学习中有重用同一个数据集进行多次验证的方法,即K折验证,如下图所示。

K折验证将数据划分为大小相同的K个分区

K折验证(K-fold validation)的思路是将数据划分为大小相同的K个分区,对于每个分区,都在剩余的K-1个分区上训练模型,然后在留下的分区上评估模型。最终分数等于K个分数的平均值。对于数据集的规模比较小或者模型性能很不稳定的情况,这是一种很有用的方法。注意K折验证仍需要预留独立的测试集再次进行模型的校正[7]

[7] 肖莱.Python深度学习[M].张亮,译.北京:人民邮电出版社,2018.

3. 模型的优化和泛化

优化(optimization)和泛化(generalization),这是机器学习的两个目标。它们之间的关系很微妙,是一种此消彼长的状态。

模型能否泛化,也许比模型在当前数据集上的性能优化更重要。经过训练之后100张猫图片都能被认出来了,但是也没什么了不起,因为这也许是通过死记硬背实现的,再给几张新的猫图片,就不认识了。这就有可能是出现了“过拟合”的问题——机器学习到的模型太过于关注训练数据本身。

关于优化、泛化和过拟合,这里就先蜻蜓点水式地简单说说它们的概念。在后面的课程中还会很详细地讲如何避免过拟合的问题。而对于目前的MNIST数据集,卷积神经网络模型是没有出现过拟合的问题的,因为在训练集、验证集和测试集中,评估后的结果都差不多,预测准确率均为98%以上,所以模型泛化功能良好。

这时小冰又开口了:“我憋了半天,一直想问一个问题呢。这里预测准确率是给出来了,但是具体的预测结果在什么地方呢?你说的百分之九十八点多少,我也没看见啊?怎么证明呢?”

小冰一说,其他同学频频点头。

4. 怎么看预测结果

其实在测试集上进行评估之后,机器学习项目就大功告成了。想知道具体的预测结果,可以使用predict方法得到模型的预测值。下面看看代码吧。

pred = model.predict(X_test[0].reshape(1, 28, 28, 1)) # 预测测试集第一个数据
print(pred[0], "转换一下格式得到:", pred.argmax()) # 把one-hot编码转换为数字
import matplotlib.pyplot as plt # 导入绘图工具包
plt.imshow(X_test[0].reshape(28, 28), cmap='Greys') # 输出这个图片

前两行代码,是对测试集第一个数据(Python索引是从0开始的)进行预测,并输出预测结果。argmax方法就是输出数组里面最大元素的索引,也就是把one-hot编码转换为实际数值。

输出结果如下:

[[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]]转换一下格式得到:7

后面的plt.imshow函数则输出原始图片,如下图所示。

原始图片:手写数字7

果然是正确答案7,与预测结果的one-hot编码相匹配,证明预测对了!

5. 调试过程出错怎么办

前面的实战过程都比较顺利,那是因为代码都是现成的。然而,在同学们自己进行Python程序调试、运行的时候,难免遇到系统报错。这些信息有时只是Warning(警告),说明一些参数或设置可能要过时了,但是目前还能用。这些警告信息暂时可以忽略,也可以跟着Python的提示进行修正。

然而,如果出现类似于下图所示的Error信息,说明程序代码出错了。这时不要着急,Python会用箭头指出出错的语句,接着给出出错的具体原因。跟着这些信息,需要进行相应的代码修改。

Error信息

很难预测到具体实战时会出现什么样的错误。此时,不要恐慌,冷静分析是第一步。如果多次尝试也无法解决问题,去Google搜索一下报错的内容,可能就会得到答案,或者,鼓起勇气请教身边的Python“专家”吧。

在本节的最后,再强调一下,在机器学习实战开始之前,以及过程当中,应反复问问自己以下几个问题。

那么如果机器学习模型的调试过程中出现了问题,原因会出在哪里呢?可能出在任何一个环节:问题定义得不好,数据集质量不好,模型选得不好,机器训练得不好,评估调试得不好,都有可能使机器学习项目停止,无法进一步优化。

1.6 本课内容小结

同学们,祝贺大家终于学完了这最为基础的一课。万事开头难,本课中理论的东西有点多,目前大家理解起来应该是挺辛苦的。因为基于长期实践总结出来的东西,对于没有上过手的人来说,难免学起来是一头雾水。这是正常的现象。也许上完全部课程后,回过头来复习,你们会有更多的感悟。

下面是本课中的重点内容。

(1)首先是机器学习的内涵:机器学习的关键内涵在于从大量的数据中发现一个“模型”,并通过它来模拟现实世界事物间的关系,从而实现预测或判断的功能。

(2)通过在线的Jupyter Notebook,可以方便快捷地进行机器学习实战。Colab和Kaggle,是两个提供免费Jupyter Notebook的平台,可以在其中通过Python编写机器学习源代码。

机器学习是一个有很强共享精神的领域,不仅免费在线开发工具多,无论是数据集、算法,还是库函数和框架方面,都有很多开源的项目可供选择。

(3)最后给出了机器学习项目实战流程中的5个环节,指导我们进行实战,具体包括问题定义、数据的收集和预处理、选择机器学习模型、训练机器,确定参数、超参数调试和性能优化,如下图所示。

不断优化,找到最佳模型

总而言之,机器学习实战的各个环节就像机器学习模型训练一样,是一个反复迭代的过程。只有不断优化,才能找到最完善的模型、达到最佳状态,这也是符合敏捷(agile)和DevOps那种快捷的、迭代式IT产品开发原则的。其秘密就是:迅速拿出一个可用产品的雏形,然后持续完善它。嗯,跑题了,下课吧。不过,别忘记完成课后的练习哦。

1.7 课后练习

练习一 请同学们列举出机器学习的类型,并说明分类的标准。

练习二 解释机器学习术语:什么是特征,什么是标签,什么是机器学习模型。

练习三 我们已经见过了Google中的加州房价数据集和Keras自带的MNIST数据集,请同学们自己导入Keras的波士顿房价(boston_housing)数据集,并判断其中哪些是特征字段,哪些是标签字段。

(提示:使用语句from keras.datasets import boston_housing导入波士顿房价数据集。)

练习四 参考本课中的两个机器学习项目代码,使用LinearRegression线性回归算法对波士顿房价数据集进行建模。

相关图书

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

相关文章

相关课程