scikit-learn机器学习(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-02 04:21:33

点击下载

作者:(美)加文·海克(Gavin Hackeling)

出版社:人民邮电出版社

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

scikit-learn机器学习(第2版)

scikit-learn机器学习(第2版)试读:

前言

近些年来,机器学习已经成为大家热衷的话题。在机器学习领域,各式各样的应用层出不穷。其中的一些应用(例如垃圾邮件过滤器)已经被广泛使用,却反而因为太成功而变得平淡无奇。很多其他的应用直到近些年才纷纷出现,它们无一不在昭示着机器学习带来的无限可能。

在本书中,我们将分析一些机器学习模型和学习算法,讨论一些常用的机器学习任务,同时也会学习如何衡量机器学习系统的性能。我们将使用一个用Python编程语言编写的类库scikit-learn,它包含了最新机器学习算法的实现,其API也很直观通用。本书涵盖内容

第1章,机器学习基础。本章给出了机器学习的定义:机器学习是对如何通过从经验中学习来改善工作性能的研究和设计。该定义提纲挈领地引出了后续的章节,在后续的每个章节中,我们都将分析一种机器学习模型,将其运用于现实工作中,并衡量其性能。

第2章,简单线性回归。本章讨论了将单个特征同连续响应变量联系起来的模型。我们将学习代价函数,以及使用范式函数优化模型的相关知识。

第3章,用K-近邻算法分类和回归。本章介绍了一个用于分类和回归任务的简单的非线性模型。

第4章,特征提取。本章介绍了将文本、图片以及分类变量表示为机器学习模型可用特征的技术。

第5章,从简单线性回归到多元线性回归。本章讨论了简单线性回归模型的扩展——多元线性回归模型,它能在多个特征上对连续响应变量进行回归。

第6章,从线性回归到逻辑回归。本章将多元线性回归模型做了进一步推广,并介绍了一个用于二元分类任务的模型。

第7章,朴素贝叶斯。本章讨论了贝叶斯定理和朴素贝叶斯分类器,同时对生成模型和判别模型进行了对比。

第8章,非线性分类和决策树回归。本章介绍了决策树这种用于分类和回归任务的简单模型。

第9章,集成方法:从决策树到随机森林。本章讨论了3种用于合并模型的方法,它们分别是套袋法(bagging)、推进法(boosting)和堆叠法(stacking)。

第10章,感知机。本章内容介绍了一种用于二元分类的简单在线模型。

第11章,从感知机到支持向量机。本章讨论了一种可用于分类和回归的强大的判别模型——支持向量机,同时还介绍了一种能有效将特性投影到高维度空间的技巧。

第12章,从感知机到人工神经网络。本章介绍了一种建立在人工神经元图结构基础上,用于分类和回归任务的强大的非线性模型。

第13章,K-均值算法。本章讨论了一种在无标记数据中发现结构的算法。

第14章,使用主成分分析降维。本章讨论了一种用于降低数据维度以缓和维度灾难的方法。准备工作

运行本书中的例子需要Python版本2.7或者3.3,以及pip—PyPA工作组推荐使用的Python包安装工具。书中的例子预期在Jupyter notebook环境中或者IPython解释器环境中运行。第1章详细说明了如何在Ubuntu、MacOS和Windows环境下安装scikit-learn 0.18.1版本类库及其依赖项目和其他类库。目标读者

本书的目标读者是希望了解机器学习算法是如何运行,想培养机器学习使用直觉的软件工程师。本书的目标读者也包含希望了解scikit-learn类库API的数据科学家。读者不需要熟悉机器学习基础和Python编程语言,但具备相关基础对阅读本书很有帮助。排版约定

在本书中,你会发现一些不同的文本样式,用以区别不同种类的信息。下面对一些样式及其意义举例进行说明。

代码片段、数据库表名、目录名、文件名、文件扩展名、路径名、URL、用户输入、以及推特用户名会如下印刷:“由于scikit-learn不是一个有效的Python包名称,该类库被命名为sklearn”。# In[1]:import sklearnsklearn.__version__# Out[1]:'0.18.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、测试、前端、网络技术等。异步社区微信服务号第1章 机器学习基础

在本章中,我们将回顾机器学习中的基础概念,比较监督学习和无监督学习,讨论训练数据、测试数据和验证数据的用法,并了解机器学习应用。最后,我们将介绍scikit-learn库,并安装后续章节中需要的工具。1.1 定义机器学习

长久以来,我们的想象力一直被那些能够学习和模仿人类智慧的机器所吸引。尽管具有一般人工智能的机器(比如阿瑟· 克拉克笔下的HAL和艾萨克· 阿西莫夫笔下的Sonny)仍然没有实现,但是能够从经验中获取新知识和新技能的软件正在变得越来越普遍。我们使用这些机器学习程序去寻找自己可能喜欢的新音乐,找到自己真正想在网上购买的鞋子。机器学习程序允许我们对智能手机下达命令,并允许用恒温控制器自动设置温度。机器学习程序可以比人类更好地破译书写凌乱的邮寄地址,并更加警觉地防止信用卡欺诈。从研发新药到估计一个头条新闻的页面访问量,机器学习软件正在成为许多行业的核心部分。机器学习甚至已经侵占了许多长久以来一直被认为只有人类能涉及的领域,例如撰写一篇关于杜克大学篮球队输给了北卡大学篮球队的体育专栏报道。

机器学习是对软件工件的设计和学习,它使用过去的经验去指导未来的决策。机器学习是对从数据中学习的软件的研究。机器学习的基础目标是归纳,或者从一种未知规则的应用例子中归纳出未知规则。机器学习的典型例子是垃圾邮件过滤。通过观察已经被标记为垃圾邮件或非垃圾邮件的电子邮件,垃圾邮件过滤器可以分类新消息。研究人工智能的先锋科学家亚瑟·萨缪尔曾说过机器学习是“给予计算机学习的能力而无须显式地编程的研究”。在20世纪50年代到20世纪60年代之间,萨缪尔开发了多个下棋程序。虽然下棋的规则很简单,但是要战胜技艺高超的对手需要复杂的策略。萨缪尔从来没有显式地编程过这些策略,而是通过几千次比赛的经验,程序学习了复杂的行为以此打败了许多人类对手。

计算机科学家汤姆·米切尔对机器学习给出了一个更加正式的定义:“如果一个程序的性能在‘T’中体现,通过‘P’来衡量,并通过经验‘E’来提升,那么该程序可以被视为针对一些任务类型‘T’和性能衡量‘P’从经验‘E’中进行学习”。例如,假设你有一个图片集合,每一张图片描绘了一只狗或一只猫。任务是将图片分为狗图片类和猫图片类,而程序可以通过观察已经被分类好的图片来学习执行这个任务,同时它可以通过计算分类图片的正确比例来提升性能。

我们将使用米切尔关于机器学习的定义来组织本章内容。首先,我们将讨论经验的类型,包括监督学习和无监督学习。接着,我们将讨论可以用机器学习系统解决的常见任务。最后,我们将讨论能够用于衡量机器学习系统性能的标准。1.2 从经验中学习

机器学习系统经常被描述为在人类监督或无监督之下从经验中学习。在监督学习问题中,一个程序会通过标记的输入和输出进行学习,并从一个输入预测一个输出。也就是说,程序从“正确答案”的例子中学习。在无监督学习中,一个程序不会从标记数据中学习。相反,它尝试在数据中发现模式。例如,假设你已经收集了描述人身高体重的数据。一个无监督学习的例子是将数据划分到不同的组中。一个程序可能会产出对应到男性和女性,或者儿童和成人的组。现在假设数据也标记了性别。一个监督学习的例子是归纳出一个规则,基于一个人的身高和体重来预测一个人是男性还是女性。我们将在后面的章节中讨论监督学习和无监督学习的算法和例子。

监督学习和无监督学习可以被认为是一个范围的两端。一些类型的问题,被称为半监督学习问题,这些问题同时使用监督学习的数据和无监督学习的数据,位于监督学习和无监督学习之间。强化学习靠近监督学习一端。和无监督学习不同,强化学习程序不会从标记的输出对中进行学习。相反,它从决策中接收反馈,但是错误并不会显式地被更正。例如,一个学习去玩像超级玛丽兄弟这样的横向卷轴游戏的强化学习程序,当完成一个关卡或者达到一个特定分数时,可能会接收到一个奖励,而当失去一次生命时会受到惩罚。然而,这样的监督反馈并不会附带一个特定的决策去指挥角色跑动,躲开栗子怪,或者捡起一朵火焰花。我们将主要关注监督学习和无监督学习,因为这两个类别包含了最常见的机器学习问题。在下一节中,我们将更细致地审阅监督学习和无监督学习。

一个监督学习程序从标记输出的例子中进行学习,这些输出例子应该由对应的输入产出。一个机器学习程序的输出有很多名字,在机器学习中汇集了一些学科,许多学科都会使用自己的术语。在本书中,我们将把输出称为响应变量。响应变量的其他名字包括“依赖变量”“回归变量”“标准变量”“测定变量”“应答变量”“被解释变量”“输出变量”“实验变量”“标签”和“输出变量”。类似的,输入变量也有很多名字。在本书中,我们将输入变量称为特征,它们代表的现象称为解释变量。解释变量的其他名字包括“预测器”“回归器”“控制变量”和“暴露变量”。响应变量和解释变量可以是实数值或离散值。

组成监督学习经验的实例集合称为一个训练集。一个用于衡量程序性能的实例集合称为一个测试集。响应变量可以被看作是由解释变量引发问题的回答,监督学习问题会从一个针对不同问题回答的集合中进行学习。也就是说,监督学习程序会被提供正确的答案,而它需要学习去正确地回答没见过的类似问题。1.3 机器学习任务

两种最常见的监督机器学习任务是分类和回归。在分类任务中,程序必须学习去从一个或多个特征去预测一个或多个响应变量的离散值。也就是说,程序必须为新观测值预测最可能的分类、类别或者标签。分类的应用包括预测一只股票的价格会上涨或下跌,或者决定一篇新闻文章属于政治主题板块还是休闲娱乐板块。在回归问题中,程序必须从一个或多个特征预测一个或多个连续响应变量值。回归问题的例子包括预测一个新产品的销售收入,或者基于一个职位的描述预测其薪水。和分类问题一样,回归问题也需要监督学习。

一个常见的无监督学习任务是在数据集内发现互相关联的观测值群组,称之为聚类。该项任务称为聚类或者聚类分析,会基于一些相似性衡量标准,把观测值放入和其他群组相比相互之间更加类似的群组中。聚类经常用于探索一个数据集。例如,对于一个电影评论集合,一个聚类算法可找出正向评价和负向评价。系统不会将聚合的类标记为正向或者负向。由于缺乏监督,系统只能通过一些衡量标准来判断聚合的观测值相互之间很类似。聚类的一个常见应用是在市场中为一个产品发现客户群体。通过了解特定客户群体的共同属性,销售人员可以决定应该注重销售活动的哪个方面。聚类也应用于网络广播服务中。对于一个歌曲集合,聚类算法可以根据歌曲的特征将歌曲划分为不同的分组。通过使用不同的相似性衡量标准,同样的聚类算法可以通过歌曲的音调,或者通过歌曲中包含的乐器来为歌曲划分不同的组。

降维是另一种常见的使用无监督学习完成的任务。一些问题可能包含数千或者上百万个特征,这会导致计算能力的极大消耗。另外,如果一些特征涉及噪声或者和潜在的关系无关,程序的泛化能力将会减弱。降维是发现对响应变量变化影响最大的特征的过程。降维还可以用于数据可视化。通过房屋面积预测房屋价格这样的回归问题的可视化很简单,房屋的面积可以作为图的x轴,价格可以作为y轴。当为房屋价格回归问题添加第二个特征以后,可视化依然很简单,房屋的浴室数量可以作为z轴。然而,对一个包含上千个特征的问题,可视化几乎不可能完成。1.4 训练数据、测试数据和验证数据

正如前面提到的,一个训练集是一个观测值集合。这些观测值组成了算法用来学习的经验。在监督学习问题中,每一个观测值包含一个观测响应变量和一个或多个观测解释变量特征。测试集是一个类似的观测值集合。测试集被用于使用一些衡量标准来评估模型性能。不把训练集中的观测值包含在测试集中是非常重要的。如果测试集中包含来自训练集中的例子,我们很难评估算法是真的从训练集中学习到了泛化能力,还是只是简单地记住了训练例子。一个能够很好地泛化的程序可以有效地执行一个包含新数据的任务。相反,一个通过学习过于复杂的模型记住了训练数据的程序可以准确地预测训练集中的响应变量,但是无法预测新例子中的响应变量值。对训练集产生记忆称为过拟合。一个对观测值产生记忆的程序会记住训练数据中保持一致的关系和结构,因此并不能很好地完成任务。平衡泛化能力和记忆能力对很多机器学习算法来说是一个常见问题。在后面的章节中我们将讨论正则化,它可以应用于很多模型来减少过拟合。

除了训练数据和测试数据,我们经常需要第三个观测值集合,称为验证集或者保留集。验证集常用来微调被称为超参数的变量,超参数用于控制算法如何从训练数据中学习。在现实世界中程序依然会在测试集上评估,以提供对其性能的估计。由于程序已经被微调过,可以以某种方式从训练数据中学习以提高在验证数据上的得分,因此验证集不应该用来估计现实世界的性能。在现实世界中程序并不会具备在验证数据上的优势。

通常一个监督观测值集合会被划分为训练集、验证集和测试集。划分的每个部分的数量并不会作要求,根据可用数据的数量划分的比例将会有所不同。通常来说,训练集占50%~75%,测试集占10%~25%,剩下的则是验证集。

一些训练集可能只包含几百个观测值,其他有的则可能包含数百万个。廉价的存储设备,增强的网络连通性,以及带有传感器智能手机的普及,造就了现代大数据“帝国”,或者说包含数以百万甚至数以十亿计的实例训练集。虽然本书不会处理需要在几十台乃至数百台计算机上并行处理的数据集,许多机器学习算法预测能力的提升依赖于训练数据数量的增加。然而,机器学习算法同时遵循格言“无用数据入、无用数据出”。假如一个学生通过阅读一本错误百出、令人困惑的大部头教材来准备考试,他的考试成绩并不会比阅读篇幅短小但内容质量较高的教材的学生的成绩好。类似地,在现实世界中,一个算法如果在一个包含噪声、不相关或者错误标签数据的集上进行训练,其表现并不会比一个在包含更能代表问题的小数据集上训练的模型表现好。

许多监督训练数据集需要通过手动或者半自动处理来准备。在一些领域,创建一个大型监督数据集代价不菲。幸运的是,scikit-learn类库包含了一些数据集,这让开发者可以专注于模型实验。在开发过程中,尤其是当训练数据很缺乏时,一种称为交叉验证的实战技巧可用于在同样的数据上训练和验证一个模型。在交叉验证过程中,训练数据被分割为几部分。模型在除了一个部分以外的数据上进行训练,并在剩余的部分上测试。划分被转换几次以便模型可以在全部数据上训练和评估。在现实世界中,每个划分上的模型性能估计得分均值会优于单一的训练/测试划分。图1.1描绘了5-部分,或5-重交叉验证:图1.1

原始数据集被划分为5个数量相等的子集,标记A~E。最开始模型在划分B~E上训练,在划分A上测试。在下一次迭代中,模型在划分A、C、D和E上进行训练,在划分B上测试。接着划分被转换直到模型已经在所有的划分上进行训练和测试。相比在单一模型划分上进行测试,交叉验证能为模型提供更准确的性能预估。1.5 偏差和方差

许多标准被用来衡量一个模型是否能有效地通过学习去完成任务。对于监督学习问题,许多性能标准能衡量预测误差的量。预测误差有两个根本原因:模型的偏差和模型的方差。假设你有许多独一无二但是都代表了总体的训练集。一个具有高偏差的模型,无论是在哪个训练集上学习,对于一个输入都将产出类似的误差。模型偏差代表我们对真实关系的假设和在训练数据中证明的关系之间的差别。相反,一个具有高方差的模型,对一个输入产出的不同误差依赖于模型学习的训练集。一个具有高偏差的模型是不灵活的,但是一个具有高方差的模型可能会很灵活以至于模型可能会对训练集中的噪声进行建模。也就是说,一个具有高方差的模型过拟合训练数据,而一个具有高偏差的模型则欠拟合训练数据。将偏差和方差可视化为射向标靶的飞镖对理解其含义很有帮助。如图1.2所示,每一个飞镖相当于一个预测,它通过一个模型每次在不同的数据集上进行训练来射向标靶。一个具有高偏差低方差的模型射出的飞镖将紧密聚集在一起,但是却可能远离靶心。一个具有高偏差高方差的模型射出的飞镖将布满整个标靶,飞镖远离靶心且相互之间距离很大。一个具有低偏差高方差的模型射出的飞镖不会聚集但是却都很靠近靶心。最后,一个具有低偏差低方差的模型射出的飞镖将聚集在靶心周围。图1.2

理想情况下,一个模型应该具有低方差和低偏差,但是减小其中一个经常会增大另一个,这个现象被称为偏差方差权衡。在本书中,我们将讨论模型的偏差和方差。

无监督学习问题没有一个误差指标能用于衡量,相反,无监督学习问题的性能指标可以衡量在数据中发现结构的一些属性,例如聚类内部和聚类之间的距离。

大部分性能衡量只能对一种特定类型任务(例如分类和回归)计算。在现实世界中,机器学习系统应该使用能够代表产生错误的代价的性能指标来评估。尽管这条规则看起来似乎很明显,但是下面的例子使用一个性能衡量指标来描述该规则,这条规则适用于一般的任务,而不是只适用于该任务。

考虑一个分类任务,一个机器学习系统观察肿瘤并对肿瘤是恶性还是良性做出预测。准确率或者预测正确的实例的比例,是一种衡量程序性能的直观标准。尽管准确率确实能够用来衡量程序性能,但是它无法区分出恶性被分类为良性,还是良性被分类为恶性。在一些应用中,与所有误差类型相关联的代价可能是相同的。然而在这个问题中,没有能分辨出一个恶性肿瘤是一种比错误地将良性肿瘤识别为恶性更严重的错误。

我们可以衡量每种可能的预测输出结果来创建不同的分类器性能视图。当系统正确地将一个肿瘤分类为恶性时,预测结果称为真阳性。当系统错误地将一个良性肿瘤分类为恶性时,预测结果称为假阳性。类似地,一个假阴性代表错误地预测肿瘤为良性,一个真阴性代表正确地预测肿瘤是良性。注意到阴性和阳性仅仅作为二元标签来使用,同时也不会去评判它们所代表的现象。在这个例子中,恶性肿瘤被编码为阴性或阳性都不重要,只要它在过程中保持一致。真和假、阳和阴可以用来计算一些常见的分类性能衡量标准,包括准确率、精准率和召回率。

准确率使用公式1.1来计算,在公式中TP是真阳性的数量,TN是真阴性的数量,FP是假阳性的数量,FN是假阴性的数量:(公式1.1)

精准率是被预测为恶性的肿瘤确实为恶性的比例。精准率可以使用公式1.2来计算:(公式1.2)

召回率是系统识别出恶性肿瘤的比例。召回率通过公式1.3来计算:(公式1.3)

在这个例子中,精准率用来衡量被预测为恶性的肿瘤实际上也是恶性的比例。召回率用来衡量真正的恶性肿瘤被发现的比例。

精准率和召回率的衡量方式可以说明,一个高准确率的分类器实际上并不能探测到大部分恶性肿瘤。如果测试集中的大部分肿瘤都是良性的,即使是从未探测出恶性肿瘤的分类器也会拥有高准确率。而另一个低准确率高召回率的分类器可能会更适合这个任务,因为它能探测出更多的恶性肿瘤。

许多用于分类器的性能衡量指标可以被使用。我们将在后面的章节中讨论更多的指标,包括对于多标签分类问题的指标。在下一章中,我们将讨论一些对于回归任务的常用性能衡量方式。本书内容也会涉及无监督任务的性能,我们将在本书后续的聚类分析中讨论无监督任务的性能衡量。1.6 scikit-learn简介

自2007年发布以来,scikit-learn已经成为颇受欢迎的机器学习类库之一。scikit-learn类库提供用于机器学习的算法,包括分类、回归、降维和聚类。它也提供用于数据预处理、提取特征、优化超参数和评估模型的模块。

scikit-learn类库基于广受欢迎的Python类库Numpy和Scipy构建。Numpy扩展了Python以支持大数组和多维矩阵更高效的操作。Scipy提供了用于科学计算的模块。可视化类库matplotlib也经常联合scikit-learn类库一起使用。

scikit-learn类库在学术研究领域广受欢迎,因为它的API有很好的文档,易于使用且非常灵活。只需修改几行代码,开发者就可以使用scikit-learn类库对不同的算法进行实验。scikit-learn类库包含了一些流行的机器学习算法的实现,包括LIBSVM和LIBLINEAR。其他的Python类库(包括NLTK),都包含了对scikit-learn的封装。scikit-learn类库同时也包括许多数据集,这让开发者可以专注于算法而无须收集和清洗数据。

scikit-learn类库拥有BSD许可证,因此开发者可以将其无限制地用于商业应用中。许多scikit-learn类库的算法对于非巨型数据集非常快且具有可扩展性。最后,scikit-learn类库以其可依赖性而闻名,其中大多数的类库都通过了自动化测试。1.7 安装scikit-learn

本书基于scikit-learn类库的0.18.1版本编写,使用这个版本可以保证本书中的例子正确地运行。如果你之前已经安装过scikit-learn,可以通过在一个记事本或者Python解释器中执行代码1.1来获取版本号:

代码1.1# In[1]:import sklearnsklearn.__version__# Out[1]:'0.18.1' 安装包命名为sklearn原因是scikit-learn并不是一个有效的Python包名。

如果之前没有安装过scikit-learn,你可以从一个包管理器安装,或者从源码构建。我们将在后面的内容中回顾针对Ubuntu 16.04系统、Mac OS系统和Windows 10系统的安装过程,最新的安装指令可以参考http://scikit-learn.org/stable/insatall.html。以下的指令只假定你已经安装了 Python 版本 2.6 或者 3.3。关于安装 Python 的指导请参考http://www.python.org/download/。1.7.1 使用pip安装

scikit-learn最简单的安装方式是使用pip,即PyPA推荐的用于安装Python包的工具。使用下面指令来使用pip安装scikit-learn:$ pip install -U scikit-learn

如果pip在你的系统中不可用,后面的几节内容会涉及不同平台的安装指导。1.7.2 在Windows系统下安装

scikit-learn类库需要setuptools,一个支持对Python打包和安装软件的第三方包。setuptools可以通过执行启动脚本https://bootstrap.pypa.io/ez_setup.py在Windows系统下安装。

Windows系统下也有可用的32-bit和64-bit版本的二进制文档。如果你不能决定自己应该使用哪个版本,那就安装32-bit版本。两个版本都依赖Numpy 1.3或更新的版本。32-bit版本的Numpy可以从http://sourceforge.net/projects/numpy/files/Numpy/下载。64-bit版本可以从http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn下载。

32-bit版本scikit-learn的Windows安装器可以从http://sourceforge.net/project/scikit- learn/files/scikit-learn0.17.win32-py2.7.exe/download下载。64-bit版本scikit-learn的Windows安装器可以从http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn下载。1.7.3 在Ubuntu 16.04系统下安装

在Ubuntu 16.04系统中可以使用apt安装scikit-learn:$ sudo apt install python-scikits-learn1.7.4 在Mac OS系统下安装

在OS X系统中可以使用Macports安装scikit-learn:$ sudo port install py27-sklearn1.7.5 安装Anaconda

Anaconda是一个免费的包含超过720个Python开源数据科学包的集合,其中包含scikit- learn、Numpy、Scipy、pandas和matplotlib。Anaconda覆盖全平台且易于安装。请参考https://docs.continuum.io/anaconda/install/来查看你的操作系统下的安装指令。1.7.6 验证安装

为了验证你的scikit-learn类库已经正确地安装,打开一个Python控制台,执行代码1.2:

代码1.2# In[1]:import sklearnsklearn.__version__# Out[1]:'0.18.1'

为了运行scikit-learn类库单元测试,首先需要安装nose Python包。然后在一个终端模拟器中执行下面的命令:$ nosetest sklearn -exe

恭喜你!你已经成功安装了scikit-learn。1.8 安装pandas、Pillow、NLTK和matplotlib

pandas是一个提供数据结构和分析工具的开源Python类库。pandas是一个强大的类库,关于如何使用pandas进行数据分析的书籍并不少。我们将使用pandas中一些方便的工具来导入数据和计算概括统计量。Pillow是Python类库Imaging的一个分支,它提供了许多图像处理特性。NLTK是一个处理人类语言的类库。和scikit-learn一样,使用pip是推荐用来安装pandas、Pillow、和NLTK类库的方法。在一个终端模拟器中执行以下命令:$ pip install pandas pillow nltk

matplotlib是一个能轻松创建绘图、柱状图和其他图表的Python类库。我们将使用它来可视化训练数据和模型。matplotlib有一些依赖项。和pandas一样,matplotlib依赖于Numpy(我们已经安装过)。在Ubuntu 16.04系统下,matplotlib和其依赖项可以使用以下命令安装:$ sudo apt install python-matplotlib

用于Mac OS系统和Windows 10系统下的二进制软件包可以从https://matplotlib.org/ downloads.html下载。1.9 小结

在本章中,我们将机器学习定义为设计能在一个任务中从经验中学习并提高性能的软件的过程。我们讨论了进行监督的范围。其中一端是监督学习,监督学习程序从标记的输入和对应的输出中学习。而无监督学习则位于另一端,无监督学习软件必须从非标记输入中发现结构。半监督学习会同时使用标记和非标记训练数据。

接着,我们讨论机器学习任务的常见类型,并审阅了每种类型的几个例子。在分类任务中,程序从观测到的解释变量预测离散的响应变量值。在回归任务中,程序必须从解释变量预测连续响应变量值。无监督学习包括聚类(观测值会根据一些相似性衡量标准被组织到不同群组中)和降维(将一个解释变量集合减少到一个合成特征的小型集合,同时尽可能保持信息)。我们还审阅了偏差方差权衡,并讨论了对于不同机器学习任务的常见性能衡量方法。

在本章内容中,我们讨论了scikit-learn类库的历史、目标和优势。最后,我们通过安装scikit-learn类库以及其他经常一起联合使用的类库来准备开发环境。在下一章中,我们将讨论一个用于回归任务的简单模型,并使用scikit-learn类库构建自己的第一个机器学习模型。第2章 简单线性回归

在本章中,我们将介绍第一个模型——简单线性回归。简单线性回归围绕一个响应变量和解释变量的某个特征之间的关系进行建[1]模。我们将讨论如何对模型进行拟合,同时也会解决一个玩具问题。虽然简单线性回归对于现实世界的问题几乎不具有可用性,但是理解简单线性回归是理解许多其他模型的关键。在后面的章节中,我们将学到简单线性回归的一般化模型,并将它们运用于现实世界的数据集。2.1 简单线性回归

在前面的章节中,我们学到了在监督学习问题中用训练数据估计一个模型的参数。用解释变量的观察值及其对应的响应变量组成训练数据,训练好的模型可用于预测未被观测到的解释变量值对应的响应变量值。回顾一下,回归问题的目标是去预测一个连续响应变量的值。在本章中,我们将检验简单线性回归,它常用于对一个响应变量和解释变量的特征之间的关系进行建模。

假设你希望了解披萨的价格。你可能会简单地查看菜单。然而,本书是一本关于机器学习的图书,因此我们将基于能观测到的披萨的属性或者说解释变量,来预测披萨的价格。让我们来对披萨的尺寸和价格之间的关系进行建模。首先,我们将使用scikit-learn编写一段程序,通过提供的披萨尺寸来预测其价格。接着我们将讨论简单线性回归如何运行以及如何将其泛化来解决其他类型的问题。

假设你已经记录下了已经吃过的披萨的直径和价格。表2.1中的观测值组成了我们的训练数据。表2.1训 练 实 例直径(单位:英寸)价格(单位:美元)1672893101341417.551818

我们可以使用matplotlib作图来将训练数据可视化,如代码2.1所示:

代码2.1# In[1]:import numpy as npimport matplotlib.pyplot as plt# "np" 和 "plt" 分别是Numpy库和Matplotlib库的常用别名# 在scikit-learn中的一个惯用法是将特征向量的矩形命名为X# 大写字母表示矩阵,小写字母表示向量X = np.array([[6], [8], [10], [14], [18]]).reshape(-1, 1)# X表示我们的训练数据的特征,即披萨的直径y = [7, 9, 13, 17.5, 18]# y是一个表示披萨价格的向量plt.figure()plt.title('Pizza price plotted against diameter')plt.xlabel('Diameter in inches')plt.ylabel('Price in dollars')plt.plot(X, y, 'k.')plt.axis([0, 25, 0, 25])plt.grid(True)plt.show()

脚本中的注释标明X是表示披萨直径的矩阵,y是表示披萨价格的向量。这样做的原因将会在下一章中阐明。这段脚本会生成图2.1。披萨的直径在x轴上绘制,披萨的价格在y轴上绘制:

从训练数据的图2.1中我们可以看出披萨的直径和价格之间存在正相关关系,这应该可以由自己吃披萨的经验所证实。随着披萨直径的增加,它的价格通常也会上涨。下面的代码2.2使用了简单线性回归来对这个关系进行建模。让我们来查看这段代码,并且讨论简单线性回顾是如何运行的。图2.1

代码2.2# In[2]:from sklearn.linear_model import LinearRegressionmodel = LinearRegression() # 创建一个估计器实例model.fit(X, y) # 用训练数据拟合模型test_pizza = np.array([[12]])predicted_price = model.predict(test_pizza)[0]# 预测一个直径之前从未见过的披萨的价格print('A 12" pizza should cost: $%.2f' % predicted_price)# Out[2]:A 12" pizza should cost: $13.68

简单线性模型假设响应变量和解释变量之前存在线性关系,它使用一个被称为超平面的线性面来对这种关系进行建模。一个超平面是一个子空间,它比组成它的环绕空间小一个维度。在简单线性回归中共有两个维度,一个维度表示响应变量,另一个维度表示解释变量。因此,回归超平面只有一个维度,一个一维的超平面是一条直线。

LinearRegression类是一个估计器。估计器基于观测到的数据预测一个值。在scikit-learn中,所有的估计器都实现了fit方法和predict方法。前者用于学习模型的参数,后者使用学习到的参数来预测一个解释变量对应的响应变量值。使用scikit-learn可以非常简单地对不同模型进行实验,因为所有的估计器都实现了fit和predict方法,尝试新的模型只需要简单地修改一行代码。LinearRegression的fit方法学习了公式2.1简单线性回归模型的参数:(公式2.1)

在上面的公式中,y是响应变量的预测值,在这个例子里,它表示披萨的预测价格。x表示解释变量。截断项α和系数β都是可以通过学习算法学到的模型参数。在图2.2中,绘制的超平面对一个披萨的价格和尺寸之间的关系进行建模。使用这个模型,我们可以预测一个直径为8英寸的披萨的价格应该为7.33美元,一个直径为20英寸的披萨价格应该为18.75美元。图2.2

利用训练数据学习产生最佳拟合模型的简单线性回归的参数值称为普通最小二乘(Ordinary Lease Squares,OLS)或线性最小二乘。在本章中,我们将讨论一种分析解出模型参数值的方法。在后面的章节中,我们将学习适用于在大数据集合中逐渐逼近参数值的方法,但是首先必须要定义模型拟合训练数据。2.1.1 用代价函数评价模型的拟合性

在图2.3中我们根据一些参数集合的值绘制出几条回归线。然而我们如何去评估哪组参数值产生了最佳拟合回归线呢?图2.3

代价函数,也被称为损失函数,它用于定义和衡量一个模型的误差。由模型预测出的价格和再训练数据集中观测到的披萨价格之间的插值被称为残差或者训练误差。稍后,我们将使用一个单独的测试数据集来评价模型。在测试数据中预测值和观测值之间的差值叫作预测误差或者测试误差。在图2.4中,模型的残差由训练实例点和回归超平面之间垂直线表示。图2.4

我们可以通过最小化残差的和来生成最佳披萨价格预测器。也就是说,对于所有训练数据而言,如果模型预测的响应变量都接近观测值,那么模型就是拟合的,这种衡量模型拟合的方法叫作残差平方和(RSS)代价函数。在形式上,该函数通过对所有训练数据的残差平方求和来衡量模型的拟合性。RSS由下面方程的公式2.2计算出,其中y是观测值,f(x)是预测值:ii(公式2.2)

我们可以在代码2.2后面加上以下两行代码来计算模型的RSS,如代码2.3所示:

代码2.3print('Residual sum of squares: %.2f' % np.mean((model.predict(X)- y) ** 2))Residual sum of squares: 1.75

现在我们有了一个代价函数,可以通过求这个函数的极小值来找出模型的参数值。2.1.2 求解简单线性回归的OLS

在这一部分中,我们将求解出简单线性回归的OLS。回想一下,简单线性回归由方程 y =α +βx给出,而我们的目标是通过求代价函数的极小值来求解出β 和α的值。首先我们将解出β 值,为了达到目的,我们将计算x的方差以及x和y的协方差。方差用来衡量一组值偏离程度,如果集合中的所有数值都相等,那么这组值的方差为0。方差小意味着这组值都很接近总体均值,而如果集合中包含偏离均值很远的数据则集合会有很大的方差。方差可以使用下面的公式2.3算出:(公式2.3)表示x的均值,x是训练数据中的第i个x的值,n表示训练数据i的总量。我们来计算一下训练数据中披萨直径的方差,如代码2.4所示:

代码2.4# In[2]:import numpy as npX = np.array([[6], [8], [10], [14], [18]]).reshape(-1, 1)x_bar = X.mean()print(x_bar)# 注意我们在计算样本方差的时候将样本的数量减去1# 这项技巧称为贝塞尔校正,它纠正了对样本中总体方差估计的偏差variance = ((X - x_bar)**2).sum() / (X.shape[0] - 1)print(variance)# Out[2]:11.223.2

Numpy库也提供了一个叫作var的方法来计算方差。计算样本方差时关键字参数ddof可以设置贝塞尔校正,如代码2.5所示:

代码2.5# In[3]:print(np.var(X, ddof=1))# Out[3]:23.2

协方差用来衡量两个变量如何一同变化。如果变量一起增加,它们的协方差为正。如果一个变量增加时另一个变量减少,它们的协方差为负。如果两个变量之间没有线性关系,它们的协方差为0,它们是线性无关的但不一定是相对独立的。协方差可以使用下面的公式2.4计算:(公式2.4)

和方差一样,x表示训练数据中第i个x的值,表示直径的均i值,表示价格的均值, y表示训练数据中第i个y的值,n表示训练数i据的总量。我们来计算一下训练数据中披萨半径和价格的协方差,如代码2.6所示:

代码2.6# In[4]:# 之前我们使用一个列表表示y# 在这里我们改为使用一个Numpy多位数组,它包含了几个计算样本均值的方法y = np.array([7, 9, 13, 17.5, 18])y_bar = y.mean()# 我们将X转置,因为所有的操作都必须是行向量covariance = np.multiply((X - x_bar).transpose(), y - y_bar).sum()/(X.shape[0] - 1)print(covariance)print(np.cov(X.transpose(), y)[0][1])# Out[4]:22.6522.65

现在我们已经计算出了解释变量的方差以及解释变量和响应变量之间的协方差,可以使用公式2.5解出β值:(公式2.5)

解出β值以后,我们可以使用公式2.6解出α值:(公式2.6)

在此处是y的均值,是x的均值。是质心的坐标,是一个模型必须经过的点。

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载