Python机器学习实践指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-23 22:15:11

点击下载

作者:[美] Alexander T. Combs

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Python机器学习实践指南

Python机器学习实践指南试读:

前言

机器学习正在迅速成为数据驱动型世界的一个必备模块。许多不同的领域如机器人、医学、零售和出版等,都需要依赖这门技术。在这本书中,你将学习如何一步步构建真实的机器学习应用程序。

通过易于理解的项目,你将学习如何处理各种类型的数据,如何以及何时应用不同的机器学习技术,包括监督学习和无监督学习。

本书中的每个项目都同时提供了教学和实践。例如,你将学习如何使用聚类技术来发现低价的机票,以及如何使用线性回归找到一间便宜的公寓。本书以通俗易懂、简洁明了的方式,教你如何使用机器学习来收集、分析并操作大量的数据。本书涵盖的内容

第1章,Python机器学习的生态系统,深入Python,它有一个深度活跃的开发者社区,而且许多开发者来自科学社区。这为Python提供了丰富的科学计算库。在本章中,我们将讨论这些关键库的特性以及如何准备你的环境,以最好地利用它们。

第2章,构建应用程序,发现低价的公寓,指导我们构建第一个机器学习应用程序,我们从一个最小但实际的例子开始:建设应用程序来识别低价的公寓。到本章结束,我们将创建一个应用程序,使得寻找合适的公寓变得更容易点。

第3章,构建应用程序,发现低价的机票,演示了如何构建应用程序来不断地监测票价。一旦出现异常价格,应用程序将提醒我们,可以快速采取行动。

第4章,使用逻辑回归预测IPO市场,展示了我们如何使用机器学习决定哪些IPO值得仔细研究,而哪些可以直接跳过。

第5章,创建自定义的新闻源,介绍如何构建一个系统,它会了解你对于新闻的品味,而且每天都可以为你提供个性化的新闻资讯。

第6章,预测你的内容是否会广为流传,检查一些被大家广泛分享的内容,并试图找到这种内容相对于其他人们不愿分享的内容有哪些特点。

第7章,使用机器学习预测股票市场,讨论如何构建和测试交易策略。当你试图设计属于自己的系统时,有无数的陷阱要避免,这是一个几乎不可能完成的任务。但是,这个过程有很多的乐趣,而且有的时候,它甚至可以帮你盈利。

第8章,建立图像相似度的引擎,帮助你构建高级的、基于图像的深度学习应用。我们还将涵盖深度学习的算法来了解为什么它们是如此的重要,以及为什么它们成为了最近研究的热点。

第9章,打造聊天机器人,演示如何从头构建一个聊天机器人。读完之后,你将了解更多关于该领域的历史及其未来前景。

第10章,构建推荐引擎,探讨不同类型的推荐系统。我们将看到它们在商业中是如何实现和运作的。我们还将实现自己的推荐引擎来查找GitHub资料库。阅读本书需要准备什么

你需要的是Python 3.x和建立真实机器学习项目的渴望。你可以参考随本书的详细代码列表。本书的读者

本书的目标读者包括了解数据科学的Python程序员、数据科学家、架构师,以及想要构建完整的、基于Python的机器学习系统的人员。约定

在这本书中,你会发现许多文本样式,以区分不同种类的信息。这里是某些样式的例子和它们的含义。

文本中的代码、数据库表名称、文件夹名称、文件名、文件扩展名、路径名、虚构的URL、用户输入和Twitter句柄如下所示:“这点可以通过在我们的数据框上调用.corr()来实现。”

代码块的格式设置如下。 I LIKE TURTLES

任何命令行输入或输出的写法如下。sp = pd.read_csv(r'/Users/alexcombs/Downloads/spy.csv')sp.sort_values('Date', inplace=True)

新术语和重要词语以粗体显示。读者反馈

我们非常欢迎读者的反馈。让我们知道你对这本书有什么想法——你喜欢哪些内容或不喜欢哪些内容。读者的反馈对我们而言很重要,因为它有助于我们打造各种主题,而且让你获益更多。

对于一般的反馈,通过电子邮件feedback@packtpub.com发送,并在消息的主题中提及书的标题。

如果你擅长某个专业的主题,并且你有兴趣撰写或合著一本书,请参阅我们的作者指南www.packtpub.com/authors。客户支持

现在你是一名自豪的Packt书籍所有者,我们将做一些事情来帮助你从这次购买中获得最大收益。下载示例代码

在http://www.packtpub.com,你可以通过自己的账户来下载此书的示例代码文件。如果你在其他地方购买此书,你可以访问http://www.packtpub.com/support并注册,我们将文件直接发送给你。

你可以通过以下步骤下载代码文件。

1.使用你的电子邮件地址和密码登录或注册我们的网站。

2.将光标指针悬停在顶部的SUPPORT选项卡上。

3.单击Code Downloads & Errata。

4.在搜索框Search中输入书籍的名称。

5.选择你要下载代码文件的图书。

6.在下拉菜单中,选择你在哪里购买的此书。

7.单击Code Download。

在Packt Publishing的网站上,你也可以单击该书主页上的Code Files按钮来下载代码文件。可以在搜索框中输入图书的名称来访问其主页。请注意,你需要登录到你的Packt账户。

一旦文件下载完毕,请确保使用以下软件的最新版本来解压缩或提取文件夹。● Windows版WinRAR / 7-Zip。● Mac版Zipeg / iZip / UnRarX。● Linux版7-Zip / PeaZip。

该书的代码包也托管在GitHub上:https://github.com/packtpublishing/pythonmachin elearningblueprints。我们还有丰富的来自其他书籍的代码包和视频,位于https://github.com/ PacktPublishing/。去看一下吧!勘误

虽然我们已经采取一切谨慎的措施,以确保内容的准确性,但错误在所难免。如果你在我们的书中发现一个错误——也许在正文中,也许在代码中——请向我们报告,我们将非常感激。这样,你可以让其他读者避免挫折,并帮助我们改进本书的后续版本。如果你发现任何错误,请访问这个链接进行报告:http://www.packtpub.com/submit-errata,选择你的书,单击Errata Submission Form链接,然后输入错误的详细信息。一旦此勘误通过验证,你的提交将被接受,勘误信息将被上传到我们的网站或添加到任何该主题Errata部分现有的勘误表。

要查看以前提交的勘误,请访问https://www.packtpub.com/books/content/support并在搜索字段中输入书籍的名称。所需信息将出现在Errata部分中。盗版行为

在互联网上出现正版材料的盗版,是所有媒体面临的一个持续性的问题。在Packt,我们非常重视版权和许可的保护。如果你在互联网上,发现我们作品任何形式的非法副本,请立即向我们提供地址或网站名称,以便我们请求补偿。

请通过copyright@packtpub.com与我们联系,并提供疑似盗版材料的链接。

我们感谢你的帮助,这样可以保护我们的作者,并让我们继续为你提供宝贵的内容。疑问

如果你对本书的任何方面有问题,可以通过questions@packtpub.com与我们联系,我们将尽最大努力解决这个问题。第1章Python机器学习的生态系统

机器学习正在迅速改变我们的世界。作为人工智能的核心,我们几乎每天都会读到机器学习如何改变日常的生活。一些人认为它会带领我们进入一个风格奇异的高科技乌托邦;而另一些人认为我们正迈向一个高科技天启时代,将与窃取我们工作机会的机器人和无人机敢死队进行持久的战争。不过,虽然权威专家们可能会喜欢讨论这些夸张的未来,但更为平凡的现实是,机器学习正在快速成为我们日常生活的固定装备。随着我们微小但循序渐进地改进自身与计算机以及周围世界之间的互动,机器学习正在悄悄地改善着我们的生活。

如果你在Amazon.com这样的在线零售商店购物,使用Spotify或Netflix这样的流媒体音乐或电影服务,甚至只是执行一次Google搜索,你就已经触碰到了机器学习的应用。使用这些服务的用户会产生数据,这些数据会被收集、汇总并送入模型,而模型最终会为每个用户创建个性化的体验来完善服务。

想要深入到机器学习应用的开发中,现在就是一个理想的时机。你会发现,Python是开发这些应用的理想选择。Python拥有一个深度的、活跃的开发者社区,许多开发者也来自科学家的社区。这为Python提供了一组丰富的科学计算库。在本书中,我们将讨论并使用这些来自Python科学栈的库。

在接下来的章节中,我们将一步步学习如何建立各种不同的机器学习应用。但是,在真正开始之前,我们将使用本章剩下的篇幅讨论这些关键库的特性,以及如何准备能充分利用它们的环境。

我们将在本章中介绍以下主题。● 数据科学/机器学习的工作流程。● 工作流中每个阶段的库。● 设置你的环境。1.1 数据科学/机器学习的工作流程

打造机器学习的应用程序,与标准的工程范例在许多方面都是类似的,不过有一个非常重要的方法有所不同:需要将数据作为原材料来处理。数据项目成功与否,很大程度上依赖于你所获数据的质量,以及它是如何被处理的。由于数据的使用属于数据科学的领域,理解数据科学的工作流程对于我们也有所帮助:整个过程要按照图1-1中的顺序,完成六个步骤:获取,检查和探索,清理和准备,建模,评估和最后的部署。

在这个过程中,还经常需要绕回到之前的步骤,例如检查和准备数据,或者是评估和建模,但图1-1所示的内容可以描述该过程较高层次的抽象。图1-1

现在让我们详细讨论每一个步骤。1.1.1 获取

机器学习应用中的数据,可以来自不同的数据源,它可能是通过电子邮件发送的CSV文件,也可能是从服务器中拉取出来的日志,或者它可能需要构建自己的Web爬虫。数据也可能存在不同的格式。在大多数情况下,它是基于文本的数据,但稍后将看到,构建处理图像甚至视频文件的机器学习应用,也是很容易的。不管是什么格式,一旦锁定了某种数据,那么了解该数据中有什么以及没有什么,就变得非常重要了。1.1.2 检查和探索

一旦获得了数据,下一步就是检查和探索它们。在这个阶段中,主要的目标是合理地检查数据,而实现这一点的最好办法是发现不可能或几乎不可能的事情。举个例子,如果数据具有唯一的标识符,检查是否真的只有一个;如果数据是基于价格的,检查是否总为正数;无论数据是何种类型,检查最极端的情况。它们是否有意义?一个良好的实践是在数据上运行一些简单的统计测试,并将数据可视化。此外,可能还有一些数据是缺失的或不完整的。在本阶段注意到这些是很关键的,因为需要在稍后的清洗和准备阶段中处理它。只有进入模型的数据质量好了,模型的质量才能有保障,所以将这一步做对是非常关键的。1.1.3 清理和准备

当所有的数据准备就绪,下一步是将它转化为适合于模型使用的格式。这个阶段包括若干过程,例如过滤、聚集、输入和转化。所需的操作类型将很大程度上取决于数据的类型,以及所使用的库和算法的类型。例如,对于基于自然语言的文本,其所需的转换和时间序列数据所需的转换是非常不同的。全书中,我们将会看到一些转换的的例子。1.1.4 建模

一旦数据的准备完成后,下一阶段就是建模了。在这个阶段中,我们将选择适当的算法,并在数据上训练出一个模型。在这个阶段,有许多最佳实践可以遵循,我们将详细讨论它们,但是基本的步骤包括将数据分割为训练、测试和验证的集合。这种数据的分割可能看上去不合逻辑——尤其是在更多的数据通常会产生更好的模型这种情况下——但正如我们将看到的,这样做可以让我们获得更好的反馈,理解该模型在现实世界中会表现得如何,并避免建模的大忌:过拟合。1.1.5 评估

一旦模型构建完成并开始进行预测,下一步是了解模型做得有多好。这是评估阶段试图回答的问题。有很多的方式来衡量模型的表现,同样,这在很大程度上依赖于所用数据和模型的类型,不过就整体而言,我们试图回答这样的问题:模型的预测和实际值到底有多接近。有一堆听上去令人混淆的名词,例如根均方误差、欧几里德距离,以及F1得分,但最终,它们还是实际值与预估值之间的距离量度。1.1.6 部署

一旦模型的表现令人满意,那么下一个步骤就是部署了。根据具体的使用情况,这个阶段可能有不同的形式,但常见的场景包括将其作为另一个大型应用程序中的某个功能特性,一个定制的Web应用程序,甚至只是一个简单的cron作业。1.2 Python库和功能

现在,我们已经对数据科学工作流的每一步有了初步的理解,下面来看看在每一步中,存在哪些有用的Python库和功能可供选择。1.2.1 获取

访问数据常见的方式之一是通过REST风格的API接口,需要知道的库是Python Request库(http://www.python-requests.org/en/latest/)。它被称为给人类使用的HTTP,为API的交互提供了一个整洁和简单的方式。

让我们来看一个使用Requests进行交互的例子,它从GitHub的API中拉取数据。在这里,我们将对该API进行调用,并请求某个用户的starred库列表。import requests r = requests.get(r"https://api.github.com/users/acombs/starred") r.json()

这个请求将以JSON文档的形式,返回用户已经标记为starred的所有存储库以及它们的属性。图1-2是上述调用后输出结果的一个片段。图1-2

Requests库有数量惊人的特性——这里无法全部涵盖,我建议你看看上面提供的链接所指向的文档。1.2.2 检查

由于数据检查是机器学习应用开发中关键的一步,我们现在来深入了解几个库,它们将在此项任务中很好地为我们服务。1.Jupyter记事本

许多库有助于减轻数据检查过程的工作负荷。首先是带有IPython(http://ipython.org/)的Jupyter记事本。这是一个全面的、交互式的计算环境,对于数据探索是非常理想的选择。和大多数开发环境不同,Jupyter记事本是一个基于Web的前端(相对于IPython的内核而言),被分成单个的代码块或单元。根据需要,单元可以单独运行,也可以一次全部运行。这使得开发人员能够运行某个场景,看到输出结果,然后回到代码,做出调整,再看看所产生的变化——所有这些都无需离开记事本。图1-3是在Jupyter记事本中进行交互的样例。 图1-3

请注意,我们在这里做了一系列的事情,并不仅仅是和IPython的后端进行交互,而且也和终端shell进行了交互。这个特定的实例运行了Python 3.5的内核,但如果你愿意,也可以很容易地运行Python 2.X的内核。在这里,我们已经引入了Python os库,并进行了一次调用,找到当前的工作目录(单元#2),你可以看到输入代码单元格下方的输出。然后,我们在单元#3中使用os库改变了这个目录,但是在单元#4中停止使用os库,而是开始使用基于Linux的命令。这是通过在单元前添加!符号来完成的。在单元#6中可以看到,我们甚至能够将shell的输出保存到一个Python变量(file_two)。这是一个很棒的功能,使文件操作变成了一项简单的任务。

现在,让我们来看看使用该记事本所进行的一些简单的数据操作。这也是我们首次介绍另一个不可或缺的库:pandas。2.Pandas

Pandas是一个卓越的数据分析工具。根据Pandas的文档(http://pandas.pydata.org/pandas-docs/version/0.17.1/):

它有一个更广泛的目标,就是成为任何语言中,最强大和灵活的开源数据分析/操作工具。

即使它还没有达到这个目标,也不会差得太远。现在让我们来看看。import os import pandas as pd import requests PATH = r'/Users/alexcombs/Desktop/iris/' r= requests.get('https://archive.ics.uci.edu/ml/machine-learning-databases/iri s/iris.data') with open(PATH + 'iris.data', 'w') as f: f.write(r.text) os.chdir(PATH) df = pd.read_csv(PATH + 'iris.data', names=['sepal length', 'sepal width', 'petal length', 'petal width', 'class']) df.head()

前面的代码和屏幕截图如图1-4所示,我们已经从https://archive.ics.uci.edu/ml/datasets/Iris下载了一个经典的机器学习数据集:iris.data,并将其写入iris目录。这实际上是一个CSV文件,通过Pandas,我们进行了一个调用并读取了该文件。我们还增加了列名,因为这个特定的文件缺一个标题行。如果该文件已经包含了一个标题行,Pandas会自动解析并反映这一点。和其他CSV库相比,Pandas将其变为一个简单的操作。图1-4

解析文件只是该库的一个小功能。对适合于单台机器的数据集而言,Pandas是个终极的工具,这有点像Excel。就像流行的电子表格程序,操作的基本单位是表格形式的数据列和行。在Pandas的术语中,数据列称为系列(Series),而表格称为数据框(DateFrame)。

使用之前截屏中同样的iris数据框,让我们来看看几个常见的操作。  df['sepal length']

前面的代码生成图1-5的输出。图1-5

第一个操作是通过列名,从数据框中选择某一列。执行数据切片的另一种方式是使用.ix[row,column]标注。让我们使用下面这个标注,来选择前两列和前四行。  df.ix[:3, :2]

前面的代码生成图1-6的输出。 

使用.ix标注和Python列表切片的语法,我们能够选择该数据框中的一小片。现在,让我们更进一步,使用列表迭代器并只选择描述width的列。  df.ix[:3, [x for x in df.columns if 'width' in x]]

前面的代码生成图1-7所示的输出。 图1-6图1-7

我们在这里所做的是创建一个列表,该列表是所有列的一个子集。前面的df.columns返回所有列的列表,而我们的迭代使用了一个条件查询,只选择标题中含有width字样的列。显然,在这种情况下,我们可以很容易地拼写出希望在列表中出现的列,但是这里展示了处理大规模数据集时该库所具有的能力。

我们已经看到了,如何基于其在数据框中的位置,来选择数据的分片,现在来看看另一种选择数据的方法。这次,我们将根据某些特定的条件,来选择数据的一个子集。我们首先列出所有可用的唯一类,然后选择其中之一。  df['class'].unique()

前面的代码生成图1-8的输出。图1-8df[df['class']=='Iris-virginica']

在图1-9所示最右侧的一列中,我们可以看到数据框只包含Iris-virginica类的数据。事实上,选择之后图1-11中数据框的大小是50行,比图1-10中原来的150行要小一些。df.count() df[df['class']=='Iris-virginica'].count() 图1-9图1-10图1-11

我们还可以看到,在左侧的索引保留了原始行号。现在,可以将这些数据保存为一个新的数据框并重置索引,如下面的代码和截图1-12所示。  virginica = df[df['class']=='Iris-virginica'].reset_index(drop=True)virginica 图1-12

我们通过在某个列上放置条件来选择数据,现在来添加更多的条件。我们将回到初始的数据框,并使用两个条件选择数据。df[(df['class']=='Iris-virginica')&(df['petal width']>2.2)]

上述代码生成图1-13的输出。图1-13

数据框现在只包含来自Iris-virginica类、而且花瓣宽度大于2.2的数据。

现在,让我们使用Pandas,从虹膜数据集中获取一些快速的描述性统计数据。  df.describe()

上述代码生成图1-14的输出。图1-14

随着数据框的.describe()方法被调用,我们收到了各相关列的描述性统计信息(请注意,类别信息被自动删除了,因为它在这里是不相关的)。如果想要更为详细的信息,还可以传入自定义的百分比。df.describe(percentiles=[.20,.40,.80,.90,.95])

上述代码生成图1-15的输出。图1-15

接下来,让我们检查这些特征之间是否有任何相关性。这可以通过在数据框上调用.corr()来完成。 df.corr()

上述代码生成图1-16的输出。图1-16

默认地,系统返回每个行-列对中的Pearson相关系数。通过传递方法的参数,还可以切换到Kendall's tau或Spearman's秩相关系数(例如,.corr(method="spearman")或.corr(method="kendall"))。3.可视化

目前为止,我们已经看到如何选择数据框的某一部分,并从数据中获取汇总的统计信息,现在让我们学习如何通过可视化的方式来观测数据。不过首先要回答的问题是,为什么要花费心思进行可视化的视察呢?来看一个例子就能明白这是为什么了。

表1-1展示了四组不同序列的x值和y值的汇总统计。表1-1序列的x和y取值x的平均值9y的平均值7.5序列的x样本方差11序列的y样本方差4.1x和y之间的相关性0.816y=3.00+0.500x回归线

基于四组序列拥有相同的汇总统计,我们可能会认为这些系列的可视化看上去也是相似。我们当然是错误的,非常错误。这四个序列是安斯库姆四重奏的一部分,他们被刻意制造出来用于说明可视化数据检查的重要性。每个序列绘制在图1-17中。

安斯库姆四重奏的网址:https://en.wikipedia.org/wiki/Anscombe%27squartet。

显然,经过可视化的观察之后,我们不再会认为这些数据集是相同的。所以,现在我们能理解可视化的重要性了,下面来看看一对用于可视化的、很有价值的Python库。图1-17Matplotlib库

我们将要看到的第一个库是matplotlib。这是Python绘图库的鼻祖了。最初人们创建它是为了仿效MATLAB的绘图功能,现在它自己已经发展成为特性完善的库了,并拥有超多的功能。对于那些没有MATLAB背景的使用者,可能很难理解所有这些部件是如何共同协作来创造图表的。

我们将所有的部件拆分为多个逻辑模块,便于大家理解都发生了些什么。在深入理解matplotlib之前,让我们先设置Jupyter记事本,以便看清每个图像。要做到这一点,需要将以下几行添加到import声明中。import matplotlib.pyplot as pltplt.style.use('ggplot')%matplotlib inline import numpy as np

第一行引入了matplotlib,第二行将风格设置为近似R中的ggplot库(这需要matplotlib 1.41),第三行设置插图,让它们在记事本中可见,而最后一行引入了numpy。本章稍后,我们将在一些操作中使用numpy。

现在,让我们使用下面的代码,在鸢尾花Iris数据集上生成第一个图:fig, ax = plt.subplots(figsize=(6,4)) ax.hist(df['petal width'], color='black'); ax.set_ylabel('Count', fontsize=12) ax.set_xlabel('Width', fontsize=12) plt.title('Iris Petal Width', fontsize=14, y=1.01)

前面的代码生成图1-18中的输出。图1-18

即使是在这个简单的例子中,也发生了很多事情,让我们来逐行分析。第一行创建了宽度为6英寸和高度为4英寸的一个插图。然后,我们通过调用.hist()并传入数据,依照iris数据框绘制了花瓣宽度的直方图。这里还将直方图中柱子的颜色设置为black(黑色)。接下来的两行分别在y轴和x轴上放置标签,最后一行为全图设置了标题。其中使用y轴的参数调整了标题在y轴方向相对于图片顶部的位置,并微微增加了默认字体的大小。这使得我们从花瓣宽度的数据得到了一个很漂亮的直方图。现在,让我们进一步扩展,为iris数据集的每一列生成直方图。fig, ax = plt.subplots(2,2, figsize=(6,4)) ax[0][0].hist(df['petal width'], color='black'); ax[0][0].set_ylabel('Count', fontsize=12) ax[0][0].set_xlabel('Width', fontsize=12) ax[0][0].set_title('Iris Petal Width', fontsize=14, y=1.01) ax[0][1].hist(df['petal length'], color='black'); ax[0][1].set_ylabel('Count', fontsize=12) ax[0][1].set_xlabel('Lenth', fontsize=12) ax[0][1].set_title('Iris Petal Lenth', fontsize=14, y=1.01) ax[1][0].hist(df['sepal width'], color='black'); ax[1][0].set_ylabel('Count', fontsize=12) ax[1][0].set_xlabel('Width', fontsize=12) ax[1][0].set_title('Iris Sepal Width', fontsize=14, y=1.01) ax[1][1].hist(df['sepal length'], color='black'); ax[1][1].set_ylabel('Count', fontsize=12) ax[1][1].set_xlabel('Length', fontsize=12) ax[1][1].set_title('Iris Sepal Length', fontsize=14, y=1.01) plt.tight_layout()

上述代码的输出显示如图1-19所示。图1-19

显然,这不是最有效的编码方法,但是对于展示matplotlib是如何工作的很有用处。请注意,我们现在是通过ax数组来绘制四个子插图,而不是之前例子中的单一子插图对象ax。新增加的代码是调用plt.tight_layout(),该方法将很好地自动调整子插图,以避免排版上显得过于拥挤。

现在来看看matplotlib所提供的一些其他类型的画图模式。一个有用的类型是散点图。这里,我们将在x轴和y轴分布绘画花瓣宽度和花瓣长度。fig, ax = plt.subplots(figsize=(6,6)) ax.scatter(df['petal width'],df['petal length'], color='green') ax.set_xlabel('Petal Width') ax.set_ylabel('Petal Length') ax.set_title('Petal Scatterplot')

上述的代码生成了图1-20所示的输出。图1-20

如前所述,我们可以添加多个子插图,来检视每个方面。

我们可以考察的另一种类型是简单的线图。这里来看看花瓣长度的插图。fig, ax = plt.subplots(figsize=(6,6)) ax.plot(df['petal length'], color='blue') ax.set_xlabel('Specimen Number') ax.set_ylabel('Petal Length') ax.set_title('Petal Length Plot')

上述的代码生成了图1-21所示的输出。

基于这个简单的线图,我们已经可以看到对于每个类别存在鲜明的长度差别——请记住样本数据集在每个类别拥有50个排序的样例。这就告诉我们,花瓣长度很可能是用于区分类别的一个有用特征。图1-21

让我们来看看matplotlib库中最后一个类型的图表:条形图。这也许是最为常见的图表之一。这里将使用三类鸢尾花中每个特征的平均值绘制一个条形图,而且为了让其更有趣,我们将使用堆积条形图,它附带了若干新的matplotlib特性。fig, ax = plt.subplots(figsize=(6,6)) bar_width = .8 labels = [x for x in df.columns if 'length' in x or 'width' in x] ver_y = [df[df['class']=='Iris-versicolor'][x].mean() for x in labels] vir_y = [df[df['class']=='Iris-virginica'][x].mean() for x in labels] set_y = [df[df['class']=='Iris-setosa'][x].mean() for x in labels] x = np.arange(len(labels)) ax.bar(x, vir_y, bar_width, bottom=set_y, color='darkgrey') ax.bar(x, set_y, bar_width, bottom=ver_y, color='white') ax.bar(x, ver_y, bar_width, color='black') ax.set_xticks(x + (bar_width/2)) ax.set_xticklabels(labels, rotation=-70, fontsize=12); ax.set_title('Mean Feature Measurement By Class', y=1.01) ax.legend(['Virginica','Setosa','Versicolor'])

上述的代码生成图1-22所示的输出。图1-22

为了生成条形图,我们需要将x和y的值传递给.bar()方法。在这种情况下,x值将只是我们感兴趣的特征的长度的数组,在这个例子中是4,或者是数据框中列的数量。函数np.arange()是产生这个数值的简单方法,但也可以轻松地手动输入这个数组。由于我们不想在x轴显示1到4,因此调用了.set_xticklabels()方法并传入想要显示的列名。为了让x轴的标签对齐,我们还需要调整标签之间的间隔。这就是为什么将xticks设置为x加上bar_width值的一半,而我们先前已经将bar_width设置为0.8。这里y值来自每个类别中特征的平均值。然后,通过调用.bar()绘制每个插图。需要注意的是,我们为每个序列传入一个bottom参数,这个参数将该序列的y点最小值设置为其下面那个序列的y点最大值。这就能创建堆积条形图。最后,添加了一个图例来描述每个序列。按照从顶部到底部条形放置的顺序,我们依次在图例中插入了相应的名称。Seaborn库

我们接下来将看到的可视化库被称为seaborn(http://stanford.edu/~mwaskom/software/seaborn/index.html)。它是专门为统计可视化而创建的库。事实上,seaborn可以和pandas数据框完美地协作,框中的列是特征而行是观测的样例。这种数据框的风格被称为整洁的数据,而且它是机器学习应用中最常见的形式。

现在让我们来看看seaborn的能力。import seaborn as sns sns.pairplot(df, hue="class")

仅仅通过这两行代码,我们就可以得到图1-23所示的输出。图1-23

就在刚刚我们详细地讨论了matplotlib错综复杂的细微之处,而生成这张图的简单性却显而易见。仅仅使用了两行代码,所有的特征都已经被绘画出来,彼此对照并标上了正确的标签。那么,当seaborn使得这种可视化变得如此简单的时候,学习matplotlib是在浪费时间吗?幸运的是,情况并非如此,seaborn是建立在matplotlib之上的。事实上,我们可以使用所学的matplotlib知识来修改并使用seaborn。让我们来看看另一个可视化的例子。fig, ax = plt.subplots(2, 2, figsize=(7, 7)) sns.set(style='white', palette='muted') sns.violinplot(x=df['class'], y=df['sepal length'], ax=ax[0,0]) sns.violinplot(x=df['class'], y=df['sepal width'], ax=ax[0,1]) sns.violinplot(x=df['class'], y=df['petal length'], ax=ax[1,0]) sns.violinplot(x=df['class'], y=df['petal width'], ax=ax[1,1]) fig.suptitle('Violin Plots', fontsize=16, y=1.03) for i in ax.flat: plt.setp(i.get_xticklabels(), rotation=-90) fig.tight_layout()

以上代码行生成图1-24所示的输出。图1-24

这里,我们为4个特征分别生成了小提琴图。小提琴图显示了特征的分布情况。例如,我们可以很容易地看到类别irissetosa的花瓣长度高度聚集在1~2厘米之间,而类别iris-virginica分散在4~7厘米之间。我们还可以看到,之前在构建matplotlib图形时使用了许多相同的代码。这里主要的区别在于加入了sns.plot()调用来取代之前的ax.plot()调用 。我们还使用了fig.suptitle()方法,在所有的子图上添加了一个总标题,而不是在每个单独的子图上各自添加标题。另一个明显的添加部分,是每个子图的遍历取代了之前xticklabels的轮换。我们调用ax.flat(),遍历每个子图的轴,并使用.setp()设置特定的属性。这可以让我们不再需要像之前matplotlib子图代码那样,单独地敲打ax[0][0]…ax[1][1],并设置属性。

我们在这里使用的图是一个很好的开始,但是你可以使用matplotlib和seaborn创建上百种不同风格的图形。我强烈建议深入研究这两个库的文档,这将是非常值得的。1.2.3 准备

我们已经学到了很多有关检查数据的内容,现在让我们开始学习如何处理和操作数据。这里你将了解 pandas的Series.map()、Series.apply()、DataFrame.apply()、DataFrame.applymap()和 DataFrame.groupby()方法。这些对于处理数据而言是非常有价值的,而且在特征工程的机器学习场景下特别有用,我们将在后面的章节详细地讨论这个概念。1.Map

Map方法适用于序列数据,所以在我们的例子中将用它来转变数据框的某个列,它就是一个pandas的序列 。假设我们觉得类别的名字太长了,并且希望使用特殊的3字母代码系统对其进行编码。为了实现这点,我们将使用map方法并将一个Python字典作为其参数。这里将为每个单独的鸢尾花类型传入替换的文本。df['class'] = df['class'].map({'Iris-setosa': 'SET', 'Iris-virginica': 'VIR', 'Iris-versicolor': 'VER'}) df

前面的代码生成图1-25的输出。图1-25

下面来看看这里做了些什么。我们在现有class列的每个值上运行了map的方法。由于每个值都能在Python字典中找到,所以它会被添加到被返回的序列。我们为返回序列赋予了相同的class名,所以它替换了原有的class列。如果我们选择了一个不同的名字,例如short class,那么这一列会被追加到数据框,然后我们将有初始的class列外加新的short class列。

我们还可以向map方法传入另一个序列或函数,来执行对某个列的转变,但这个功能在apply 方法也是可用的,下面这节会讨论该方法。字典的功能是map方法所独有的,这也是选择map而不是apply进行单列转变的最常见原因。现在让我们来看看apply方法。2.Apply

Apply的方法让我们既可以在数据框上工作,也可以在序列上工作。我们将从一个也能使用map的例子开始,然后再讨论只能使用apply的示例。

继续使用iris数据框,让我们根据花瓣的宽度来创建新的列。之前我们看到花瓣宽度的平均值为1.3。现在,在数据框中创建一个新的列——宽花瓣,它包含一个基于petal width列的二进制值。如果花瓣宽度等于或宽于中值,那么我们将其编码为1,而如果它小于中值,我们将其编码为0。为了实现这点,这里将在petal width这列使用apply方法。df['wide petal'] = df['petal width'].apply(lambda v: 1 if v >= 1.3 else 0) df

前面的代码生成图1-26所示的输出。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载