Python迁移学习

978-7-115-54356-1
作者: 迪潘简·撒卡尔(Dipanjan Sarkar)
译者: 张浩然
编辑: 胡俊英

图书目录:

详情

迁移学习是机器学习技术的一种,它可以从一系列机器学习问题的训练中获得知识,并将这些知识用于训练其他相似类型的问题。 本书分为3个部分:第1部分是深度学习基础,介绍了机器学习的基础知识、深度学习的基础知识和深度学习的架构;第2部分是迁移学习精要,介绍了迁移学习的基础知识和迁移学习的威力;第3部分是迁移学习案例研究,介绍了图像识别和分类、文本文档分类、音频事件识别和分类、DeepDream算法、风格迁移、自动图像扫描生成器、图像着色等内容。 本书适合数据科学家、机器学习工程师和数据分析师阅读,也适合对机器学习和迁移学习感兴趣的读者阅读。在阅读本书之前,希望读者对机器学习和Python编程有基本的掌握。

图书摘要

版权信息

书名:Python迁移学习

ISBN:978-7-115-54356-1

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

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

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

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

著    [印]迪潘简·撒卡尔(Dipanjan Sarkar)

     [印]拉格哈夫·巴利(Raghav Bali)

     [印]塔莫格纳·戈什(Tamoghna Ghosh)

译    张浩然

责任编辑 胡俊英

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

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

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

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright ©2018 Packt Publishing. First published in the English language under the title Hands-On Transfer Learning with Python.

All rights reserved.

本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。

版权所有,侵权必究。


迁移学习是机器学习技术的一种,它可以从一系列机器学习问题的训练中获得知识,并将这些知识用于训练其他相似类型的问题。

本书分为3个部分:第1部分是深度学习基础,介绍了机器学习的基础知识、深度学习的基础知识和深度学习的架构;第2部分是迁移学习精要,介绍了迁移学习的基础知识和迁移学习的威力;第3部分是迁移学习案例研究,介绍了图像识别和分类、文本文档分类、音频事件识别和分类、DeepDream算法、风格迁移、自动图像扫描生成器、图像着色等内容。

本书适合数据科学家、机器学习工程师和数据分析师阅读,也适合对机器学习和迁移学习感兴趣的读者阅读。在阅读本书之前,希望读者对机器学习和Python编程有基本的掌握。


你可能对最近出现的似乎无穷无尽的机器学习很熟悉,但你知道如何训练机器学习模型吗?通常来说,一个给定的机器学习模型是在针对特定任务的特定数据上进行训练的。这种训练过程非常耗费资源和时间,而且由于生成的模型是针对特定任务的,因此无法发挥出模型的最大潜力。

性能非常好的神经网络模型往往是研究人员或实践者多次微调的结果。这些训练好的模型是否能用于更广泛的任务分类呢?迁移学习涉及将现有的机器学习模型用于没有训练过的场景中。

就像人类不会抛弃之前已经学到的东西并在每次开始一个新任务时都重新开始一样,迁移学习允许一个机器学习模型将已经获取到的知识用于新任务的训练过程,以此来扩展计算和专业知识相结合的范围,并且将其用作原始模型的燃料。简单来说,迁移学习可以节省训练时间,以及扩展现有机器学习模型的可用性。对于那些需要大量数据(且这些数据暂不可用)从头训练的模型来说,迁移学习是一项宝贵的技术。

熟悉复杂的概念和在实践中运用这些概念是两件非常不同的事情,但这正是本书的亮点所在。本书从对深度学习和迁移学习概念上的深入研究开始,利用来自Python生态系统的现代深度学习工具(如TensorFlow和Keras),通过真实世界的例子和研究问题对这些概念进行实际的运用。3位作者擅长将理论和实践完美地结合起来,这样一本精心制作的出版物对于读者来说是一个很好的选择。

近些年来,迁移学习在很多领域表现出良好的前景,是当代机器学习研究的一个非常活跃的领域。如果你正在寻找一本关于深度学习和迁移学习的完整指南(从零开始学习),那么本书可以作为你的第一站。

——马修·梅奥(Matthew Mayo)

KDnuggets网站编辑


迪潘简·撒卡尔(Dipanjan Sarkar)是英特尔公司的一名数据科学家,他利用数据科学、机器学习和深度学习来构建大规模的智能系统。他拥有数据科学和软件工程专业的硕士学位。

他从事分析工作多年,专攻机器学习、自然语言处理(Natural Language Processing,NLP)、统计方法和深度学习。他对教育充满热情,同时还在Springboard等组织中担任数据科学导师,帮助人们学习数据科学。他还是人工智能和数据科学领域的在线期刊《面向数据科学》的主要编著者和编辑,他还编写了几本关于R、Python、机器学习、NLP和深度学习的书。

拉格哈夫·巴利(Raghav Bali)是美国联合健康集团(Optum)的数据科学家。他的工作涉及研究和开发基于机器学习、深度学习和NLP的企业级解决方案,用于医疗和保险领域的相关用例。之前在英特尔公司的工作中,他参与了数据主动驱动IT的提案。他还曾在企业资源计划(Enterprise Resource Planning,ERP)和金融领域的一些世界领先的组织工作。他已经和一些优秀的出版社合作出版了多本书籍。

拉格哈夫在班加罗尔国际信息技术学院作为优秀毕业生获得了信息技术硕士学位。他热爱阅读,在工作不忙时,他是一个热衷于捕捉生活瞬间的摄影爱好者。

塔莫格纳·戈什(Tamoghna Ghosh)是英特尔公司的机器学习工程师。他共有11年的工作经验,其中包括4年在微软印度研究院的核心研究经验。在微软研究院期间,他曾担任分组密码的密码分析的研究助理。

他的技术专长包括大数据、机器学习、NLP、信息检索、数据可视化和软件开发。他在加尔各答印度统计研究所获得了工学硕士(计算机科学)学位,在加尔各答大学获得了理学硕士(数学)学位。他的专业研究领域为功能性分析、数学建模以及动态系统。他对教学工作充满热情,并为英特尔公司开展了不同级别的数据科学内部培训。


尼汀·潘瓦尔(Nitin Panwar)拥有瓜廖尔印度信息技术研究所的计算机科学硕士学位。他是印度Naukri招聘网站的技术主管(数据科学),主要从事数据科学、机器学习和文本分析相关工作。他还曾在英特尔公司担任数据科学家。他的兴趣包括学习新技术、人工智能驱动的创业公司和数据科学。


如果没有以下这些人将一个纯粹的概念变成现实,这本书不可能问世。我要感谢我的父母Digbijoy和Sampa、我的伴侣Durba、我的宠物和我的朋友,感谢他们一直以来对我的支持。非常感谢Packt出版社的整个团队,特别是Tushar、Sayli和Unnati,感谢他们不知疲倦地工作,支持我走完这段路程。还要感谢Matthew Mayo为本书写序以及他为KDnuggets网站做的伟大的事。

感谢Adrian Rosebrock和PyImageSearch为计算机视觉的预训练模型提供了出色的视觉效果和内容;感谢Federico Baldassarre、Diego Gonzalez-Morin、Lucas Rodes Guirao和Emil Wallner提供图像着色相关的优秀策略和实现;感谢Anurag Mishra 为建立有效的图像字幕模型给出了提示;感谢François Chollet开发了Keras,并在迁移学习和整个Python AI生态系统中编写了一些非常有用且引人入胜的内容,以帮助人们更好地运用深度学习和人工智能。

我要感谢我的经理和导师Gopalan、Sanjeev和Nagendra,以及我在英特尔公司的所有朋友和同事,感谢他们鼓励我,给了我探索人工智能世界新领域的机会。感谢Springboard网站的朋友们,尤其感谢Srdjan Santic给了我一个学习和与一些了不起的人交流的机会,也感谢他对帮助更多的人学习数据科学和人工智能的激情、热情和远见。感谢 Towards Data Science网站和Ludovic Benistant帮助我学习和向其他人分享更多关于人工智能的知识,并帮助我探索这些领域的前沿研究和工作。最后,我非常感谢我的合著者Raghav和Tamoghna,以及审稿人Nitin Panwar,感谢他们和我一起踏上这段“旅程”,如果没有他们,这本书就不可能出版。

—— 迪潘简·撒卡尔(Dipanjan Sarkar)

借此机会,我要感谢我的父母Sunil和Neeru、我的妻子 Swati、我的兄弟Rajan以及我的朋友、同事和导师,感谢他们多年来一直鼓励、支持和教导我。我还要感谢我的合著者和好朋友Dipanjan Sarkar和Tamoghna Ghosh,感谢他们带我踏上这段奇妙的“旅程”。非常感谢我的经理和导师Vineet、Ravi和Vamsi,以及美国联合健康集团(Optum)的所有同事,感谢他们支持和鼓励我探索数据科学的新领域。

我要感谢Tushar Gupta、Aaryaman Singh、Sayli Nikalje、Unnati Guha和Packt出版社,感谢他们给予我的机会,以及在整个“旅程”中给予我的支持。如果没有Nitin Panwar富有卓见的反馈和建议,这本书是不完整的。最后,特别感谢François Chollet开发了Keras,感谢Python生态系统和社区,感谢其他作者和研究人员每天都努力给我们带来这些神奇的技术和工具。

—— 拉格哈夫·巴利(Raghav Bali)

我要感谢Packt出版团队给了我这个特别的机会,感谢他们在整个“旅程”中给予我的指导。这本书的合著者也是我的导师,感谢他们给我非常有用的建议和指导。感谢Nitin耐心地审阅这本书并提供优秀的反馈。我要感谢我的妻子Doyel、我的儿子Anurag,还有我的父母,他们一直都是我的灵感来源,并且容忍我加班。同时,我非常感谢我公司的经理们的鼓励和支持。

—— 塔莫格纳·戈什(Tamoghna Ghosh)


随着世界朝着数字化和自动化发展,作为一名技术人员(如程序员),保持知识更新并学习如何使用相关工具和技术是很重要的。本书旨在帮助Python从业人员在他们各自的领域中熟悉和使用书中的技术。本书的结构大致分为以下3个部分:

迁移学习是一项机器学习(Machine Learning,ML)技术,是指从一系列机器学习问题的训练中获得知识,并将该知识用于训练其他相似类型的问题。

本书有两个主要目的:第一个是我们会将重点集中在详细介绍深度学习和迁移学习,用易于理解的概念和例子将两者进行对比;第二个是利用TensorFlow、Keras和Python生态系统的真实世界案例和问题进行研究,并提供实际的示例[1]

本书首先介绍机器学习和深度学习的核心概念;接着介绍一些重要的深度学习架构,例如深度神经网络(Deep Neural Network,DNN)、卷积神经网络(Convolutional Neural Network,CNN)、递归神经网络(Recurrent Neural Network,RNN)、长短时记忆(Long Short Term Memory,LSTM)和胶囊网络;然后介绍迁移学习的概念和当前最新的预训练网络,如VGG、Inception和ResNet,我们还将学习如何利用这些系统来提升深度学习模型的性能;最后介绍不同领域(如计算机视觉音频分析以及自然语言处理)的多个真实世界的案例研究和问题。

读完本书,读者将可以在自己的系统中实现深度学习和迁移学习。

本书的目标读者是数据科学家、机器学习工程师、分析人员,以及对数据和运用当前最新的迁移学习技术解决困难的现实世界问题感兴趣的开发者。

阅读本书需要读者对机器学习和Python语言有基本的掌握。

第1章,机器学习基础。本章介绍CRISP-DM模型,该模型为数据科学、机器学习或深度学习项目提供了行业标准框架或工作流。还介绍涉及机器学习领域的各种重要概念,例如探索性数据分析、特征提取和特征工程、特征选择等。

第2章,深度学习精要。本章提供深度学习精要的旋风之旅、神经网络基本构件的概述,以及深度神经网络的训练方式。从单个神经单元如何运行这一基本内容开始,本章内容还涵盖激活函数、损失函数、优化器和神经网络超参数等重要概念。此外还特别强调配置预置的和基于云端的深度学习环境。

第3章,理解深度学习架构。本章的重点在于理解目前在深度学习中出现的各种标准模型架构。和20世纪60年代的传统ANN模型相比,现在的模型架构已经取得了明显的进步。本章还将介绍一些基本的模型架构,例如全连接深度神经网络(DNN)卷积神经网络(CNN)递归神经网络(RNN)长短时记忆(LSTM)网络以及最新的胶囊网络等。

第4章,迁移学习基础。本章介绍与迁移学习相关的核心概念、术语和模型架构,详细地讨论与预训练的模型相关的概念和架构。此外还将对比迁移学习和深度学习,并讨论迁移学习的类型和策略。

第5章,释放迁移学习的威力。本章将利用深度学习模型解决一个实际问题(数据集来自Kaggle网站),同时使读者理解只有少量数据点时所面临的挑战,以及迁移学习在这些场景中如何释放它真正的力量和潜能为我们提供更优秀的模型。本章将在可用数据很少的约束条件下处理非常流行的猫狗分类任务。

第6章,图像识别和分类。本章内容是涉及本书前两部分中详细讨论的概念的现实世界的案例研究系列中的第一个。首先介绍图像分类任务,接着讨论和实现一些流行的、先进的针对不同图像分类问题的深度学习模型。

第7章,文本文档分类。本章讨论迁移学习在一个非常流行的自然语言处理问题(文本文档分类)中的应用。首先对多类文本分类问题、传统模型、基准文本分类数据集(例如20新闻集团)以及性能进行高层次的介绍;接着介绍用于文本分类的深度学习文档模型,以及它们相较于传统模型的优势;最后介绍使用密集向量表示单词特征,以及如何利用相同的特征在文本分类问题中应用迁移学习,在我们的问题中源领域和目标领域可能不同。本章还将介绍其他无监督任务,如文档摘要。

第8章,音频事件识别和分类。本章解决对非常短的音频片段识别和分类的难题。在本章中,我们创新地利用迁移学习将来自计算机视觉领域的预训练深度学习模型运用于一个完全不同的音频分类领域。

第9章,DeepDream。本章重点介绍生成深度学习领域,这是人工智能前沿的核心思想之一。我们将重点关注卷积神经网络如何思考或做梦,以及如何利用迁移学习将图像模式可视化。DeepDream于2015年由谷歌公司首次发布,由于深度网络能够从图像中生成有趣的模式(就好像在自己思考和做梦一样),因此在网络上引发了轰动。

第10章,风格迁移。本章利用来自深度学习、迁移学习和生成学习的概念,通过不同内容、图像和样式的实际例子来展示艺术图像的神经风格迁移。

第11章,自动图像描述生成器。本章内容涵盖计算机视觉以及自然语言生成中最复杂的问题之一——图像描述。虽然将图像分类为固定类别很有挑战性,但这并不是不可能完成的任务。图像描述是一个很复杂的任务,它涉及为任何照片或场景生成类似人类的自然语言的文字描述。本章利用迁移学习、自然语言处理和生成模型的威力,介绍如何从零开始构建自己的自动图像描述系统。

第12章,图像着色。本章提供一个独特的案例研究,其中的任务是对黑白或者灰度图像进行着色。本章向读者介绍多种色彩比例的基础知识,以及为什么图像着色是一项如此困难的任务。

1.如果读者对机器学习和Python语言有基本的掌握,阅读效果会更好。

2.对数据分析、机器学习和深度学习有强烈兴趣将有利于本书的阅读。

[1] 为了叙述的方便,许多案例(示例)中的量的单位省略不写。


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

本书提供配套资源,要获得该配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

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

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

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

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

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

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

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

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

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

异步社区

微信服务号



“终有一天,人工智能会像我们看待非洲平原上低级生物的化石一样看待我们。在人工智能眼中,人类只是直立行走的猿猴,用着粗糙的语言和简陋的工具,从诞生起就注定会灭绝。”

——电影《机械姬》

这句引用台词似乎过于夸张且难以理解。但是随着科技的进步,谁又能肯定地说这不可能发生呢?人类一直梦想着创造出智能的、有自我意识的机器。随着科技研究的不断发展和计算能力的普及,人工智能(Artificial Intelligence,AI)机器学习,以及深度学习在技术专家和普通大众中都获得了极高的关注度。尽管好莱坞描述的未来世界仍有争议,但是我们已经能够在日常生活中看到和使用智能系统。从智能对话引擎,如Google Now、Siri、Alexa和Cortana,到自动驾驶汽车,我们正逐渐地在日常生活中接受这些智能科技。

当我们跨入学习机器的新时代时,重要的是理解这些已经存在多时并不断被改进的基础思想和概念。众所周知,世界上90%的数据仅仅是在过去的几年中被创造出来的,同时我们还在以不断增长的速度创造更多的数据。机器学习、深度学习和人工智能领域能够帮助我们使用这些海量数据来解决现实世界中各种各样的问题。

本书分为3个部分。在第1部分中,我们将从与人工智能、机器学习和深度学习相关的基本概念和术语开始介绍,然后深入讲解深度学习体系结构。

本章将为读者介绍机器学习的基本概念,后续的章节将介绍深度学习。本章内容涵盖了以下几个方面:

本书的每一章内容都会以前几章的概念和技术为基础。熟悉机器学习和深度学习基础的读者可以自行挑选自己认为有必要的主题进行阅读,但是我们建议按顺序阅读各个章节。

我们生活在一个日常生活总是会与数字世界有连接的世界中,我们可以使用计算机来协助我们进行通信、旅行、娱乐等。我们全天候使用的数字在线产品(如手机应用、网站、软件等)可以帮助我们避免重复单调的任务。这些软件由程序员使用计算机编程语言(如C、C++、Python、Java等)开发出来,他们明确地编写了每条指令,让这些软件能够执行定义好的任务。图1.1所示为一种计算设备(计算机)和具有输入和定义输出的显式编程程序或软件之间的典型交互。

图1.1

虽然目前的范式已经能够帮助我们以一种非常有效的方式开发出令人惊讶的复杂软件或系统,来处理不同领域的任务,但是仍然需要由人来定义和编码能让程序运行的显式规则。有一些任务对计算机来说很容易解决,但对人类来说却很困难或耗时。例如执行复杂的计算、存储大量的数据、搜索大型数据库等任务,一旦定义了规则,计算机就可以高效地执行这些任务。

然而,还有另一类问题可以由人类直接解决,但却难以编程。例如对象识别、玩游戏等问题对我们来说是很简单的,但却很难用一套规则来定义。阿兰·图灵(Alan Turing)在其里程碑式的论文Computing Machinery and Intelligence中介绍了图灵测试,并讨论了通用计算机,以及它们是否能够完成这类任务。

这体现了通用计算思想的新范式,在更宽泛的意义上催生了人工智能。这种新范式(或称机器学习范式)是指计算机或机器通过从经验中学习(类似于人类的学习)来完成任务,而无须通过显式的编程来完成任务。

因此人工智能是一个包罗万象的研究领域,机器学习和深度学习是其中具体的研究子领域。人工智能是一个包含其他子领域的通用领域,其中可能涉及也可能不涉及学习(如符号型人工智能)。在本书中,我们将只关注机器学习和深度学习。人工智能、机器学习和深度学习的关系如图1.2所示。

图1.2

机器学习之父Tom Mtichell赋予了机器学习正式的定义:如果一个计算机程序能使用性能衡量方式P在任务T上衡量其性能,并通过经验E改善性能,则可以被称为会学习的程序。

该定义以一种简洁的方式完美地阐释了机器学习的本质。让我们用一个现实世界的例子来更好地理解该定义。考虑一个识别垃圾邮件的任务T,我们可以给一个识别垃圾邮件和非垃圾邮件的程序或系统提供一些实例(或者经验E),它可以从中学习而不是显式地编程,然后可以衡量该程序或系统在识别垃圾邮件的学习任务上的性能P。这很有趣,不是吗?

机器学习是这样一种任务,它从训练实例中识别模式,并将学习到的模式(或者表示)运用于从未见过的新数据。由于其(在大多数例子中)使用单层表示的性质,机器学习有时也被称为浅层学习。在这里引入了两个问题:何为层表示?何为深度学习?我们将在后续的章节中回答这些问题。现在先让我们对深度学习进行快速浏览。

深度学习是机器学习的一个子领域,它涉及从训练实例中学习连续的、有意义的表示来解决给定的任务。深度学习与人工神经网络紧密相关,人工神经网络由能捕捉到连续表示的多层堆叠而成。

基于我们以更快的计算速度生成和收集到的数据量,机器学习已经成为一个流行词。接下来让我们更深入地研究机器学习。

机器学习是人工智能中一个流行的子领域,其涉及的领域非常广泛。流行的原因之一是在其策略下有一个由复杂的算法、技术和方法论组成的综合工具箱。该工具箱已经经过了多年的开发和改进,同时新的工具箱也在持续不断地被研究出来。为了更好地使用机器学习工具箱,我们需要先了解以下几种机器学习的分类方式。

基于是否有人工进行监督的分类如下。

基于数据可用性的分类如下。

前面讨论的分类方法让我们对关于如何组织、理解和利用机器学习算法有了一个抽象的理解。机器学习算法最常见的分类方法为监督学习算法和无监督学习算法。下面让我们更详细地讨论这两个类别,因为这将有助于我们开启后面将要介绍的更高级的主题。

监督学习算法是一类使用数据样本(也称为训练样本)和对应输出(或标签)来推断两者之间映射函数的算法。推断映射函数或学习函数是这个训练过程的输出。学习函数能正确地映射新的和从未见过的数据点(即输入元素),以测试自身的性能。

监督学习算法中的几个关键概念的介绍如下。

可用的监督学习算法有很多。根据使用需求,它们主要被划分为分类模型和回归模型。

1.分类模型

用最简单的话来说,分类算法能帮助我们回答客观问题或是非预测。例如这些算法在一些场景中很有用,如“今天会下雨吗?”或者“这个肿瘤可能癌变吗?”等。

从形式上来说,分类算法的关键目标是基于输入数据点预测本质分类的输出标签。输出标签在本质上都是类别,也就是说,它们都属于一个离散类或类别范畴。

逻辑回归、支持向量机(Support Vector Machine,SVM)、神经网络、随机森林、K-近邻算法(K-Nearest Neighbour,KNN)、决策树等算法都是流行的分类算法。

假设我们有一个真实世界的用例来评估不同的汽车模型。为了简单起见,我们假设模型被期望基于多个输入训练样本预测每个汽车模型的输出是可接受的还是不可接受的。输入训练样本的属性包括购买价格、门数、容量(以人数为单位)和安全级别。

除了类标签以外,每一层的其他属性都会用于表示每个数据点是否可接受。图1.3所示描述了目前的二元分类问题。分类算法以训练样本为输入来生成一个监督模型,然后利用该模型为一个新的数据点预测评估标签。

图1.3

在分类问题中,由于输出标签是离散类,因此如果只有两个可能的输出类,任务则被称为二元分类问题,否则被称为多类分类问题。例如预测明天是否下雨是一个二元分类问题(其输出为是或否);从扫描的手写图像中预测一个数字则是一个包含10个标签(可能的输出标签为0~9)的多类分类问题。

2.回归模型

这类监督学习算法能帮助我们回答“数量是多少”这样的量化问题。从形式上来说,回归模型的关键目标是估值。在这类问题中,输出标签本质上是连续值(而不是分类问题中的离散输出)。

在回归问题中,输入数据点被称为自变量或解释变量,而输出被称为因变量。回归模型还会使用由输入(或自变量)数据点和输出(或因变量)信号组成的训练数据样本进行训练。线性回归、多元回归、回归树等算法都是监督回归算法。

 

 

回归模型可以基于其对因变量和自变量之间关系的模型进一步分类。

 

简单线性回归模型适用于包含单个自变量和单个因变量的问题。普通最小二乘(Ordinary Least Square,OLS)回归是一种流行的线性回归模型。多元回归或多变量回归是指只有一个因变量,而每个观测值是由多个解释变量组成的向量的问题。

多项式回归模型是多元回归的一种特殊形式。该模型使用自变量的n次方对因变量进行建模。由于多项式回归模型能拟合或映射因变量和自变量之间的非线性关系,因此这类模型也被称为非线性回归模型。

图1.4所示是一个线性回归的例子。

图1.4

为了理解不同的回归类型,我们可以考虑一个现实世界中根据车速估计汽车的行车距离(单位省略)的用例。在这个问题中,基于已有的训练数据,我们可以将距离建模为汽车速度(单位省略)的线性函数,或汽车速度的多项式函数。记住,主要目标是在不过拟合训练数据本身的前提下将误差最小化。

前面的图1.4描述了一个线性拟合模型,而图1.5所示描述了使用同一数据集的多项式拟合模型。

图1.5

顾名思义,无监督学习算法是在没有监督的情况下对概念进行学习或推断。监督学习算法基于输入数据点和输出信号组成的训练数据集来推断映射函数,而无监督学习算法的任务是在没有任何输出信号的训练数据集中找出训练数据中的模式和关系。这类算法利用输入数据集来检测模式,挖掘规则或将数据点进行分组/聚类,从而从原始输入数据集中提取出有意义的见解。

当我们没有包含相应输出信号或标签的训练集时,无监督学习算法就能派上用场。在许多现实场景中,数据集在没有输出信号的情况下是可用的,并且很难手动对其进行标记。因此无监督学习算法有助于填补这些空缺。

与监督学习算法类似,为了便于理解和学习,无监督学习算法也可以进行分类。下面是不同类别的无监督学习算法。

1.聚类

分类问题的无监督学习算法称为聚类。这些算法能够帮助我们将数据点聚类或分组到不同的组或类别中,而不需要在输入或训练数据集中包含任何输出标签。这些算法会尝试从输入数据集中找到模式和关系,利用固有特征基于某种相似性度量将它们分组。

一个有助于理解聚类的现实世界的例子是新闻文章。每天有数百篇新闻报道被创作出来,每一篇都针对不同的话题,如政治、体育和娱乐等。聚类是一种可以将这些文章进行分组的无监督方法,如图1.6所示。

执行聚类过程的方法有多种,其中最受欢迎的方法包括以下几种。

图1.6

2.降维

数据和机器学习是最好的朋友,但是更多、更大的数据会带来许多问题。大量的属性或膨胀的特征空间是常见的问题。一个大型特征空间在带来数据分析和可视化方面的问题的同时,也带来了与训练、内存和空间约束相关的问题。这种现象被称为维度诅咒。由于无监督方法能够帮助我们从未标记的训练数据集中提取见解和模式,因此这些方法在帮助我们减少维度方面很有用。

换句话说,无监督方法能够帮助我们从完整的可用列表中选择一组具有代表性的特征,从而帮助我们减少特征空间,如图1.7所示。

图1.7

主成分分析(Principal Component Analysis,PCA)、最近邻分析和判别分析是常用的降维技术。

图1.7所示是基于PCA的降维技术的工作原理的著名描述图片。图片左侧展示了一组在三维空间中能表示为瑞士卷形状的数据,图片右侧则展示了应用PCA将数据转换到二维空间中的结果。

3.关联规则挖掘

这类无监督机器学习算法能够帮助我们理解和从交易数据集中提取模式。这些算法被称为市场篮子分析(Market Basket Analysis,MBA),可以帮助我们识别交易项目之间有趣的关系。

使用关联规则挖掘,我们可以回答“在特定的商店中哪些商品会被一起购买?”或者“买葡萄酒的人也会买奶酪吗?”等问题。FP-growth、ECLAT和Apriori是关联规则挖掘任务的一些广泛使用的算法。

4.异常检测

异常检测是基于历史数据识别罕见事件或观测的任务,也称为离群点检测。异常值或离群值通常具有不频繁出现或在短时间内突然爆发的特征。

对于这类任务,我们为算法提供了一个历史数据集,因此它能够以无监督学习的方式识别和学习数据的正常行为。一旦学习完成之后,算法将帮助我们识别不同于之前学习行为的模式。

跨行业数据挖掘标准流程(Cross Industry Standard Process for Data Mining,CRISP-DM)是数据挖掘和分析项目中最流行和应用最广泛的流程之一。CRISP-DM提供了需要的框架,框架清晰地描述了执行数据挖掘和分析项目的必要步骤和工作流,包括从业务需求到最终部署阶段,以及这个过程中的所有内容。

相较于跨行业数据挖掘标准流程,CRISP-DM这个缩写更广为人知,它是一个用于数据挖掘和分析项目,经过试验和测试的、健壮的行业标准流程模型。CRISP-DM清晰地描述了用于执行任何项目的必要步骤和工作流,从形式化业务需求到测试和部署解决方案以将数据转换为见解。数据科学、数据挖掘和机器学习都尝试运行多个迭代过程,从数据中提取见解和信息。因此我们可以说分析数据既是一门艺术,也是一门科学,因为它并不总是毫无原因地运行算法。其主要工作包括理解业务、所投入的工作的实际价值,以及阐明最终结果和见解的适当方法。

数据科学和数据挖掘项目本质上是迭代的,目的是从数据中提取有意义的见解和信息。在应用实际的算法(这些算法也要经过多次迭代)和最终进行评估和部署之前,需要花费大量时间来理解业务的价值和手头上的数据。

与具有不同生命周期模型的软件工程项目类似,CRISP-DM能够帮助我们由始至终地对数据挖掘和分析项目进行追踪。该模型分为6个主要步骤,涵盖了从业务和数据理解到评估和最终部署的各个方面,所有这些步骤本质上都是迭代的,如图1.8所示。

图1.8

现在我们来更深入地了解这6个步骤,以便更好地理解CRISP-DM模型。

第一步也是最重要的一步,是理解业务。这一关键步骤从设置问题的业务上下文和需求开始。正式定义业务需求对于将其转换为数据科学和分析问题陈述非常重要。此步骤还用于为业务团队和数据科学团队设置期望和成功标准,以使它们保持一致,以及对项目的进度进行追踪。

此步骤的主要交付内容是由主要里程碑、时间线、假设、约束、说明、预期问题和成功标准组成的详细计划。

数据收集和理解是CRISP-DM模型的第二个步骤。在这一步中,我们将深入了解和分析前一个步骤中形式化的问题陈述的数据。此步骤开始于调查在之前详细的项目计划中概述的各种数据源;然后使用这些数据源收集数据,分析不同的属性,并对数据质量进行记录。这一步骤还包括通常被称为探索性数据分析的过程。

探索性数据分析(Exploratory Data Analysis,EDA)是一个非常重要的子步骤。在探索性数据分析的过程中,我们分析了数据的不同属性和特性,也对数据进行了可视化,以便更好地理解和发现以前没有看到或忽略的模式。该步骤为下一个步骤奠定了基础,因此该步骤是不能忽视的。

这是数据科学项目中的第三个步骤,也是最耗时的步骤。一旦我们理解了业务问题并探索了可用的数据,就可以开始进行数据准备。这一步骤包含数据集成、清理、处理、特征选择和特性工程。首先也是最重要的是数据集成。有些时候数据来自不同的数据源,因此需要基于特定的键或属性将其进行组合,以便更好地使用。

数据清理和处理是非常重要的步骤。包括处理丢失的值、处理数据的不一致性、修复不正确的值,以及将数据转换为可被机器学习算法使用的格式。

数据准备是最为耗时的步骤,在任何数据科学项目中都占总时间的60%~70%或以上。除了数据集成和处理之外,该步骤还涉及根据相关性、质量、假设和约束来选择关键特性,这一过程被称为特性选择。有时我们还必须从已有的特性中派生或生成特征,例如根据用例需求由出生日期计算年龄等,这一步骤被称为特性工程,基于特定的用例会再次被使用。

第四个步骤(即建模步骤)是实际分析和机器学习发生的地方。该步骤利用前一步骤中准备的干净的格式化数据进行建模。这是一个迭代过程,并与数据准备步骤同步进行,因为模型或算法需要包含不同属性集合的不同设置或格式的数据。

该步骤涉及相关工具和框架的选择,以及建模技术或算法的选择。该步骤包括基于业务理解阶段制定的预期和标准对模型进行构建、评估和微调。

一旦建模步骤产出了一个满足成功标准、性能基准测试和模型评估度量的模型,一个完整的评估步骤就出现了。在该步骤中,我们在进入部署阶段前,会考虑以下几点:

CRISP-DM模型的最后一个步骤是将模型部署到生产中。在多个迭代过程中开发、优化、验证和测试的模型被保存下来,并为生产环境做好准备。这个过程构建了一个适当的部署计划,其中包括详细的硬件和软件需求。部署阶段还包括实施检查和监视方面的内容,用以评估生产中的模型的结果、性能和其他指标。

CRISP-DM模型为机器学习和相关项目管理提供了一个高级工作流。在本节内容中,我们将讨论用于处理机器学习项目的技术方面和标准工作流的实现。简单来说,一个机器学习管道是由一个数据密集型项目的各个方面组成的端到端工作流。一旦初始阶段(如业务理解、风险评估、机器学习或数据挖掘技术选型)被覆盖,我们就进入了驱动项目的解决方案空间。一个典型的包含不同的子组件的机器学习管道或工作流如图1.9所示。

图1.9

一个标准的机器学习管道大致包含以下几个阶段。

数据收集和提取通常是机器学习的开始。数据集以各种形式出现,包括结构化和非结构化数据,同时数据集通常包含丢失的数据或有噪声的数据。每种数据格式都需要特殊的数据处理和管理机制。例如,如果一个项目涉及对推文的分析,我们需要使用推特API并开发提取所需推文的机制,这些推文通常是JSON格式的。

其他场景可能涉及已有的结构化或非结构化的公共或私有数据集,除了开发提取机制之外,两种场景都可能需要额外的权限。如果读者有兴趣深入了解更多细节,可以在Practical Machine Learning with Python一书的第3章中找到关于使用不同数据格式的非常详细的讨论内容。

需要强调的是,这个阶段是整个管道中花费时间最多的阶段。这是一个非常详细的步骤,其中包含一些基础的、重要的子步骤,这些子步骤包括:

1.探索性数据分析

到目前为止,项目中的所有初始步骤都围绕着业务上下文、需求、风险等方面展开。这是我们实际深入研究收集的或可用的数据的第一个接触点,探索性数据分析可以帮助我们理解数据的各个方面。在这个步骤中,我们可以分析数据的不同属性,以产生有趣的见解,甚至还可以在不同维度上对数据进行可视化以更好地理解数据。

这个步骤能帮助我们收集手头数据集的重要特征,这不仅在项目的后期会很有用,还能帮助我们识别和缓和在管道中早期的潜在问题。本章稍后的内容将介绍一个有趣的例子,以便于读者理解探索性数据分析的过程和重要性。

2.数据处理

这个步骤致力于将数据转换为可用的形式。在第一个步骤中检索的原始数据在大多数情况下无法被机器学习算法使用。从形式上来说,数据处理是将数据从一种形式清理、转换和映射到另一种形式,以便在项目之后的生命周期中使用。这个步骤包含缺失的数据填充、类型转换、处理重复值和异常值等。为了更好地理解,我们将在案例式讲解的章节中讨论这些步骤的相关内容。

3.特征工程和特征提取

经过处理后的数据,在特征工程和特征提取阶段之后可以达到可用状态。在这个步骤中,我们利用现有的属性来派生和提取针对上下文或用例的特定属性或特征,这些属性或特征可以在接下来的阶段被机器学习算法使用。我们可以根据不同的数据类型使用不同的技术。

特征工程和特征提取是一个相当复杂的步骤,因此将在本章稍后的内容中进行更详细的讨论。

4.特征缩放和特征选择

在某些情况下,可用特性的数量过多会对整体解决方案产生负面影响。处理具有大量属性的数据集不仅是一个难题,还会造成对数据进行解释、可视化等方面的困难。这些问题在形式上被称为维度诅咒

因此特征选择可以帮助我们识别可在建模步骤中使用且不会丢失太多信息的具有代表性的特性集。有不同的技术可以用来执行特征选择,其中的一些技术将会在本章后面的内容中讨论。

在建模过程中,我们通常将数据特征提供给一个机器学习算法,并对模型进行训练。这是为了对一个特定的成本函数进行优化,在大多数情况下目的是减少误差,并将从数据中学习到的表示形式进行泛化。

根据数据集和项目需求,我们会应用一种或多种机器学习算法的组合。这些方法可以包括有监督的算法(例如分类或回归)、无监督的算法(例如集群),甚至包括将不同算法进行组合的混合方法(如前面的机器学习算法部分所讨论的内容)。

建模通常是一个迭代过程,我们经常会利用多种算法或方法,并根据模型评估性能指标选择最佳模型。由于本书是一本关于迁移学习的书,因此我们在接下来的章节中将会主要构建基于深度学习的模型,但是建模的基本原则与机器学习模型非常相似。

开发一个模型仅仅是从数据中学习的一部分。建模、评估和调优是迭代的步骤,这些步骤可以帮助我们对模型进行微调和选择性能最佳的模型。

1.模型评估

模型是数据的泛化表示,也是用于学习这种表示的底层算法。因此模型评估是一个基于特定的标准对构建的模型进行评估,从而评估其性能的过程。模型性能通常是一个函数,它提供数值结果以帮助我们判断任何模型的有效性。通常用成本或损失函数基于评估指标进行优化来构建一个精确的模型。

根据使用的建模技术,我们可以使用相关的评估指标。对于监督方法,我们通常使用下列技术。

评估无监督算法(如聚类)的常用指标包括:

 

 

请注意,虽然上面列出了被广泛使用的度量指标,但绝不是详尽的模型评估度量指标。

 

交叉验证也是模型评估过程的一个重要方面,我们可以利用基于交叉验证策略的验证集,通过调整模型的各种超参数来评估模型性能。你可以将超参数看作可用于对模型进行微调,以构建高效、性能更好的模型的旋钮。当我们在后续章节中使用这些指标对大量真实例子中的模型进行评估时,这些评估技术的使用方法和细节将会更加清晰。

2.偏差-方差权衡

监督学习算法能够帮助我们推断或学习一个从输入数据点到输出信号的映射。这种学习会产生一个目标函数或一个学习函数。在理想情况下,目标函数将学习输入和输出变量之间的精确映射。不幸的是,理想情况并不存在。

如前文所述,在介绍监督学习算法时,我们可以使用一个被称为训练数据集的数据子集来学习目标函数,然后在另一个被称为测试数据集的子集上测试性能。由于该算法只能看到所有可能的数据组合的子集之一,因此在预测输出和观察输出之间会产生误差,这被称为总误差预测误差,其公式如下:

总误差 = 偏差误差 + 方差误差 + 不可约误差

不可约误差是指由噪声、构造问题的方法、收集数据等因素引起的固有误差。顾名思义,这个错误是不可约的,从算法的角度来看我们几乎无法处理这个误差。

(1)偏差

偏差用于指代学习算法为了推断目标函数而做出的基本假设。高偏差说明算法对目标函数的假设较多,低偏差说明算法对目标函数的假设较少。

由偏差引起的误差只是预期(或平均)预测值与实际观测值之间的差值。为了得到预测的平均值,我们可以重复学习步骤多次,然后对结果求平均值。偏差误差可以帮助我们理解模型的泛化程度。低偏差算法通常是非参数算法,如决策树、支持向量机等;而参数函数,如线性回归、逻辑回归等则偏差较高。

(2)方差

方差标记了模型对训练数据集的敏感性。我们知道,学习阶段依赖于所有可能的数据组合成的一个被称为训练集的小型子集,因此方差误差会随着训练数据集的变化捕捉模型估计值中的变化。

低方差意味着随着底层训练数据集的变化,预测值的变化变少,而高方差则相反。非参数算法(例如决策树)具有较高的方差;而参数算法(例如线性回归)灵活性较差,因此方差较低。

(3)权衡

偏差-方差权衡是一种同时降低监督学习算法偏差和方差误差的方法,它能阻止目标函数在训练数据点之外进行泛化,如图1.10所示。

图1.10

假设我们给定了一个问题陈述:根据一个人的身高,确定他(她)的体重。我们还给出了一个包含对应身高和体重的训练数据集,数据如图1.11所示。

图1.11

 

 

请注意,这只是一个用于解释重要概念的示例,我们将在后续的章节中解决实际问题。

 

这是一个监督学习算法问题的例子,而且更像是一个回归问题。利用这个训练数据集,我们的算法必须学习目标函数,找出一个不同个体的身高和体重之间的映射。

(4)欠拟合

基于我们的算法,训练阶段可以有不同的输出。假设学习到的目标函数如图1.12所示。

图1.12

这个懒函数总是会预测出一个恒定的输出值。由于目标函数无法了解数据的底层结构,因此会导致所谓的欠拟合。欠拟合模型的预测性能较差。

(5)过拟合

训练阶段的另一个极端被称为过拟合,如图1.13所示。

图1.13

图1.13所示为一个完美地映射了训练数据集中的每个数据点的目标函数,这种现象被称为模型过拟合。在这种情况下,算法会尝试学习准确的数据特征,包括噪声,因此无法对新的、从未见过的数据点进行可靠的预测。

(6)泛化

欠拟合和过拟合之间的最佳点就是我们所说的良好拟合。对于给定的问题,良好泛化的模型如图1.14所示。

图1.14

一个在训练数据集和未见过的数据点上都有良好性能的学习函数被称为泛化函数。因此泛化是指目标函数基于在训练阶段学到的概念,以及在未见过的数据上的性能好坏。图1.14所示为一个良好的泛化拟合。

3.模型调优

模型调优与准备和评估模型同样重要。我们几乎不会直接使用为我们提供标准算法集的不同机器学习框架或库。

机器学习算法具有不同的参数或旋钮,可以根据项目需求和不同的评估结果进行调优。模型调优通过迭代地对超参数或元参数进行不同设置来达到更好的结果。超参数是高层次抽象的旋钮,是在学习过程开始之前就设置好的。

 

 

超参数与在训练阶段学习到的模型级别参数不同,因此模型调优也被称为超参数优化

 

网格搜索、随机超参数搜索、贝叶斯优化等方法是进行模型调优时常用的方法。尽管模型调优非常重要,但是过度调优可能会对学习过程产生负面影响。在前面关于偏差和方差的内容中已经讨论了一些与调优过度相关的问题。

一旦模型开发、评估和调优完成,并经过了多次迭代改进了结果,就进入了最后的模型部署阶段。模型部署负责模型持久性、通过不同的机制(如API)将模型开放给其他应用程序等方面,以及开发监控策略。

我们生活在一个万物经常变化的动态的世界中,与用例相关的数据和其他因素也是如此。这就要求我们必须实施监控策略,例如定期报告、日志和测试,来检查解决方案的性能,并根据需要进行修改。

机器学习管道既是关于软件科学的,又是关于数据科学和机器学习的。在前面的内容中,我们简要地概述和讨论了一个典型管道的不同组件。根据特定的用例,我们可以修改标准管道以满足需求,但也要确保不会忽略已知的缺陷。在接下来的几节内容中,我们将更详细地介绍典型机器学习管道的几个组件,以及实际的示例和代码片段。

探索性数据分析是当我们开始任何机器学习项目时首先执行的几个任务之一。正如在1.3节中所讨论的,数据理解是一个重要步骤,可以发现关于数据的各种见解,并更好地理解业务需求和上下文。

在本节内容中,我们将使用一个实际的数据集,并使用pandas类库作为数据操作库进行探索性数据分析,还将同时使用seaborn类库实现数据可视化。完整的代码片段和分析的细节可以在Python笔记本game_of_thrones_eda.ipynb中找到。

我们先导入所需的类库并设置配置,如代码片段1.1所示。

代码片段1.1

In [1]: import numpy as np
   ...: import pandas as pd
   ...: from collections import Counter
   ...:
   ...: # plotting
   ...: import seaborn as sns
   ...: import matplotlib.pyplot as plt
   ...:
   ...: # setting params
   ...: params = {'legend.fontsize': 'x-large',
   ...:           'figure.figsize': (30, 10),
   ...:           'axes.labelsize': 'x-large',
   ...:           'axes.titlesize':'x-large',
   ...:           'xtick.labelsize':'x-large',
   ...:           'ytick.labelsize':'x-large'}
   ...:
   ...: sns.set_style('whitegrid')
   ...: sns.set_context('talk')
   ...:
   ...: plt.rcParams.update(params)

一旦设置和需求准备就绪,我们就可以开始关注数据了。用于探索性分析的数据集是battle.csv文件,其中包含了《权力的游戏》(截至第5季)世界中所有的主要战役。

作为有史以来最受欢迎的电视剧集之一,《权力的游戏》是一部以维斯特洛大陆和厄索斯大陆为背景的奇幻剧,其中充满了多重情节和大量为争夺铁王座而斗争的角色。它改编自George R.R. Martin的《冰与火之歌》系列小说。作为一个备受欢迎的剧集,它吸引了很多人的注意,数据科学家也不例外。这个笔记本在由Myles O’Neill增强过的Kaggle数据集中展示了探索性数据分析,该数据集是由多人收集和贡献的多个数据集的组合。在这个分析中我们使用了battles.csv文件。原始战役数据由Chris Albon提供。

代码片段1.2使用pandas类库加载battles.csv文件:

代码片段1.2

In [2]: battles_df = pd.read_csv('battles.csv')

数据集如图1.15所示。

图1.15

我们可以使用pandas类库的便捷函数shape()、dtypes()和describe()分别查看总行数、每个属性的数据类型和数值属性的一般统计信息。我们共有38场战役的数据,每场战役有25个属性。

让我们来了解一下幻想大陆上战役的年份分布。代码片段1.3绘制了这个分布的条形图。

代码片段1.3

In [3]: sns.countplot(y='year',data=battles_df)
   ...: plt.title('Battle Distribution over Years')
   ...: plt.show()

从图1.16所示的内容可以看出,发生战役次数最多的年份是299年,其次是300年和298年。

图1.16

这片幻想大陆上有不同的地区,你能想象到的每一个地方都有战役发生。然而查看一下是否有区域更容易发生战役是一件有趣的事。代码片段1.4帮助我们精确地回答了这个问题。

代码片段1.4

In [4]: sns.countplot(x='region',data=battles_df)
   ...: plt.title('Battles by Regions')
   ...: plt.show()

图1.17所示的内容帮助我们确定:河间地经历了最多的战役,其次是北境和西境。另一件值得注意的有趣的事情是,绝境长城以外地区只有一场战役。

我们可以使用不同的分组变量来执行类似的分析,例如了解每个区域的主要死亡人数或捕获人数等。

我们继续来看哪个角色进攻次数最多。我们使用饼状图来直观地展示每个角色参与的战役所占的百分比。请注意,我们是基于进攻角色来进行此分析的。同样也可以基于防守角色来进行类似分析。代码片段1.5准备了一个饼状图来显示每个进攻角色在战役中的占比。

图1.17

代码片段1.5

In [5]: attacker_king = battles_df.attacker_king.value_counts()
   ...: attacker_king.name='' # turn off annoying y-axis-label
   ...: attacker_king.plot.pie(figsize=(6, 6),autopct='%.2f')

每个进攻角色在战役中的占比饼状图如图1.18所示。

图1.18

维斯特洛大陆和厄索斯大陆到处都是危险的敌人和威胁。让我们分析一下数据来了解在什么情况下哪个角色会是赢家。因为一个角色既可以保卫他的土地,也可以为了权力而进攻,所以看到防守和进攻同时获胜是很有趣的。代码片段1.6帮助我们准备了一个堆叠的条状图来分析每个角色的进攻和防守的胜利情况。

代码片段1.6

In [6] : attack_winners = battles_df[battles_df.
    ...:                             attacker_outcome=='win']
    ...:                                 ['attacker_king'].
    ...:                                   value_counts().
    ...:                                   reset_index()
    ...:
    ...: attack_winners.rename(
    ...:         columns={'index':'king',
    ...:                  'attacker_king':'wins'},
    ...:                   inplace=True)
    ...:
    ...: attack_winners.loc[:,'win_type'] = 'attack'
    ...:
    ...: defend_winners = battles_df[battles_df.
    ...:                             attacker_outcome=='loss']
    ...:                             ['defender_king'].
    ...:                             value_counts().
    ...:                             reset_index()
    ...: defend_winners.rename(
    ...:         columns={'index':'king',
    ...:                  'defender_king':'wins'},
    ...:                   inplace=True)
    ...:
    ...: defend_winners.loc[:,'win_type'] = 'defend'
    ...:
    ...:
    ...: sns.barplot(x="king",
    ...:             y="wins",
    ...:             hue="win_type",
    ...:             data=pd.concat([attack_winners,
    ...:                             defend_winners]))
    ...: plt.title('Kings and Their Wins')
    ...: plt.ylabel('wins')
    ...: plt.xlabel('king')
    ...: plt.show()

代码片段1.6计算了每个角色进攻时获胜的次数,然后计算了每个角色防守时获胜的次数。合并这两个结果,并绘制堆叠的条状图,结果如图1.19所示。

图1.19所示的内容清楚地显示了来自拜拉席恩的男孩们拥有最多的胜利,无论是进攻还是防守。罗柏·史塔克是第二成功的角色,直到红色婚礼的发生。

图1.19

数据集还包含描述所涉及的房屋数量、战役指挥官和军队规模的属性。我们可以进行类似的、更深入的分析,来更好地理解战役。我们鼓励读者尝试其中的一些分析作为练习,并检查Python笔记本来探索更多指标。

在我们结束本节内容之前,让我们试着找出铁王座之战中的主要敌人。代码片段1.7帮助我们回答了这个问题。

代码片段1.7

In [7]: temp_df = battles_df.dropna(
   ...:                      subset = ["attacker_king",
   ...:                                "defender_king"])[
   ...:                                  ["attacker_king",
   ...:                                   "defender_king"]
   ...:                                  ]
   ...:
   ...: archenemy_df = pd.DataFrame(
   ...:                 list(Counter(
   ...:                         [tuple(set(king_pair))
   ...:                          for king_pair in temp_df.values
   ...:                          if len(set(king_pair))>1]).
   ...:                             items()),
   ...:                 columns=['king_pair',
   ...:                          'battle_count'])
   ...:
   ...: archenemy_df['versus_text'] = archenemy_df.
   ...:                                 apply(
   ...:                                     lambda row:
   ...:                                 '{} Vs {}'.format(
   ...:                                         row[
   ...:                                             'king_pair'
   ...:                                             ][0],
   ...:                                         row[
   ...:                                             'king_pair'
   ...:                                             ][1]),
   ...:                                         axis=1)
   ...: archenemy_df.sort_values('battle_count',
   ...:                          inplace=True,
   ...:                          ascending=False)
   ...:
   ...:
   ...: archenemy_df[['versus_text',
   ...:               'battle_count']].set_index('versus_text',
   ...:                                           inplace=True)
   ...: sns.barplot(data=archenemy_df,
   ...:             x='versus_text',
   ...:             y='battle_count')
   ...: plt.xticks(rotation=45)
   ...: plt.xlabel('Archenemies')
   ...: plt.ylabel('Number of Battles')
   ...: plt.title('Archenemies')
   ...: plt.show()

我们首先准备一个临时的数据框,并删除任何没有列出进攻或防守的角色名字的战役。一旦我们有了一个干净的数据框,我们就可以遍历每一行,并计算每对对手进行了多少次战役。我们忽略那些战斗发生在角色自己军队中的情况(if len(set(king_pair))> 1);然后简单地将结果绘制成条状图,如图1.20所示。

图1.20

从图1.20所示的内容可以看出罗柏·史塔克和乔弗里·拜拉席恩一共打了19场战役,而其他对手只打了5场或更少。

本节内容中共享的分析和可视化只是我们对数据集可以做什么事进行的简要介绍,单从这个数据集中就可以提取很多的模式和见解。

在进入机器学习其他阶段之前,探索性数据分析是一种用于理解数据集非常强大的机制。在后续的章节中,我们将定期执行探索性数据分析,以帮助我们在进行建模、调优、评估和部署阶段之前理解数据集的业务问题。

数据准备是所有机器学习项目中最长、最复杂的阶段。在讨论CRISP-DM模型时我们也强调了这一点,其中我们提到了数据准备阶段如何占到了机器学习项目总时间的60%~70%或以上。

一旦我们完成了对原始数据集的预处理和处理,下一步就是使数据集可被机器学习算法所用。特征提取是从原始属性中提取特征的过程。例如处理图像数据时,特征提取指的是从原始像素级数据中提取红、蓝、绿通道信息作为特征。

特征工程指的是利用数学变换从现有特征中派生出附加特征的过程。例如特性工程能够帮助我们从一个人的月收入派生出一个特征,如年收入(基于用例需求)。由于特征提取和特征工程都能够帮助我们将原始数据集转换为可用的形式,因此机器学习的实践者可以将这两个术语互换使用。

将原始数据集转换为机器学习算法(数据清理和处理后)可以使用的特征的过程是领域知识、用例需求和特定技术的组合过程。因此,特征描述了底层数据的各种表示形式,也是特征工程处理的结果。

由于特征工程能够将原始数据转换为自身的可用表示,因此根据已有的数据类型,可以使用多种标准技术和策略。在本小节中,我们将讨论其中的一些策略,简要介绍结构化和非结构化数据。

1.处理数值数据

数值数据通常以整数或浮点数的形式出现在数据集中,经常被称为连续数值数据,通常是机器学习友好的数据类型。这里所说的友好,指的是数值数据在大多数机器学习算法中可以被直接使用。但这并不意味着数值数据不需要额外的处理和特征工程步骤。

从数值数据中提取工程特征的方法有多种,其中的一些技巧如下所示。

读者可以在Jupyter笔记本的feature_engineering_numerical_and_categorical_data.ipynb中找到对应的代码片段,以便更好地理解用于数值数据的特征工程。

2.处理分类数据

另一类常见的重要数据是分类数据。分类特征包含属于一个有限组类的离散值,这些类可以表示为文本或数字。根据类是否有顺序,分类特征分为有序特征标称特征

标称特征指的是那些具有有限值集但没有任何自然顺序的分类特征,例如天气季节、电影类型等。具有有限组类,且类有自然顺序的分类特征称为有序特征,例如工作日、衣服尺码等。

通常来说,任何特征工程中的标准工作流都涉及将这些分类值转换为数字标签的某种形式,然后对这些值应用某种编码方案。常用的编码方案的介绍如下。

读者可以在Jupyter笔记本的feature_engineering_numerical_and_categorical_data.ipynb中找到对应的代码片段,以便更好地理解用于分类数据的特征工程。

3.处理图像数据

图像或可视数据是一种丰富的数据来源,有几个用例可以使用机器学习算法和深度学习来解决。图像数据提出了许多挑战,并且需要仔细地进行预处理和转换之后才能被算法利用。一些常用的关于图像数据的特征工程方法如下。

基于深度学习的自动特征提取

到目前为止所讨论的图像数据和其他类型的特征提取方法都需要大量的时间、精力和领域知识。这种特征提取方法有它的优点,但也有其局限性。

近年来,深度学习,尤其是卷积神经网络作为自动特征提取器得到了广泛的研究和应用。卷积神经网络是对图像数据进行深度神经网络优化的一个特例。任何卷积神经网络的核心都是卷积层,也就是在图像的高度和宽度上应用滑动过滤器。像素值和这些过滤器的点积产出的激活映射可以跨多个周期学习。在每一层中,这些卷积层都能提取特定的特征,如边缘、纹理、边角等。

关于深度学习和卷积神经网络的内容还有很多,但是为了简单起见,让我们假设在每一层,卷积神经网络都能帮助我们自动提取不同的低层和高层特征,让我们避免了手动提取特征。我们将在后续的章节中更详细地研究卷积神经网络,并分析它们是如何帮助我们自动提取特征的。

4.处理文本数据

数值特征和分类特征就是我们所说的结构化数据类型,它们在机器学习工作流中更容易被处理和使用。文本数据是同样重要的非结构化信息的一种主要来源,它提出了与语法理解、语义、格式和内容相关的多个挑战。文本数据在被机器学习算法使用之前还有转换为数值形式的问题。因此文本数据的特征工程需要经过严格的预处理和清理步骤。

(1)文本预处理

文本数据在进行任何特征提取或特征工程之前,都需要进行仔细而费心的预处理。预处理文本数据涉及多个步骤,以下是一些被广泛使用的文本数据预处理步骤:

我们将在与用例相关的章节中详细介绍以上大多数技术。为了更好地理解,读者可以参考Practical Machine Learning with Python一书的第4章和第7章。

(2)特征工程

如果我们通过1.5节中提到的方法对文本数据进行了正确的处理,那么我们就可以使用以下的一些技术来提取特征并将其转换为数值形式。读者可以在Jupyter笔记本的feature_engineering_text_data.ipynb中找到对应的代码片段,以便更好地理解文本数据的特性工程。

(公式1.1)

在公式1.1中, 表示单词w在文档D中的TF-IDF得分, 表示单词w在文档D中出现的频率, 表示逆文档频率,计算方法为语料库C中的所有文档的对数转换除以单词w在文档中出现的频率。

除了词袋模型和TF-IDF模型之外,还有其他转换,例如N-元词袋模型和Word2vec、Glove等词向量,以及更多其他的转换。我们将在后续的章节中详细介绍其中的几个。

特征提取和特征工程过程能够帮助我们从底层数据集中提取和生成特征。在某些情况下会导致算法需要处理巨大的输出数据。在这种情况下,输入中的许多特征会被怀疑是冗余的,并有可能导致出现复杂的模型,甚至过拟合。特征选择是从可用或生成的完整特征集中识别代表性特征的过程。被选出的特征集应该包含所需的信息,如此一来,算法就能够完成给定的任务,并且不会遇到数据处理、复杂性和过拟合等问题。特征选择还有助于更好地理解建模过程中使用的数据,同时加快处理速度。

特征选择方法大致可分为以下3类。

特征选择是构建一个机器学习系统过程中的一个重要方面。如果不细致地进行处理,可能会导致系统偏差的产生。读者应该注意,特征选择应该使用与训练数据集分离的数据集来完成。利用训练数据集进行特征选择总是会导致过拟合,而利用测试集进行特征选择则会高估模型的性能。

大多数流行的类库提供了广泛的特征选择技术。像scikit-learn这样的类库就提供了一些现成的方法,我们将在后续章节中看到并使用其中的许多特征选择方法。

对于任何学习来说,对概念和技术的理解有坚实的基础是非常重要的。我们试图通过本章对机器学习基础的介绍来达到这一目的。在开始学习深度学习、迁移学习和更高级的概念之前,我们必须就机器学习概念打下坚实的基础。在本章中,我们已经讨论了相当多的基础知识,并提供了一些重要的指引来更详细地学习这些概念。

在本章的开始,我们理解了为什么机器学习很重要,以及它是一个怎样完全不同的范式,并简要讨论了人工智能、机器学习和深度学习之间的关系。本章介绍了不同的机器学习算法,如监督学习算法、无监督学习算法和强化学习算法等。我们还详细讨论了监督学习算法和无监督学习算法常用的不同场景。

本章简要介绍了用于机器学习的CRISP-DM模型和机器学习管道。我们还讨论了来自《权力的游戏》中幻想大陆的战役数据集探索性数据分析来应用不同的概念,并了解了探索性数据分析的重要性。本章的最后介绍了特征提取、特征工程和特征选择。

后续章节的内容将建立在本章涉及的概念的基础之上,并且会将我们所学到的知识运用于各个章节关注的现实世界的用例中。


相关图书

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

相关文章

相关课程