机器学习实践应用

978-7-115-46041-7
作者: 李博
译者:
编辑: 胡俊英

图书目录:

详情

本书主要是分享作者多年来的机器学习算法商业化实践经验。分别从机器学习的发展历程、算法理论、平台工具、实际案例几方面来系统化的介绍机器学习算法与实际业务的结合。全书分为20章,4个部分。4个部分包括机器学习概述、机器学习算法流程、机器学习平台介绍、机器学习行业案例。全书的章节按照机器学习的认知、学习到实际应用的流程来写,通过真实的案例配合图片、代码示例来表述。

图书摘要

版权信息

书名:机器学习实践应用

ISBN:978-7-115-46041-7

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

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

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

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

• 著    李 博

  责任编辑 胡俊英

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

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

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

• 读者服务热线:(010)81055410

  反盗版热线:(010)81055315


机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度等多门学科,专门研究计算机怎样模拟或实现人类的学习行为。机器学习是人工智能的核心,是使计算机具有智能的根本途径。

本书通过对机器学习的背景知识、算法流程、相关工具、实践案例以及知识图谱等内容的讲解,全面介绍了机器学习的理论基础和实践应用。书中涉及机器学习领域的多个典型算法,并详细给出了机器学习的算法流程。

本书适合任何有一定数据功底和编程基础的读者阅读。通过阅读本书,读者不仅可以了解机器学习的理论基础,也可以参照一些典型的应用案例拓展自己的专业技能。同时,本书也适合计算机相关专业的学生以及对人工智能和机器学习感兴趣的读者阅读。


近年来,在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章,知识图谱的介绍主要是从图谱的概念以及实现的角度来说明。

尽管读者可以根据自己的侧重点来选择阅读顺序,但我强烈建议读者按照顺序来阅读,这样对理解书中的概念并能够循序渐进地掌握相关知识更有帮助。

虽然花了很多时间去反复检查和核实书中的文字、图片和代码,但是因为认知能力有限,书中难免会有一些纰漏,如果大家发现书中的不足之处,恳请反馈给我,我一定会努力修正问题,我的个人邮箱是 garvin.libo@gmail.com。如果大家在阅读本书的时候遇到什么问题,也欢迎通过各种方式与我取得联系,个人网站为www.garvinli.com,另外本人的博客地址是http://blog.csdn.net/buptgshengod。读者也可以到异步社区的页面内提交勘误,网址详见http://www.epubit.com.cn/book/detail/4757。因为工作繁忙,可能来不及一一回复,但是我会尽力与读者保持沟通,谢谢大家的支持。



在本章中,笔者会以对于人工智能发展历史的回顾作为开篇,进而介绍一些人工智能的发展现状,还会引出对于机器学习的基本概念的一些讲解。这一章作为全书的开篇,希望给各位读者一个宏观的概念——什么是机器学习?它会给我们的生活带来哪些改变?

正如爱因斯坦所说:“从希腊哲学到现代物理学的整个科学史中,不断有人试图把表面上极为复杂的自然现象归结为几个简单的基本概念和关系,这就是整个自然哲学的基本原理。”人类进化的发展史,从某种意义上来讲就是不断归纳经验进而演绎的过程。从刀耕火种的新石器时代到近代的工业革命以及现代科技的发展,人类已经积累了大量的经验。这些经验既是“种瓜得瓜,种豆得豆”这样的常识,也是例如相对论这样的定理公式。人类文明正沿着时间这条坐标轴不断前进,如何利用过往的经验来推动人类社会的再一次飞跃,人工智能或许是我们需要的答案。

人工智能的起源应该可以追溯到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的作用更多是通过对于曲线的光滑程度以及曲线的斜率来获取模型内包含的信息。

本章作为全书的开篇章节,通过对于人工智能领域的发展历史引出了本书的主角——机器学习算法,其实机器学习算法已经贯穿了我们的日常生活,正是因为这些智能算法的普及,所以越来越多的人把目光瞄向了这一新生的技术。我们通过举例介绍了机器学习算法的发展现状,帮助读者梳理了这一学科的应用领域,另外通过对于一些基础概念的介绍,帮助初学者对于机器学习入门。有了上述背景,下面就正式开始对整个机器学习全流程的介绍。



第1章介绍了一些机器学习的背景和基础概念,从这一章开始,我们会按照整个数据挖掘的流程来分模块进行介绍。本章其实是机器学习实验的准备阶段,笔者把这一阶段叫作场景解析阶段。场景解析是机器学习实验中很关键的一个步骤,需要做到对整个业务逻辑的抽象以及后续的算法选择。如果把搭建一套机器学习算法当作一篇话题作文题目的话,那么场景解析阶段就相当于审题阶段,如果考试的时候写作文出现审题错误,可能对接下来的写作会有非常大的影响,这也就是笔者把场景解析这一章单独拿出来介绍的原因。

拿到一份数据,如果想从中分析出一些内容,首先要了解这份数据,也就是这一节中我们要介绍的数据探查。数据探查可以从很多维度来做,我们可以在这一阶段了解数据的类型、大小和分布等属性,为接下来的进一步场景抽象和算法选择做准备。下面从几个维度介绍一下数据探查工作。

(1)数据量的大小。人工智能建立在大数据的基础之上,是否有足够的数据量,对机器学习算法的效果有直接影响。这里的数据量更多的是指数据的条数,而不是数据占用的存储空间大小。因为通常来讲,机器学习算法的数据源都是矩阵形式的,如图 2-1所示,绝大多数情况下数据大小跟条数是成正比的。

图2-1 矩阵式存储数据源

其实很多人都知道,在机器学习中,数据量越大效果越好的道理。但是具体的原因很多人都说不清楚。这里以机器学习的最优化算法之一梯度下降法为例简单地说明一下,梯度下降法通过递归的方式逐渐逼近最小偏差模型来实现模型的最优。梯度下降法(见图2-2)可以看作一个向终点(最优模型)逐渐逼近的过程,而这个逼近的过程就像是爬山,一开始我们在图2-2中的x0 位置,也就是山脚下。每向算法中灌入一部分数据,就向上前进一步,从x0x1再到 x2 ,直至到走到山顶达到最优效果。所以在数据探查阶段,我们要保证数据量可以实现算法收敛或者模型的最优。当然,不同算法需要的数据量也是不同的,这要看具体算法是线性的还是树形结构的。除此之外,这跟矩阵的维度也有很大的关系,维度越多则可能需要的数据量也越大,具体情况要具体分析。总体来看,我们还是希望机器学习的数据可以尽可能的大。

图2-2 梯度下降法

(2)数据缺失或乱码。数据是否有缺失值或者乱码往往是评判数据质量的关键因素。因为机器学习算法在数据的流转过程中要进行数据的乘除或者是矩阵的分解等计算,如果数据的质量不高,里面有许多的缺失值或者乱码出现,我们会说这份数据很“脏”,需要进行很多的ETL操作(描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程),称为“数据清洗”。数据清洗是一项艰巨而复杂的工作,因为目前的互联网数据多数是通过用户的行为日志来采集的,数据在采集过程中或多或少地都会出现乱码或者是缺失值。对乱码和缺失值的数据预处理工作将会提高后期算法运作的效率,减少不必要的问题出现。

(3)字段类型。流入算法的数据通常是存储在数据库中的,数据库的字段分为以下几种类型,有整型(int)、字符型(string)、双精度浮点数(double)和单精度浮点数(float)等,不同算法对字符串类型的支持也是有要求的。例如文本分析,肯定是需要数据源是字符型的,逻辑回归需要数据源是数值型的,而随机森林这种树状结构的算法通常对字符型和数值型全部支持。

(4)是否含有目标队列。做机器学习训练的人,拿到数据之后都会去看一眼数据是否有目标队列,这关系到接下来的算法选择是有监督学习还是无监督学习。如果没有目标队列,需要考虑是否可以通过一些ETL操作来生成,这一环节对于接下来算法选择的意义非常重大。

以上4点是笔者根据工作经验总结出来的数据探查过程中的几点要素。数据探查可以帮助数据挖掘工程师更好地理解数据,提前掌握数据质量,规避风险。当然,数据探查还有很多工作可以做,如了解数据的方差、标准差、最大值、最小值和偏差等,这些指标都对后续的特征工程及算法的调试起指导作用。

平日里接触客户的时候总能听到这样的话:“我知道机器学习很好,能对我的业务带来帮助,我也有数据,你能不能帮我设计下我的场景,告诉我怎么利用大数据。”所以,有了数据之后,不知道能用数据做什么,这是阻碍大多企业,特别是传统行业,向数据驱动转化的拦路虎。

场景抽象就是通过已有的数据,挖掘出可以应用的业务场景。目前来看,机器学习主要用来解决的场景包括二分类、多分类、聚类和回归。机器学习使用者需要具备把自己的业务逻辑抽象成以上几种场景的能力,这里举例说明。

(1)商品推荐。目前仅国内就有上千家电商平台,绝大多数电商平台都自己搭建或者使用第三方的商品推荐(见图2-3)系统来提高自己商品的推荐命中率(命中率是指推荐商品被购买的概率)。其实推荐系统是一个典型的二分类问题。以常见的购买行为数据为例,通常电商网站的用户埋点数据见表2-1。

图2-3 商品推荐

表2-1 用户埋点数据

用户ID

商品ID

时  间

购 物 行 为

是 否 购 买

124124

12412412

1900-10-1

0

1

注:“购物行为”中0表示点击,1表示收藏,2表示购物车;“是否购买”中1表示购买,0表示不购买。

在场景抽象时,对于一个用户A和一个产品B,我们只关心用户A是否会购买产品B,这就把商品购买行为抽象成了“是”或者“否”这样的二分类问题。有了这样的抽象,接下来就可以选择相应的二分类算法,根据算法参数的具体需求可以确定数据ETL处理的流程,这样一来,一整套的机器学习算法构成的推荐引擎就搭建起来了。

(2)疾病预测。随着国内人口的逐步老龄化,健康问题得到了越来越多的关注,人们也在想,大数据是否可以帮助人们进行一些疾病的预防和治疗(见图2-4)。疾病预测就是这样的一个典型案例。以癌症为例,癌症可以简单分为早期、中期和晚期3种发病期,每种发病期都有自己的对应症状,所以只要挖掘每个时期的不同病变特征,就可以实现预测,进而可以把癌症预测抽象成一个多分类的场景。有了这样的场景,就可以指导我们在算法选择方面的工作。

图2-4 疾病预测

(3)人物关系挖掘。关系挖掘也是数据运营中经常会遇到的场景,如用户有一份通话数据,这份通话数据包含了N个用户和他们之间的通话记录数据,见表2-2。

表2-2 通话记录数据

拨号ID

接话ID

时  间

时长(小时)

124124

12412412

2009-10-1

3

关系挖掘是指用户希望通过数据挖掘算法挖掘这些通话关系中人和人的关系。因为在人物通话的关系图谱(见图2-5)中,人和人之间通过通话这样的行为相互连接,连接的紧密程度可以通过通话的次数和时长来表示,这就可以抽象成数学里面的图论内容,图论包含点、边和权重的概念,进而可以选择图算法来分析这样的场景。

另外,如果有一份人群属性数据,需要把人群按照性别划分,这就是一个典型的聚类场景。如果有某股票的历史走向数据,需要预测股票下一阶段每一天的走势数值,这是一个回归问题。总之,场景抽象是数据挖掘的关键一步,只有明确了业务场景和需求,并且将其抽象成算法逻辑,才能正确地搭建整个实验的流程。场景抽象的时候需要具备下面两个能力:一是对于自身的业务有充分的认识;二是对算法逻辑有大概的了解。

图2-5 关系图谱

2.2节中介绍了如何将业务逻辑抽象成算法场景,这需要用户对自身的业务有一定的判断,到底是二分类、多分类还是聚类、回归等。另外,根据第1章的介绍我们也了解到,机器学习算法按照模型的训练方式可以划分为监督学习、半监督学习、无监督学习和强化学习4个种类,下面我们就来看一下如何选择算法来解决相应的业务场景中的问题。关于算法的选择方式,笔者总结了3点原则,分别是确定算法范围、多算法尝试和多视角分析。

(1)确定算法范围。我们先来介绍一下如何明确特定场景下的算法,这里以常规的结构化数据为例来说明。首先通过上文介绍的场景解析的第1步,也就是数据探查可以了解到数据的种类,如果是数值形式的数据会选择常规的基于数值运算的机器学习算法。第2步,判断数据是否存在目标队列,如果数据是有目标值的,那么可以选用监督学习的算法;如果不存在就只能选择无监督学习的算法。第3步,根据实际的业务场景,选择分类、聚类或者回归算法。这时候其实已经把算法的选择约束到一个比较小的范围了。如图2-6所示数据,需求是要做心脏病预测,是一个二分类场景,然后它又包含目标列,是监督学习算法。于是算法选择范围就限定到了逻辑回归、随机森林、朴素贝叶斯、支持向量机和K近邻(只列举了本书介绍的符合标准的算法)。

图2-6 心脏病预测数据

(2)多算法尝试。通过确定算法范围,我们已经明确了选用算法的种类,那么具体要选择哪个算法呢?这里可以根据数据的分布来判断,根据数据是离散的还是线性的分布来选择线性的算法或是其他结构的算法。笔者认为比较好的方式是多尝试几种算法,选择效果比较好的一种应用到实际业务中去。因为不同的数据适用的算法不同,不存在明确的对应关系表明哪些算法对应哪种数据的效果一定是好的,所以在算法的选择上,当明确了范围之后,建议可以尽可能地多尝试不同算法的组合。图2-7所示为通过随机森林和逻辑回归两个算法同时处理一份数据,比较这两个算法最终结果的准确性,选择效果更优的算法部署上线。

图2-7 多算法尝试示例

(3)多视角分析。多视角分析是指当确定了特定业务场景下的算法之后,除了考虑算法的效果以外,还要从其他维度考察算法。例如,关心算法的鲁棒性,鲁棒性意味着即使预测集数据的大小和分布有一些变化,这个算法也要有比较稳定的效果。另外,如果这个算法需要周期性地调度使用,则还需要关心算法的复杂度以及资源消耗量。最后,算法的调参和优化成本也需要考虑进去,如果一个算法需要不断地调整参数才能保持比较好的效果,那么要考虑对算法使用者来讲,这种运维成本是否可以接受。

以上就是笔者总结的在算法选择方面可能用到的几条原则,对于一个业务场景下的算法选择问题,可以通过上文介绍的明确算法范围、多算法尝试及多视角分析3点原则出发,去寻找最适合自身业务的算法。

本章介绍了数据挖掘的第一个阶段,也就是场景解析。其实场景解析就是一个对业务场景反思的过程,通过对业务场景进行抽象,将一些业务中的逻辑抽象成数学公式可以表达的形式,然后再通过这些形式去选择对应的算法。最后在准备阶段,除了确定算法以外,我们还需要对数据的质量进行一个探查,可以为下一步的分析提前暴露一些可能出现的问题。场景解析是数据挖掘的第1步,这一块主要考验的是数据挖掘工程师对业务的理解。


数据预处理是数据挖掘流程的第2步,如果把数据挖掘看成做一道菜的话,数据预处理就是选择和清洗蔬菜的过程,这一步没做好会影响整个菜品的口感。数据预处理的目的就是把整个数据集调整为对于算法干扰最小的结构,以便提高最终算法的训练效果。本章主要讲述采样、去噪、归一化和数据过滤。

采样就是按照某种规则从数据集中挑选样本数据。通常的应用场景是数据样本过大,抽取少部分样本来训练或者验证,这样不仅会节约计算资源,在特定条件下也会提升实验效果。

随机采样(Random Sampling)是所有采样中最常用的一种,也是最容易实现的采样方法。具体的实现形式是从被采样数据集中随机地抽取特定数量的数据,需要指定采样的个数。随机采样分为有放回采样和无放回采样两种。

(1)举例说明。这两种采样方法有什么区别呢?例如,在1个箱子里放了100个球,我们需要从中拿出 10 个,然后就闭着眼睛随便取 1 个出来,取出来之后记录一下取了哪个球,然后把取出来的球放回去,再重新取,如此累计10次,这就是有放回采样。而无放回采样就是直接随机取10个出来,并且不再放回。

(2)示例代码。随机采样的Python2.7示例代码如下,其中:

import random
def RandomSampling(dataMat,number):  
    try:  
         slice = random.sample(dataMat, number)      
         return slice  
    except:  
         print 'sample larger than population'  

def RepetitionRandomSampling(dataMat,number):      
    sample=[]  
    for i in range(number):  
         sample.append(dataMat[random.randint(0,len(dataMat)-1)])  
    return sample

这里的代码只是一个示例,随机行为的实现采用了Python自带的random函数来执行。

(3)效果展示。输入分为两个字段,按照从1~30排列,如图3-1所示。

图3-1 部分输入数据

图3-2 无放回式采样结果

图3-3 有放回式采样结果

因为是有放回的采样,所以可能会出现重复的样本。

系统采样(Systematic Sampling)在一般情况下是无放回式抽样。系统采样又称为等距采样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k号观察单位,依次用相等间距,从每一部分中各抽取一个观察单位来组成样本。系统采样的使用场景主要是针对按照一定关系排列好的数据。

(1)举例说明。例如我们想调查一个年级每个班级学生的精神面貌,但时间有限,只能抽样几名同学来做调查。于是可以选取每个班的进门靠墙位置的第1名同学来做调研,这就是一种系统采样的场景。相比于随机采样法,系统采样法更照顾了数据集的每个小分类中的样本集。

(2)示例代码。系统采样的Python示例代码如下,其中:

import random
def SystematicSampling(dataMat,number):      

       length=len(dataMat)  
       k=length/number  
       sample=[]       
       i=0  
       if k>0 :         
         while len(sample)!=number:  
            sample.append(dataMat[0+i*k])  
            i+=1              
         return sample  
       else :  
         return RandomSampling(dataMat,number)

(3)效果展示。

图3-4 部分输入数据

因为是系统采样,结果按照相同的步长进行数据采样。系统采样在实际的应用中并不普遍,因为系统采样对于样本的限定过大,在实际的应用场景中,针对不同层级的采样需求往往通过分层采样来实现。

图3-5 系统采样结果

分层采样(Stratified Sampling)是先将数据分成若干个类别,再从每一层内随机抽取一定数量的观察样本,然后将这些抽取出来的样本组合起来。分层采样常常被用于在生成训练样本的场景中。因为在监督学习中,通常情况下正负样本的比例是不可控的,当正负样本的比例过大或者过小的时候,对于训练结果都是有影响的,所以往往我们需要用分层采样来控制训练样本的正负样本比例。

(1)举例说明。例如你想比较3家饭店中哪一家的菜品更好吃,可以分别去这3家饭店,然后随机点5道菜来试吃(选几道菜可以自定义),这就是分层采样的思想。如果是系统采样的话,需要有一个约定,如需要去3家饭店都点菜单上的前5道菜品尝。

(2)示例代码。假设我们有3层分类的数据,分别存储在dataMat1、dataMat2和dataMat3这3个数据空间中,我们的分层采样的比例为1∶1∶1,通过对于每一层进行无放回的随机采样,然后合并采样结果就是最终需要的结果集。

分层采样的Python示例代码,其中:

import random
def StratifiedSampling(dataMat1,dataMat2,dataMat3,number):

        length=len(dataMat)
        sample=[]
        num=number/3
        sample.append(RandomSampling(dataMat1,num))
        sample.append(RandomSampling(dataMat2,num))
        sample.append(RandomSampling(dataMat3,num))
return sample

(3)效果展示。

图3-6 部分输入数据

图3-7 分层采样结果

分层采样从每一个层级中随机抽取出特定的数据,每个层级抽取的比例是可以自定义的。

归一化是指一种简化计算的方式,将数据经过处理之后限定到一定的范围之内,一般都会将数据限定在[0,1]。数据归一化可以加快算法的收敛速度,而且在后续的数据处理上也会比较方便。另外,归一化算法是一种去量纲的行为,关于量纲对于计算的影响可以举这样一个例子:假设一组数据有3个字段,都表示3个小时的时间,但是量纲分别是小时、分钟和秒(见表3-1)。

表3-1 3个小时

小  时

分  钟

3

180

10800

当时间增加1个小时之后,见表3-2。

表3-2 增加1个小时

小  时

分  钟

4

240

14400

对比以上两个表可以看出,仅从数字的角度来看,3个字段的数据波动的幅度为秒>分钟>小时,但是从实际意义的角度出发,3个字段在时间维度上的波动是相同的,都是改变了一个小时,但是在数字大小的波动却差别很大。归一化的作用就是去除这样的量纲给计算带来的影响。

归一化的具体计算方法可以用数学公式来表示:y=(x-MinValue)/ (MaxValue- MinValue),这里的MaxValue和MinValue分别是针对矩阵的每一个字段的最大值和最小值,x是字段中的值,y为最终归一化结果。

(1)示例代码。Python示例代码如下,其中:

from __future__ import division  

def width(lst):  
    i=0  
    for j in lst[0]:  
        i=i+1  
    return i  

def AutoNorm(mat):     
    n=len(mat)  
    m= width(mat)       
    MinNum=[9999999999]*m  
    MaxNum = [0]*m      
    for i in mat:  
          for j in range(0,m):  
                if i[j]>MaxNum[j]:  
                       MaxNum[j]=i[j]  

    for p in mat:       
          for q in range(0,m):  
                if p[q]<=MinNum[q]:  
                          MinNum[q]=p[q]    

    section=list(map(lambda x: x[0]-x[1], zip(MaxNum, MinNum)))  
    print section  
    NormMat=[]  

    for k in mat:       

           distance=list(map(lambda x: x[0]-x[1], zip(k, MinNum)))  
           value=list(map(lambda x: x[0]/x[1], zip(distance,section)))  
           NormMat.append(value)             
return NormMat

(2)效果展示。输入数据(见图3-8)是一组量纲各不相同的数据(数据只显示了一部分),如age字段的单位是“岁”,chol字段的单位是“毫升”。通过归一化算法之后的数据呈现如图3-9所示(部分显示)。

图3-8 输入数据

在执行归一化的算法时有一个地方需要注意,因为公式y=(x-MinValue)/(MaxValue- MinValue) 的分母是MaxValue-MinValue,如果某一个字段的最大值和最小值是相同的,会出现分母为零的情况。所以对于字段数据全部相同的情况要加以判断,通常来讲如果当前字段全部相等且为非零数值,就转换为1来处理。如果当前字段全部数值都是0,那就直接保留0。

图3-9 归一化之后的数据

数据挖掘领域有很多专有名词,“去噪”就是其中的一个。去噪在一般情况下是指去除数据集中有干扰的数据(对场景描述不准确的数据)。说到噪声数据,到底它是怎么产生的呢?这里有一个实际例子来说明:我们的手机信号都是来自于基站发射的电磁波,有的地方信号比较强,有的地方就会比较弱。运营商的工程师们会负责统计不同区域的信号强弱来进行网络规划,这些工程师们采集信号的方法就是将一个信号接收终端固定在车上,然后开车绕着基站转,信号终端就会自动采集不同区域的信号强度,生成一份数据。但是如果在车运行的过程中出现急刹车或者其他突发事件,可能就会对信号采集造成一定影响,生成一些噪声数据。当然,产生噪声的原因还有很多,这里只是举了一个简单的例子。

噪声数据究竟对于模型训练有什么影响呢?因为很多算法,特别是线性算法,都是通过迭代来获取最优解的,如果数据集中含有大量的噪声数据,将会大大影响数据的收敛速率,甚至对于训练所生成模型的准确度也会有很大的负面作用。

前面介绍了产生噪声的原因和噪声数据对于机器学习训练的影响,接下来会重点介绍常用的去噪方法。根据不同的业务场景,其实有不同的处理方法,这里介绍一种叫正态分布3原则。正态分布也叫常态分布,是连续随机变量概率分布的一种,自然界、人类社会、心理和教育中大量现象均按正态分布(见图3-10),如能力的高低、学生成绩的好坏等都属于正态分布,我们可以把数据集的质量分布理解成一个正态分布。它会随着随机变量的平均数、标准差的大小与单位不同而有不同的分布形态。正态分布可以表示成一种概率密度函数,正态分布公式如下:

其中,可以表示成数据集的方差,代表数据集的均值,代表数据集的数据。相对于正常数据,噪声数据可以理解为小概率数据。

图3-10 正态分布概率分布

正态分布具备这样的特点:落在(−3+3)以外的概率小于千分之三。根据这种特点,我们可以通过计算数据集的方差,把3倍方差之外的点设想为噪声数据来排除,这是比较常规的去噪手段。

(1)示例代码。去噪的Python示例代码如下,其中:

from __future__ import division  
def GetAverage(mat):  

     n=len(mat)  
     m= width(mat)   
     num = [0]*m  
     for j in range(0,m):   
               for i in mat:  
                   num[j]=num[j]+i[j]             
               num[j]=num[j]/n     
    return num  

def width(lst):  
    i=0  
    for j in lst[0]:  
       i=i+1  
    return i  

def GetVar(average,mat):      
     ListMat=[]  
     for i in mat:      
           ListMat.append(list(map(lambda x: x[0]-x[1], zip(average, i))))  

     n=len(ListMat)  
     m= width(ListMat)   
     num = [0]*m  
     for j in range(0,m):   
           for i in ListMat:  
                         num[j]=num[j]+ (i[j]*i[j])         
        num[j]=num[j]/n     
    return num   

def DenoisMat(mat):  
     average=GetAverage(mat)  
     variance=GetVar(average,mat)  
     section=list(map(lambda x: x[0]+x[1], zip(average, variance)))      

     n=len(mat)  
     m= width(mat)   
     num = [0]*m  
     denoisMat=[]      
     for i in mat:  
           for j in range(0,m):  
                     if i[j]>section[j]:  
                              i[j]=section[j]  
           denoisMat.append(i)    
    return denoisMat

(2)结果如图3-11所示。

图3-11 去噪的结果

通过正态分布去除3倍方差的方法可以去除数据集中的噪声数据,图3-11中的最后这条偏差值较大的数据就会被过滤掉。

数据挖掘用到的数据来源于用户行为日志或是日常记录等,在很多时候不可以把全部数据进行训练。通常对于同一份数据,如果想做不同目的的挖掘,需要做不同方式的处理,数据过滤往往是数据前期处理的重要一环。例如我们有一组数据,里面有一个字段对于结果没有任何的意义(虽然理论上凡是数据就会有意义,但是某些时候可能对于单个字段的量化工作很难实现),见表3-3。

表3-3 用户数据

用 户 昵 称

用户ID

用户购买次数

用 户 性 别

是 否 购 买

星大大

4212

3

1

1

琪琪

2141

2

0

0

对于表3-3中的这一组数据,因为大部分的算法是需要对于数据字段进行求导和转置等数学运算的,于是很多时候需要数据是数值型的。第一个字段“用户昵称”是字符型的,虽然字符型数据经过特征抽象是可以量化的(见第4章),但是对于昵称这一类数据在处理上还是有一定难度,而且对于这个购物场景的影响并不大,所以往往需要过滤掉这样的字段。

“用户ID”这样的字段,虽然已经是数值型的,貌似可以进行算法直接处理,但是这种数据的本质与昵称类似,只表示对于某种名称或者文本的唯一标识,并不具备描述行为特性的含义,所以也是需要过滤掉的。在数据过滤的过程中,除了需要对于某些字段进行去除,很多时候还需要对于一些数值型特征进行过滤,这样的过滤处理往往需要依靠SQL语句来实现,如表3-3中数据,假如只需要选择性别是男性的用户数据带入训练,就可以通过SQL语句的where功能实现。

本章介绍了数据预处理的一些内容,我们这里只是选取了数据预处理中比较常用的几种方法:采样、归一化、去噪和过滤。其实在实际操作中还有许多其他手段,数据预处理作为机器学习整个流程中一道非常重要的工序,往往需要操作者根据自身的场景或者是数据特点做特定的一些处理方式,可能是一些简单的映射或者是非常复杂的SQL规则。在数据预处理阶段其实目的很简单:把数据集尽量优化成对于算法干扰最小的状态,尽可能地排除数据形式对于模型训练的影响。


相关图书

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

相关文章

相关课程