机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度等多门学科,专门研究计算机怎样模拟或实现人类的学习行为。机器学习是人工智能的核心,是使计算机具有 智能的根本途径。
本书通过对机器学习的背景知识、算法流程、相关工具、实践案例以及知识图谱等内容的讲解,全面介绍了机器学习的理论基础和实践应用。书中涉及机器学习领域的多个典型算法,并详细给出了机器学习的算法流程。
本书适合任何有一定数据功底和编程基础的读者阅读。通过阅读本书,读者不仅可以了解机器学习的理论基础,也可以参照一些典型的应用案例拓展自己的专业技能。同时,本书也适合计算机相关专业的学生以及对人工智能和机器学习感兴趣的读者阅读。
通过阅读本书,你将了解到:
李博,花名“傲海”。目前任阿里云数据产品经理,主要负责机器学习平台的产品化建设以及对外业务应用。本科、硕士毕业于北京邮电大学,曾就职于索尼和华为(实习),从事数据相关产品的开发。作为 CSDN 博客专家、云栖社区博客专家,长期分享 IT 技术相关文章,内容涉及机器学习算法、Android 应用及源码开发等领域。一直活跃于开发者社区,主导开发了多个 GitHub 百星开源项目,还开发并上线了多款手机 App。
近年来,在 IT 圈大家谈论最多的就是人工智能。AlphaGo 与围棋选手的人机大战更是让我们领略到人工智能技术巨大潜力的同时,又将人工智能推向了一个新的制高点。
人工智能的发展得益于云计算和大数据技术的成熟与普及。和人工智能相关的还有两个核心词汇——机器学习和深度学习。这三者有着什么样的关系?所谓人工智能,通俗地讲是指由人工制造出来的系统所表现出来的智能。人工智能研究的核心问题包括推理、知识、交流、感知、移动和操作物体的能力。而机器学习是人工智能的一个分支,很多时候机器学习几乎成为人工智能的代名词。机器学习简单来讲就是通过算法,使机器能从大量历史数据中学习规律,从而对新的样本做出智能识别或对未来做预测。深度学习是机器学习的一个新领域。之所以称为“深度”,是因为前面说的机器学习是浅层的学习,主要基于概率统计、矩阵或图模型而得出的分析结论。深度学习的概念源于人工神经网络的研究,它基于神经网络框架,通过模拟人脑学习的方式来处理数据。在人工智能实践中,数据是载体和基础,智能是追求的目标,而机器学习则是从数据通往智能的技术桥梁。因此,在人工智能领域,机器学习才是核心,是现代人工智能的本质。
人工智能的火热使市场上对机器学习人才的需求不断提高,很多从事软件开发的程序员纷纷转行投向机器学习领域。但机器学习对人才的技术和理论水平要求都非常高,除了要掌握统计学中各种复杂的机器学习算法的理论推导外,还要懂计算机算法的实现逻辑以及分布式、并行化等架构理论。
本书是以应用场景为导向,以代码实现为样例贯穿始终,并融入了通俗易懂的理论知识。对于机器学习爱好者和想进入相关领域的从业者来说,是一本值得推荐的好书。
从2015年开始,我有幸与作者在同一个团队工作,一起设计并研发阿里云的机器学习平台——PAI。作者对机器学习的理解以及产品上的设计思想都在本书中完美地呈现,值得准备进入机器学习领域的爱好者和从业者好好品读。
感谢作者让我在新书出版之前先睹为快。
——刘吉哲
阿里云高级专家
感谢我的父母这些年对我的鼓励,感谢我的女朋友,家人的支持永远是我的源动力,让你们生活得幸福是我奋斗的目标。感谢我的大学同学,特别是本科宿舍的室友,你们是我心中的一股清流。最后我要特别感谢我的同事,感谢楚巍、不老、吉哲、云郎、贾总、品道等人以及 UED 小团队,感谢你们对我工作上的支持和帮助。在阿里云大家庭中,我工作得很快乐,个人成长也非常迅速。同时,我也非常感谢出版社的编辑胡俊英在本书写作期间为我提供建议和帮助。
最后对自己这段时间的写作过程做一个总结,最大的感触是,在这样快速紧张的生活和工作节奏下,连续8个月坚持做一件事情是非常需要毅力的。每天下班之后坚持学习和写作2小时,常常熬到凌晨才关灯睡觉,但是这份坚持换来了将近500小时的时间用来“充电”。在这段时间中,写作已经成为我的一种生活方式,在飞机上、在高铁上、在出租车上、在厕所中……很多地方都留下了思考和回忆。无论最终能做到什么程度,都希望自己可以继续把这样的激情保持下去。最后感谢所有在工作和学习中给过我帮助的人,也感谢所有拒绝我、批评过我的人,因为有你们才有了这本书。
人工智能是近年来非常火的话题,人们似乎看到了在某些领域内机器智能取代人力的可能性。之所以人们可以得到这样的判断,主要是基于以下几方面原因:随着互联网的发展,人类社会积累了大量的数据可供分析;机器学习的算法不断迭代,特别是近年来随着深度学习的发展,人们从理论层面取得了实质性突破;随着分布式计算的成熟,云计算让计算资源不再成为瓶颈。我们可以把人工智能看作一个数据挖掘体系,在这个体系当中,机器学习的作用主要是学习历史数据中的经验,把这些经验构建成数学模型。人类利用机器学习算法生成的模型,就可以解决日常的一些问题,如商品推荐和对股票涨跌的预测等。
以上谈到了机器学习的主要作用,我们再来了解机器学习在业务中的应用,其实机器学习算法正在逐步向“平民化”演变。早些时候,只有一些规模比较大的公司会投入资源在智能算法的研究上,因为这些算法需要大量的数据积累以及计算资源,而且整个业务框架跟算法的结合也需要耗费很大人力,所以只有少数数据业务量达到一定规模的公司会在这方面投入。但是随着各种开源算法框架的发展以及计算资源的价格走低,机器学习不再是“奢侈品”,很多规模不大的公司也开始尝试用机器学习算法生成的模型来指导自身业务,用数据来解决业务问题是代价最小的方式,而且效果会随着数据量的积累变得越来越明显。机器学习算法正在帮助越来越多的企业实现转型,从传统的商业智能(Business Intelligence,BI)驱动到人工智能(Artificial Intelligence,AI)驱动。通过平日里与客户打交道,我们可以了解到,现在不只是互联网公司,更多传统行业,如教育、地产和医疗等,也在尝试把自己的业务数据上传到云,通过机器学习算法来提升自己的业务竞争力。
综上所述,业务与机器学习算法的结合很有可能是下一阶段行业变革的驱动力,如果固守原来的传统技术,不尝试提升业务的数据驱动力,企业很有可能在这一波新的浪潮中被淘汰。本书尝试将算法与实际的业务实战相结合,将对机器学习的全链路逐一进行介绍。在描述算法理论的时候,本书尽可能用更直白易懂的语句和图示来替代公式。另外,为了帮助读者更有成效地理解机器学习算法的使用逻辑,书中不单介绍了算法,还对整个数据挖掘的全流程,包括数据预处理、特征工程、训练以及预测、评估进行了介绍。而且本书还通过真实案例的数据,在各种不同业务场景下对整个数据挖掘流程进行了详细介绍。此外,书中还简单地介绍了深度学习和知识图谱这两个未来可能被更多关注的领域。总之,本书不是一本理论教程,而是一本推动算法与业务实践相结合的指南。
我从研究生阶段开始接触机器学习算法,在硕士研究生期间主要从事算法的理论研究和代码实现,当时参与了一些开源算法库的开发和算法大赛,那时对机器学习的理解更多的是停留在数学公式推导层面。那时候理解的机器学习就是一门统计科学,需要把公式研究透彻。直到入职阿里云,从事了机器学习平台相关的工作,我对机器学习的看法发生了很大改变。根据平日里与客户的沟通,我认识到,对绝大部分中小企业用户而言,机器学习算法只是帮助大家提升业务成效的工具,很多用户对机器学习的理解还处于比较初级的阶段,与这种现状相矛盾的是目前市面上部分机器学习相关的图书都更偏向于理论研究,而比较缺乏实际应用的场景。
写这本书的目的就是希望可以提供这样一本素材,能够让渴望了解机器学习的人快速了解整个数据挖掘体系的轮廓,可以用最小的成本帮助用户把算法迁移到机器学习云服务上去。至于算法的精密度和深度的探索,那是数学家需要考虑的事情,对绝大部分的机器学习算法用户而言,这样一本能帮助大家快速理解算法并能够将其在业务上实践的教程可能会更加有效。
对我而言,本书也是我对自己学习成果的总结。从 2013年起,我陆陆续续在 CSDN、GitHub 和云栖社区上分享过一些自己在 IT 领域的学习笔记和代码,收到了很多朋友的反馈,也有一些出版社的朋友找到我希望可以把这些内容整理成书,但是一直没有特别笃定的想法——什么样的书是有价值的。通过近一年来的机器学习平台产品建设以及与客户的不断接触,我心中的想法逐渐清晰,很多机器学习爱好者最关心的是如何使用算法而不是这些算法背后的推理,于是本书就应运而生了。虽然我才疏学浅,书中内容未免有描述不足之处,但是我真心希望这本书可以在读者探索机器学习的道路上为其提供助力。
本书的读者对象如下:
本书的结构是按照读者对机器学习的认知过程和数据挖掘的算法流程来组织的,一共分为5个部分,共9章内容。
第1部分是机器学习的背景知识介绍,包括第1章。这一部分主要介绍机器学习的发展历史以及现状,另外,也介绍了机器学习的一些基本概念,为接下来的内容做准备。
第2部分介绍机器学习的算法流程,包括第2~6章,分别介绍了场景解析、数据预处理、特征工程、机器学习常规算法和深度学习算法。在第5章的算法部分,对常见的分类算法、聚类算法、回归算法、文本分析算法、推荐算法和关系图算法都进行了介绍,从这一章可以了解到不同业务场景下不同算法的区别和用法。第6章对深度学习相关内容进行了讲解,包括常用的3种模型 DNN、CNN 和 RNN 的介绍。
第3部分介绍机器学习的相关工具,包括第7章的内容。这里的工具是一个广泛的概念,包括了 SPSS 和 R 语言这样的单机统计分析环境,也包括了分布式的算法框架Spark MLib和TensorFlow,还有企业级的云算法服务 AWS ML 和阿里云 PAI。通过阅读这一章,读者可以根据自身的业务特点,选择适合自己的算法工具。
第4部分介绍机器学习算法的实践案例,包括第8章,帮助读者理解整个数据挖掘流程。这一章针对不同行业和不同场景搭建了实验,分别介绍了如何通过机器学习算法应对心脏病预测、商品推荐、金融风控、新闻分类、贷款预测、雾霾天气预报和图片识别等业务场景,因此也是本书的核心章节。
第5部分主要针对知识图谱这个热点话题进行介绍,包括第9章,知识图谱的介绍主要是从图谱的概念以及实现的角度来说明。
尽管读者可以根据自己的侧重点来选择阅读顺序,但我强烈建议读者按照顺序来阅读,这样对理解书中的概念并能够循序渐进地掌握相关知识更有帮助。
虽然花了很多时间去反复检查和核实书中的文字、图片和代码,但是因为认知能力有限,书中难免会有一些纰漏,如果大家发现书中的不足之处,恳请反馈给我,我一定会努力修正问题,我的个人邮箱是 [email protected]。如果大家在阅读本书的时候遇到什么问题,也欢迎通过各种方式与我取得联系。
个人网站
博客地址
读者也可以到异步社区的页面内提交勘误。因为工作繁忙,可能来不及一一回复,但是我会尽力与读者保持沟通,谢谢大家的支持。
正如爱因斯坦所说:“从希腊哲学到现代物理学的整个科学史中,不断有人试图把表面上极为复杂的自然现象归结为几个简单的基本概念和关系,这就是整个自然哲学的基本原理。”人类进化的发展史,从某种意义上来讲就是不断归纳经验进而演绎的过程。从刀耕火种的新石器时代到近代的工业革命以及现代科技的发展,人类已经积累了大量的经验。这些经验既是“种瓜得瓜,种豆得豆”这样的常识,也是例如相对论这样的定理公式。人类文明正沿着时间这条坐标轴不断前进,如何利用过往的经验来推动人类社会的再一次飞跃,人工智能或许是我们需要的答案。
人工智能的起源应该可以追溯到17世纪甚至更早,当时人们对于人工智能的定义是基于推理的。人们畅想着如果两个哲学家或者历史学家的观点出现矛盾,两个人不必再进行无休止的争吵,世界上的所有理论会抽象成类似于数学符号的语言,人们只需要拿出笔来计算就可以解决矛盾。这种抽象逻辑给了后人引导,如今,机器学习在行业上的应用也是将业务逻辑抽象成数字来进行计算,从而解决业务问题。但是在远古时代,这些逻辑还只是科学家脑中的想法。实际上,直到有机器的出现,人工智能才真正作为一门学科而受到广泛关注。
谈到近代人工智能的起源就不得不提到一个名字——图灵(见图1-1)。
图1-1 阿兰 · 图灵
随着第二次世界大战的爆发,越来越多的机械开始替代手工,人们开始幻想什么时候机器能代替人类来进行思考。在20世纪40年代,关于人工智能的讨论开始兴起。但是,机器做到什么程度才算人工智能,这需要一个标准来判定。图灵用了最直白的话语描述了人工智能,这就是图灵测试(见图1-2)。
图1-2 图灵测试
1950年,计算机科学和密码学的先驱阿兰 · 麦席森 · 图灵发表了一篇名为《计算机器与智能》的论文,文中定义了人工智能测试的方法,让被测试人和一个声称自己有人类智力的机器在一起做一个实验。测试时,测试人与被测试人是分开的,测试人只有通过一些装置(如键盘)向被测试人问一些问题,随便是什么问题都可以。问过一些问题后,如果测试人能够正确地分出谁是人、谁是机器,那机器就没有通过图灵测试,如果测试人没有分出谁是机器、谁是人,那这个机器就是有人类智能的。
人工智能的另一个重要标志是人工智能这一学科的诞生,故事发生在1956年达特茅斯会议。会议上提出了这样的理论:“学习或者智能的任何其他特性都能被精确地描述,使得机器可以对其进行模拟。”这个论调很像机器学习算法在今日的应用,我们需要提取可以表示业务的特征,然后通过算法来训练模型,用这些模型对于未知结果的预测集进行预测。这次会议对于人工智能在更广阔的领域发展起到了推动作用。在之后的20年里,人类在人工智能,特别是相关的一些统计学算法的研究上取得了突破进展,比较有代表性的如神经网络算法,就是在这个时期诞生的。有了这些智能算法作支撑,更多的真实场景才可以在数学层面进行模拟,人类慢慢学会通过数据和算法的结合来进行预测,从而实现某种程度上的智能化应用。
人工智能在发展过程中也遇到过非常多的挑战。20世纪70年代,随着理论算法的逐步成熟,人工智能的发展遇到了计算资源上的瓶颈。随着计算复杂度的指数性增长,20世纪70年代的大型机器无法负担这一切。同时,当时的互联网还处于发展初期,在数据积累方面也才刚刚起步。科学家往往没有足够的数据去训练模型,以图像印刷文字识别(Optical Character Recognition,OCR)为例。如果想针对某一场景训练一套精度较高的 OCR 模型,需要千万级的数据样本,这样的数据无论从数据获取、存储和计算成本来看,在当时都是不可能实现的。所以人工智能在之后很长的一段时间内都受限于计算能力以及数据量的不足。
虽然经历了近20年的消沉时期,但是数据科学家对于人工智能的探索从未停止过。在 21 世纪,随着互联网的井喷式发展,越来越多的图像和文本数据被分享到网页上,停留在互联网巨头的服务器中,随之而来的是用户在网上的浏览记录和购物记录的收集。互联网已经变成了一个大数据仓库,许多网络大咖们纷纷将注意力投向数据挖掘领域,数据库成为了一座座金矿,数据科学家们开始用一行行公式和代码挖掘数据背后的价值,越来越多的公司做起了数据买卖。这些代码和公式就是本书的主角——机器学习算法。马云先生在很多年前的公开演讲上就已经明确表示过“阿里巴巴是一家数据公司”。数据的积累就像是一块块肥沃的土地,需要机器学习算法来在上面耕种,云计算就是挥舞在土地上的“锄头”。PB 级数据的积累使得人们不得不将单机计算迁移到多机,并行计算理论开始得到了广泛的应用,这就催生了云计算的概念。云计算,就是分布式计算,简单来讲就是将一个很复杂的任务进行拆解,由成百上千的机器各自执行任务的一个小模块,然后将结果汇总。
以 Hadoop 为代表的开源分布式计算架构为更多的企业提供了分布式计算的技术支持。随着 Caffe 和 Tensorflow 等高效率的深度学习架构被开源,许多小型企业也具备了自主研发改进算法模型的能力。人工智能的应用开始普及,并且逐渐融入我们的生活当中。人们开始习惯了在 Google 上输入一个词条马上就能返回上千万条信息,通过刷脸或者指纹识别来进行支付,在淘宝购物时获得智能商品推荐。图像识别、文本识别和语音识别的发展给我们的生活带来了颠覆式的影响。2016年,Google关于人工智能的一场秀将人工智能产业带到了一个新高度。机器智能战胜人类围棋选手一直以来被认为是不可能实现的任务,但是 AlphaGo 成功地实现了这一点。AlphaGo 的成功不仅仅验证了深度学习和蒙特卡洛搜索算法的实践性,更加再一次印证了这样的事实,即人类不再是产生智能的唯一载体。任何机器,只要能够进行信息的接收、存储和分析,都是可以产生智能的。而这里面的关键因素是信息的量级以及算法的深度。
人工智能的发展史,就是对于过往经验的收集和分析方法不断演绎的历史。在机器出现之前,人类只能通过别人的分享和自己的实践在很小的信息量级上来对事物进行判断,这种对于外界事物的认知受限于人的脑力和知识量。不同于人类的脑力,抽象意义上的机器可以被当成一个信息黑洞,吸收所有的信息,而且可以不分昼夜地对这些数据进行大维度的分析、归纳以及演绎,如果人类将这些机器学习后得到的认知进行分享,就形成了人工智能。于是,随着人类社会的发展,数据的积累以及算法的迭代将进一步推动整个人工智能的发展。
正如前面所提到的,人工智能的发展体现在机器带动人类进行经验归纳以及思考,那么人工智能背后的引擎就是本书要介绍的重点——机器学习算法。机器学习是一种多学科交织的研究型学科,涉及生物学、统计和计算机等多个学科。机器学习算法发展到目前阶段,做的事情主要是将生活中的场景抽象成为数学公式,并且依靠机器的超强计算能力,通过迭代和演绎生成模型,对于新的社会问题进行预测或者分类操作。人工智能的发展史其实伴随着机器学习算法的进化史,正是随着机器学习算法的不断发展以及计算能力的提升,人工智能产业才得到了发展,进而达到了目前这种火热的局面。下面将对于机器学习算法在目前阶段所取得的一些成就进行一个介绍,方便大家了解机器学习算法的用途。
上一节中回顾了人工智能的发展历程,不考虑计算能力等硬件条件的限制,当今世界的人工智能可以总结为数据和智能算法的结合。通过对过往经验的分析得到实验模型,并且利用这种模型指导实际的业务。把人工智能看作一个人类大脑的话,里面的血液就是数据,而大脑里面的血管承载着数据的流转,可以看作是相关的机器学习算法。所以在介绍机器学习算法之前,大家不得不先了解一下大数据时代的特性,然后再针对当前数据爆炸的这种情况介绍机器学习算法的一些用途。
21世纪注定是属于互联网的,在这个数字时代产生了很多新名词,这里边有云计算、电子商务和有共享经济。大数据也是互联网时代的产物,出现在报纸中、电视上、网页里。“大数据”已经成为信息时代的代名词,乃至于好多人还来不及认识它,就已经开始被它支配。什么是数据?客观世界存在的那一刻开始,数据就已经出现了,从宇宙中天体运动的速度、角度及天体的质量,到人类文明的产生、更迭和演进。数据无处不在,但是数据的价值在于如何采集和利用。
正是受到互联网的驱动,人类开始采集和利用数据。对于大数据时代,我最深切的感触是大数据未来的版图清晰又模糊。清晰的是人们已经开始意识到数据是有价值的,并且已经开始采集数据,看看人们都做了什么?根据存储市场调研的最新报告,目前世界全年的数据保存量约合 50EB,这些数据来源于互联网、医疗健康、通信、公共安全以及军工等行业。接下来,我们来看看这些数据是如何产生的。
以全球最大的 SNS 服务商 Facebook 为例。Facebook 现在的用户数达到9.5亿,这些用户的每一个行为,包括每一次通知、页面访问、查看朋友的页面,都会被Facebook 的服务器追踪,并且产生历史行为数据。而全世界9.5亿用户平均每个月在 Facebook 上花费的时间超过6.5个小时,产生的数据量大小超出人们的想象。Facebook 上每天可以产生 500TB 左右的数据量,我们来看看这些数据具体包括什么。人们每天分享 25 亿个内容条目,包括状态更新、墙上的帖子、图片、视频和评论,每天有 27 亿个“ like”操作,人们每天上传 3 亿张图片。
虽然诸如 Facebook、Google 和 Alibaba 这样的国际互联网巨头已经开始积累数据,并且将数据进行分析来反哺业务。但是截止到今天,全世界每年保存下来的数据只占到数据产生总量的百分之一不到,其中可以被标记并且分析的数据更是连百分之十都不到。这种现状造成了两方面的瓶颈,一方面是数据产生和数据收集的瓶颈,另一方面是采集到的数据和能被分析的数据之间的瓶颈。
针对数据产生和数据采集的瓶颈,其原因一方面是硬件存储成本的限制,但是随着硬盘技术的发展和产能的提升,这方面的缺陷正逐渐弱化。笔者认为,造成目前数据采集与数据生成失衡的主要原因是数据的采集缺乏标准。虽然,互联网公司对数据采集和标准制定方面已经形成了一套成熟的体系,如网站的点击行为、日志的收集等。但是对于更多行业,特别是传统行业来说,数据的采集方式还处于摸索当中,而且从目前来看,这样的摸索还将持续相当长的时间。尽管现在提倡互联网思维以及世界万物联网的思想,但是互联网对于采集数据的经验恐怕很难复制到传统行业。因为互联网行业对于数据采集存在天然的优势,互联网的数据都是托管在数据库里,以二进制的方式记录在硬盘中,只要稍作处理就可以形成一份质量较高的结构化数据。但是在传统行业,以建筑行业为例,数据产生于工地上一砖一瓦的堆砌,产生于工地的施工建设,这样的数据如何转成二进制来存储需要由新的标准来指定,而这种标准更多地受限于技术手段。如果我们的图像识别做得足够智能,拍一张照片就可以将工地的数据量化,这样可能就可以解决这种问题。对于传统行业的数据智能化进程可能还需要耐心的等待。
数据采集方面还需要制定更多的标准以及技术的支持,但是数据的应用方面也存在不小的缺陷。如果目前世界上采集到的数据能被充分利用是足够颠覆生活的,可惜的是目前可以供分析的数据还只占很小的比例。造成这样的困境主要有两方面因素,一个是目前比较主流的机器学习算法都是监督学习算法,监督学习需要的数据源是打标过的数据,打标数据很多时候是依赖于人工标记。比如我们需要一份数据来训练模型进行电影推荐,除了已知的电影的特征数据以外,还需要一份打标的数据来表示电影的好看程度,有点像豆瓣的电影分数,这种数据很难通过计算机的计算直接生成,需要依赖于人工打标。人工打标的影响就是,一方面很难生成大量的标本(上千万样本的数据),设想一下1000万人坐到一个地方一起看一部电影再进行评分是多么浩大的一项工程。另一方面,人工打标的成本太高,目前有很多负责打标的第三方公司,打标服务往往在市场上可以卖到很高的价格。
另一个导致可分析数据比例较低的因素是对于非结构化的数据处理能力较低。非结构化数据指的是文本或者图片、语音、视频这样的数据。这部分数据来自于用户在贴吧的评论、社交软件上的头像、直播平台上的视频展现等。虽然目前的科技水平已经具备了文本和图像方面的分析能力,但是在大批量处理和特征提取方面依然处于相对基础的阶段。以图像识别为例,目前比较成熟的包括人脸识别和指纹识别等,图像识别的特点是每种事物的识别需要训练相对应的模型,而这种模型需要大量的训练样本来提高精确率,一个成熟的模型通常需要千万级别的训练样例。人脸的数据是比较容易获取的,所以相应的模型比较容易训练,但是假如我们需要训练一个模型来识别某一款杯子,针对这一款杯子的训练数据是很难达到理想量级的,这也提高了特定场景下图像识别的门槛。
互联网在不断发展,数据的生成也不会停下脚步。目前被广泛引用的互联网数据中心(International Data Corporation,IDC)和 EMC 联合发布的“2020年的数字宇宙”报告显示,到2020年全球数字宇宙将会膨胀到40000EB,均摊每个人身上是5200GB以上,这个数据量的数据将会如何被有效存储和应用,目前我们还不敢想象。不过可以肯定的是,数据会成为重要的资源,就像是水电煤一样,在大数据时代,特别是未来的数据爆发时代,数据一定会展现出更大的潜能,人类社会也会进入数据处理技术(Data Technology,DT)时代。
之前讲了大数据,这里再讲机器学习就变得容易理解了。传统的机器工作模式是程序员向机器输入一连串的指令,可以理解为是代码,然后机器按照这些指令一步一步执行下去,结果通常是我们可以事先预料的。这种逻辑在机器学习里是走不通的,机器学习是指我们向机器(更准确地说是机器学习算法)中输入数据,然后机器会根据数据返回结果,这些结果是通过数据自我学习得到的,学习的过程通过算法来完成。我们可以这样来定义,机器学习方法是计算机利用已有的数据(经验)得出了某种模型,并利用这些模型预测未来的一种方法。这个过程其实与人的学习过程极为相似,只不过机器是一个可以进行大维度数据分析而且可以不知疲倦地学习的“怪兽”而已(见图1-3)。
图1-3 机器学习与人的不同
机器学习跟模式识别、统计学习、数据挖掘、计算机视觉、语音识别和自然语言处理等领域都有着很深的联系。如今生活在这样的 DT 时代,随时随地都是机器学习的影子,通过机器对大数据进行分析而带来的人工智能应用,正在一点一点地改变人们的生活方式和思维方式。看到这里很多人都会发问:机器学习究竟能做什么?其实机器学习已经服务了我们生活的各个方面,下面以一个简单的购物场景来介绍机器学习是如何应用在我们的日常生活中的。
现在是 2016 年,如果你还没有尝试过网上购物,那真的是落伍了。网上购物目前已经成了人们的生活方式。下面就简单地聊聊机器学习算法在购物行为中的应用。假设我们在餐厅吃饭,看到一个人的短袖体恤很漂亮,我们想买同款,但是又不好意思开口去问。那么我们可以先偷拍一张这个人的T恤的照片,然后拍立淘(见图1-4)就会显示出这件衣服的同款。
图1-4 拍立淘
这里就用到了机器学习中的图像识别技术。但是往往与这件衣服相近的款式又非常的多,因此我们需要把这些款式按照一定的规则进行排序,这就涉及了机器学习算法模型的训练,通过这个模型,我们把所有的类似款式进行一个排名,最后就得出了最终的展示顺序。
当然,更多的时候我们是通过键盘的输入来搜索商品的,但是如果犯懒,还可以选择通过语音的方式输入内容,这就是语音转文本的运用。在我们搜索一款产品之后,网页的边栏上会出现一些推荐列表,而且每个用户的推荐列表都是不同的,这就是所谓的千人千面。这个场景的实现依赖的是推荐系统后台的用户画像,而用户画像就是大数据和机器学习算法的典型应用,通过挖掘用户的特征,如性别、年龄、收入情况和爱好等特征,推荐用户可能购买的商品,做到个性化推荐。
到了这一步,我们终于把商品放到了购物车里,开始下单。下单之前我们发现网银账户中的钱不够用了,想申请一些贷款。这个时候,我们发现有一个贷款额度,这个额度是如何计算的呢?这里面涉及金融风控的问题,而金融风控也是根据机器学习的算法来训练模型并且计算出来的。
下单之后我们的商品就被安排配送了,目前除了少数边远地区,基本上5天之内就可以收到商品。这段时间包含了商品的包装、从库存发货到中转库存、从低级仓库到高级仓库配送、向下分发。这么多工序之所以能够在短时间内完成,是因为仓储在库存方面已经提前做了需求量预测,提前在可能的需求地附近备货,这套预测算法也是建立在机器学习算法基础之上的。
我们的快递员拿到货物,打开地图导航,系统已经为他设计了配送的路径,这个路径避免了拥堵而且尽量把路线设计到最短距离,这也是通过机器学习算法来计算的。快递员走进门,我们拿到货物后,发现衣服的尺码不合适怎么办?打开客服,输入问题,然后我们发现可以瞬间得到回复,因为这名客服人员可能并不是真的“客服人员”,只是一个客服机器人而已。智能客服系统利用文本的语意分析算法,可以精准地确定用户的问题,并且给予相应问题的解答。同时,智能客服还可以对用户问题的语境进行分析,如果问题很严重需要赔偿,如:“你的产品害我坏肚子了”这样的问题会由客服机器人通过情感分析挑出来,交给专人处理。
如上所述,笔者简单列举了机器学习在网上购物中的几大应用,这里面涉及了很多智能算法,包括模型的训练和预测、语义分析、文本情感分析、图像识别技术以及语音识别技术。我们可以看到,在网购这种最常见的场景下,机器学习算法几乎贯穿了全部流程。
当然,我们还可以列举出非常多诸如上述例子,因为场景实在太多了,没有办法全部穷举出来,这里通过场景来切分把机器学习的一些高频场景列举如下。
上面列举的应用只是机器学习算法应用场景中的一小部分,其实随着数据的积累,机器学习算法是可以渗透到各行各业当中,并且在行业中发生巨大的作用。随着数据智能、数据驱动等思想的传播,机器学习算法正在成为一种普世的基础能力向外输出。我们可以预见未来随着算法和计算能力的发展,机器学习应该会在金融、医疗、教育、安全等各个领域有更深层次的应用。笔者特别期待机器学习算法在破解基因密码以及癌症攻破方面可以取得突破,同时无人车、增强现实(Augmented Reality,AR)等新概念、新技术的发展也需要依赖于机器学习算法的发展。相信未来,机器学习算法会真正做到颠覆生活改变人类命运。
在开始机器学习的算法流程介绍之前,因为机器学习是一个多学科交叉的学科,有很多类似于统计学的概念,但是在叫法上与传统的统计学又有一定的区别,我们需要了解一些机器学习相关的基本概念,因为如果不明确这些概念的话,对于一些文献的阅读和理解会构成障碍。下面通过这一节的介绍帮助大家对于基础的机器学习名词和概念进行了解,首先介绍一下机器学习的基本流程,然后针对机器学习涉及的数据、算法和评估这3个方面用到的基础概念进行介绍。
机器学习的过程就是一个数据流转、分析以及得到结果的过程,在使用的过程中很多人花了很多时间在算法的选择或者调优上,但其实机器学习的每一个步骤都是至关重要的,介绍算法的具体实现的资料已经比较丰富了,笔者希望花更多的篇幅来介绍数据的处理和整个机器学习流程的串联。
机器学习的整个流程大致可以分为6个步骤,整个流程按照数据流自上而下的顺序排列,分别是场景解析、数据预处理、特征工程、模型训练、模型评估、离线/在线服务(见图1-5),下面来逐一介绍下这些步骤的基本功能。
图1-5 数据挖掘流程
(1)场景解析。场景解析就是先把整个业务逻辑想清楚,把自己的业务场景进行一个抽象,例如我们做一个广告点击预测,其实是判断一个用户看到广告是点击还是不点击,这就可以抽象成二分类问题。然后我们根据是不是监督学习以及二分类场景,就可以进行算法的选择。总的来说,场景抽象就是把业务逻辑和算法进行匹配。
(2)数据预处理。数据预处理主要进行数据的清洗工作,针对数据矩阵中的空值和乱码进行处理,同时也可以对整体数据进行拆分和采样等操作,也可以对单字段或者多字段进行归一化或者标准化的处理。数据预处理阶段的主要目标就是减少量纲和噪音数据对于训练数据集的影响。
(3)特征工程。特征工程是机器学习中最重要的一个步骤,这句话一点都没有错。特别是目前随着开源算法库的普及以及算法的不断成熟,算法质量并不一定是决定结果的最关键因素,特征工程的效果从某种意义上决定了最终模型的优劣。通过一个例子说明一下特征工程的作用,2014 年某互联网巨头举办了一场大数据竞赛,参赛队伍在 1000 个以上,到最后,这里面几乎所有的参赛队伍都用了相同的一套算法,因为算法的优劣是比较容易评判的,不同算法的特性是不一样的,而且可供选择的算法种类是有限的。但是特征的选取和衍生却有极大的不定性,100 个人眼中可能有 100 种不同的特征,所以这种大赛到了后期,往往大家比拼的就是特征选取的好坏。在算法相对固定的情况下,可以说好特征决定了好结果。
(4)模型训练。如图1-6所示的“逻辑回归二分类”组件表示的是算法训练过程,训练数据经过了数据预处理和特征工程之后进入算法训练模块,并且生成模型。在“预测”组件中,读取模型和预测集数据进行计算,生成预测结果。
图1-6 模型训练
(5)模型评估。机器学习算法的计算结果一般是一个模型,模型的质量直接影响接下来的数据业务。对于模型的成熟度的评估,其实就是对于整套机器学习流程的评估。
(6)离线/在线服务。在实际的业务运用过程中,机器学习通常需要配合调度系统来使用。具体的案例场景如下:每天用户将当日的增量数据流入数据库表里,通过调度系统启动机器学习的离线训练服务,生成最新的离线模型,然后通过在线预测服务(通常通过 Restful API,发送数据到服务器的算法模型进行计算,然后返回结果)进行实时的预测。具体架构如图1-7所示。
图1-7 机器学习服务架构
利用这种架构就实现了离线训练和在线预测的结合,串联了从离线到在线的整个业务逻辑。
前面已经介绍了机器学习的基本流程,下面将针对机器学习的数据结构进行介绍。如果把机器学习算法比作一个数据加工场,那么进入工厂的数据就是被算法用来加工的原材料,机器学习算法需要的数据是什么样结构的呢?如果经常关注大数据相关的文章,基本会听说过“结构化数据”和“非结构化数据”这两个词,当然这里面还能衍生出“半结构化数据”,下面分别介绍一下这几种数据的结构。
(1)结构化数据。结构化数据是指我们在日常数据库处理中经常看到的日志类数据结构,是以矩阵结构存储在数据库中的数据,可以通过二维表结构来显示,如图1-8所示。
图1-8 结构化数据示例
结构化数据主要由两个部分组成,一个部分是每个字段的含义,也就是图1-8中的 age、sex、cp 等字段头,另一个部分是每个字段的具体数值。通常来讲,机器学习算法处理的数据都是结构化的数据,因为机器学习需要把数据带入矩阵去做一些数学运算,结构化数据原生是以矩阵形态存储的,所以机器学习算法通常是只支持结构化数据的。
结构化数据中还有两个非常重要的概念需要介绍一下,即特征(Feature)和目标列(Label)。这是机器学习算法中最常出现的两个名词,其中特征表示的是数据所描述对象的属性,如用一组数据来形容人,那么这个人的身高、体重、性别和年龄都是特征。在结构化数据的数据集中,每一列数据通常就对应一个特征。
目标列表示的是每一份数据的打标结果,因为前面也介绍过,机器学习的原理其实是从历史数据中来学习经验,目标列表示的是这一组数据的结果。例如,我们想通过一份体检数据来预测对象是否有心脏病,需要先通过成千上万份的训练数据来生成模型,这成千上万份的训练数据需要打标,也就是说机器要事先知道什么样体检指标的人患病了,什么样的人没有患病,这样才能学习出预测模型。通过一个例子来说明,如图1-9所示为一份心脏病预测需要的数据结果,其中框起来的字段表示的是对象是否患病,这一列是目标列。其他3个字段 age、sex 和 cp 描述的是对象的特征,是特征列。
(2)半结构化数据。半结构化数据是指按照一定的结构存储,但不是二维的数据库行存储形态的数据。比较典型的半结构化数据就是 XML 扩展名的存储数据,如图1-10所示。
图1-9 目标列说明
图1-10 半结构化数据
另一种半结构化数据就是在数据表中,某些字段是文本型的,某些字段是数值型的。见表1-1。
表1-1 半结构化数据
ID | Occupation | Income |
---|---|---|
小李 | 老师 | 241 |
小王 | 厨师 | 521 |
小刘 | 司机 | 421 |
小方 | 运动员 | 23636 |
半结构化数据常用于一些数据的传递,但是在机器学习算法相关的应用方面还有一定距离,需要做数据转换把半结构化数据转为结构化数据来进行操作。
(3)非结构化数据。非结构化数据的数据挖掘一直以来是机器学习领域的热点话题,特别是随着深度学习的发展,目前对于非结构化数据的处理似乎找到了方向。典型的非结构化数据就是图像、文本或者是语音文件。这些数据不能以矩阵的结构存储,目前的做法也是通过把非结构化数据转为二进制存储格式,然后通过算法来挖掘其中的信息。第6章和第7章将详细介绍如何使用深度学习算法实现非结构化数据的处理。
以上就是对于真实业务场景下需要处理的3类数据结构的介绍。机器学习算法对于结构化数据的支持是比较好的,对于半结构化数据和非结构化数据,在真实的业务场景下,通常是先把这两类数据做转化,然后才通过算法来进行数据挖掘。关于非结构化数据转为结构化数据的方法在第4章也有相关介绍。
上面对于机器学习的流程和数据源结构都进行了介绍,下面对于算法的分类进行一个简单的说明。机器学习算法包含了聚类、回归、分类和文本分析等几十种场景的算法,常用的算法种类为 30 种左右,而且还有很多的变形,我们将机器学习分为 4 种,分别是监督学习、无监督学习、半监督学习和增强学习。
(1)监督学习。监督学习(Supervised Learning),是指每个进入算法的训练数据样本都有对应的期望值也就是目标值,进行机器学习的过程实际上就是特征值和目标队列映射的过程。例如,我们已知一只股票的历史走势以及它的一些公司盈利、公司人数等信息,想要预测这只股票未来的走势。那么在训练算法模型的过程中,就是希望通过计算得到一个公式,可以反映公司盈利、公司人数这些信息对于股票走势的影响。通过过往的一些数据的特征以及最终结果来进行训练的方式就是监督学习法。监督学习算法的训练数据源需要由特征值以及目标队列两部分组成。
如图1-11所示,ifhealth 是目标队列,age、sex 和 cp 为特征队列,这就是一个典型的监督学习的训练数据集。因为监督学习依赖于每个样本的打标,可以得到每个特征序列映射到的确切的目标值是什么,所以常用于回归以及分类场景。常见的监督学习算法见表1-2。
表1-2 监督学习
分类算法 |
K 近邻、朴素贝叶斯、决策树、随机森林、GBDT 和支持向量机等 |
---|---|
回归算法 |
逻辑回归、线性回归等 |
监督学习的一个问题就是获得目标值的成本比较高。例如,我们想预测一个电影的好坏,那么在生成训练集的时候要依赖于对大量电影的人工标注,这样的人力代价使得监督学习在一定程度上是一种成本比较高的学习方法。如何获得大量的标记数据一直是监督学习面临的一道难题。
图1-11 监督学习
(2)无监督学习。无监督学习(Unsupervised Learning),学习上面讲的监督学习的概念之后,其实无监督学习就比较好理解了。无监督学习就是指训练样本不依赖于打标数据的机器学习算法。既然是没有目标队列,也就缺少了特征环境下的最终结果,那么这样的数据可能对一些回归和分类的场景就不适合了。无监督学习主要是用来解决一些聚类场景的问题,因为当我们的训练数据缺失了目标值之后,能做的事情就只剩下比对不同样本间的距离关系。常见的无监督学习算法见表1-3。
表1-3 半监督学习
聚类算法 |
K-Means、DBSCAN 等 |
---|---|
推荐算法 |
协同过滤等 |
相较于监督学习,无监督学习的一大好处就是不依赖于打标数据,在很多特定条件下,特别是打标数据需要依靠大量人工来获得的情况下可以尝试使用无监督学习或者半监督学习来解决问题。
(3)半监督学习。半监督学习(Semi-supervised Learning),是最近几年逐渐开始流行的一种机器学习种类。上文中也提到,在一些场景下获得打标数据是很耗费资源的,但是无监督学习对于解决分类和回归这样场景的问题又有一些难度。所以人们开始尝试通过对样本的部分打标来进行机器学习算法的使用,这种部分打标样本的训练数据的算法应用,就是半监督学习。目前很多半监督学习算法都是监督学习算法的变形,本书将介绍一种半监督学习算法——标签传播算法。其实目前半监督算法已经有很多的应用了,推荐大家去深入了解。
(4)强化学习。强化学习(Reinforcement Learning),是一种比较复杂的机器学习种类,强调的是系统与外界不断地交互,获得外界的反馈,然后决定自身的行为。强化学习目前是人工智能领域的一个热点算法种类,典型的案例包括无人汽车驾驶和阿尔法狗下围棋。本书介绍的分词算法隐马尔科夫就是一种强化学习的思想。
上面就是关于监督学习、无监督学习、半监督学习和强化学习的一些介绍。监督学习主要解决的是分类和回归的场景,无监督学习主要解决聚类场景,半监督学习解决的是一些打标数据比较难获得的分类场景,强化学习主要是针对流程中不断需要推理的场景。本书对于这4类机器学习算法都有介绍,具体的分类见表1-4,方便大家有针对性的学习。
表1-4 算法分类
监督学习 |
逻辑回归、K 近邻、朴素贝叶斯、随机森立、支持向量机 |
---|---|
无监督学习 |
K-means、DBSCAN、协同过滤、LDA |
半监督学习 |
标签传播 |
强化学习 |
隐马尔可夫 |
机器学习模型训练的过程中会遇到非常多的问题,如参数或者梯度的设置不合理、数据的清洗不够彻底,但是如果问一个数据挖掘工程师什么问题是数据挖掘领域中最常见的问题,他的答案八成是“过拟合”,这也是为什么我们要单独拿出一小节来讲一下数据挖掘过程中的过拟合问题。
过拟合(Over-fitting),从字面的意义上理解的话就是过度拟合的意思,常发生在线性分类器或者线性模型的训练和预测当中。过拟合现象是在数据挖掘过程中经常会遇到的问题,如通过训练集训练了一个模型,这个模型对于训练集的预测准确率很高,可以达到95%,但是我们换一份数据集进行预测,发现准确率只有30%,出现这种情况的原因很有可能是训练的过拟合现象。
过拟合的原理就是机器学习算法过度学习了训练集数据,听上去有点难以理解,下面通过一个例子进行解释。假设我们有一组二维数据展示在坐标系当中,我们想对这个二维数据进行一个线性的回归训练。如果拟合出的曲线是如图 1-12 所示的虚线,其实是一种欠拟合(underfitting)的形式,曲线拟合的并不理想,因为并没有通过回归算法很好地拟合出一种符合数据分布的曲线。
图1-12 线性拟合曲线一
我们再来看看图1-13。
图1-13 线性拟合曲线二
如果最终拟合出来的是如图1-13所示情况,就是一种比较理想的状况,我们看到最终的曲线走势已经几乎刻画了数据的分布,这种曲线是比较理想的。那么什么是过拟合呢?我们来看下图1-14。
图1-14 线性拟合曲线三
如图1-14所示这种情况是典型的过拟合,图中的曲线已经跟数据分布完全一致。那么有的人可能会问,做线性回归的目的不就是为了找到最符合数据走向的曲线么,为什么当我们拿到的结果跟数据走向完全匹配的时候反而不好呢?这是因为训练线性回归曲线或者线性分类器的目的是要对于其他数据集进行分类或者预测。如果在针对训练集做曲线拟合的时候做得过于“完美”,那么当我们针对于其他预测集进行预测的时候,这套模型很有可能会失准,因为这套模型在训练的时候过度地接近于训练集的特征,缺乏鲁棒性。所以在机器学习训练过程中,100%的拟合训练集数据并不一定是好的。
通过前面的介绍,我们已经明白了过拟合发生的现象和原理,那么究竟是什么原因导致了过拟合问题的出现呢?原因可以总结为以下几种。
针对过拟合这样的常见性问题,其实已经有了很多预防和解决的办法如下所示。
以上对于过拟合问题进行了基本的描述,而且也介绍了问题发生的原因以及预防的方法。因为过拟合问题是在使用机器学习算法的过程中非常有可能碰到的问题,所以掌握这方面的知识以及应对手段是非常重要的。希望通过本节的学习,大家可以在模型训练当中有意识地避免过拟合问题的发生。
前文介绍了一些机器学习算法在具体数据挖掘过程中可能会遇到的一些概念和名词,我们知道机器学习算法的最终目的是生成模型,模型的好坏需要通过一些指标来评估,现在就来介绍一下在机器学习算法中可能用到的一些关于结果评估的概念。常用到的概念可能包括精确率、召回率、F1 值、ROC 和 AUC 几种,看上去概念有点多,因为每个指标都是从不同维度来对结果进行评估,下面将分别介绍这几个概念的含义。
(1)精确率、召回率、F1 值。因为精确率(Precision)、召回率(Recall)和 F1(F-Measure)值常被放在一起作比较,所以把相关的这3个指标放在一起介绍。计算这3个指标还需要先了解下 TP、TN、FP 和 FN 这4个指标的含义。
上面这4个概念读上去有点难以理解,我们通过一个实际的案例讲解一下。例如有一个预测集,里面有500个女生和100个男生,需要通过机器学习生成模型,尽可能地区分数据集中的女生,所以女生是正样本,假如我们最终的预测结果是70个女生和20个男生。下面计算精确率、召回率以及 F1 值,首先要计算 TP、TN、FP 和 FN 这4个值。在这个案例里面,TP 为本来是女生又被预测为女生的人数,所以 TP 的值为70;FP表示本来是男生被预测为女生的人数,FP 的值为20;FN 表示本来是女生但被预测为男生的人数,FN 的值为500−70=430。
最终精确率、召回率、F1 值的公式如下。
通过上面的公式可以看出,其实精确率的概念通俗来讲就是模型在预测的时候正确的比例。召回率表示的是在预测到的正样例占全部正样例的比例。这可以看到精确率和召回率是对模型的两个维度的评估,前者评估的是准确性,后者评估的是覆盖率。当然在实际的模型评估中,我们希望精确率和召回率都尽可能高,但是实际上这两个指标是相互矛盾的,为了更均衡的评估精确率和召回率,我们创建了 F1 值。F1 值表达的是精确率和召回率的综合评估,现在很多的模型评估都是通过 F1 值来做,就是考虑到了 F1 值可以把这两个指标结合在一起来评估。
(2)ROC 和 AUC。ROC(Receiver Operating Characteristic Curve)曲线是常用的二分类场景的模型评估算法曲线,ROC曲线的样例如图1-15所示。
图1-15 ROC 曲线
图1-15中的齿状弧形曲线就是 ROC 曲线,这个曲线的横轴为上面提到的 FP 值,TP 值是纵轴。如何来评估模型的好坏呢?通过 ROC 曲线可以清晰地展示出来,只要是模型曲线越接近于左上角就说明模型的效果越好。通过 AUC 值来表示 ROC 曲线与横轴围起来的面积(也就是图1-15中有颜色覆盖的部分),这个 AUC 值越大表示模型的效果越好。AUC 的取值是0到1,通常大于0.5,当 AUC 的取值达到0.9以上时,证明这个模型的效果是比较不错的。
上面介绍了 ROC 和 AUC 两个指标的概念,AUC 是通过 ROC 曲线计算出来的面积实现的。AUC 和 F1 值一样,都是通过一个数值来对于最终的结果进行评估的。ROC 的作用更多是通过对于曲线的光滑程度以及曲线的斜率来获取模型内包含的信息。
本章作为全书的开篇章节,通过对于人工智能领域的发展历史引出了本书的主角——机器学习算法,其实机器学习算法已经贯穿了我们的日常生活,正是因为这些智能算法的普及,所以越来越多的人把目光瞄向了这一新生的技术。我们通过举例介绍了机器学习算法的发展现状,帮助读者梳理了这一学科的应用领域,另外通过对于一些基础概念的介绍,帮助初学者对于机器学习入门。有了上述背景,下面就正式开始对整个机器学习全流程的介绍。
阅读全文: http://gitbook.cn/gitchat/geekbook/5a377733d7fd13649973b0dc