Python无监督学习

978-7-115-54072-0
作者: 朱塞佩·博纳科尔索(Giuseppe Bonaccorso)
译者: 瞿源刘江峰
编辑: 胡俊英
分类: Python

图书目录:

详情

作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介作者简介

图书摘要

版权信息

书名:Python无监督学习

ISBN:978-7-115-54072-0

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

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

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

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

著    [德]朱塞佩·博纳科尔索(Giuseppe Bonaccorso)

译    瞿 源  刘江峰

责任编辑 胡俊英

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

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

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

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright ©2019 Packt Publishing. First published in the English language under the title

Hands-On Unsupervised Learning with Python.

All rights reserved.

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

版权所有,侵权必究。


机器学习是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。无监督学习是机器学习中的一种学习方式,是数据科学的一个重要分支,常用于数据挖掘领域,通过构建模型来为业务决策提供依据。

本书通过Python语言讲解无监督学习,全书内容包括10章,前面9章由浅入深地讲解了无监督学习的基础知识、聚类的基础知识、高级聚类、层次聚类、软聚类和高斯混合模型、异常检测、降维和分量分析、无监督神经网络模型、生成式对抗网络和自组织映射,第10章以问题解答的形式对前面9章涉及的问题给出了解决方案。

本书适合数据科学家、机器学习从业者和普通的软件开发人员阅读,通过学习本书介绍的无监督学习理论和Python编程方法,读者能够在业务实践中获得有价值的参考。


瞿源,重庆交通大学交通运输工程硕士。以交通行业为深耕领域,主要涉及该行业的大数据、数据安全、数据分析。结合工作经验,目前钻研机器学习、人工智能、数据挖掘等领域。

刘江峰,重庆大学软件工程硕士。技术出身,工作涉及电商、物流、旅游、金融等领域,对相关的技术和数据等板块有深入的了解。早期以电商垂直领域为行业背景,涉猎大数据、数据挖掘等技术领域。目前工作涉及金融领域,主要的业务方向为结合机器学习、区块链等技术的业务平台。


朱塞佩·博纳科尔索(Giuseppe Bonaccorso)是人工智能、数据科学和机器学习领域的资深从业人员。他曾参与了不同业务环境下的解决方案设计、管理和交付。他于2005年在意大利的卡塔尼亚大学(University of Catania)获得电子工程学硕士学位,并继续在意大利罗马第二大学(University of Rome Tor Vergata)和英国埃塞克斯大学(University of Essex)学习。他的兴趣主要包括机器/深度学习、强化学习、大数据,以及受生物启发的自适应系统、神经科学和自然语言处理等。


切波比(Chiheb Chebbi)是信息安全的爱好者、作家和技术评论员,在信息安全的各个方面拥有丰富经验。他的兴趣主要在于渗透测试、机器学习等。目前他已被列入许多名人堂,他所提出的建议已被许多世界级的信息安全会议所接受。


无监督学习是数据科学中一个重要的分支,其目标是训练用于学习数据集结构的模型,并为用户提供关于新样本的有用信息。在许多不同的业务部门(如市场营销、商业智能、战略等)中,无监督学习一直在帮助管理者根据定性和定量(最重要的)方法做出最佳决策。在数据变得越来越普遍且存储成本不断下降的今天,分析真实、复杂数据集的可能性有助于将传统的商业模式转变为新的、更准确的、响应也更迅速、更有效的模式。因为要关注所有方法的优缺点,并增加对每个特定领域的最佳潜在策略的了解,所以数据科学家对很多可能性还没有一个清晰的认识。本书不是一个详尽的资源(实际上也不可能有),而是一种参考,让你开始探索这个世界,为你提供可以立即使用和可供评估的不同方法。我希望不同背景的读者都能够学到有价值的东西来改善业务,并且希望你对无监督学习这个有趣的主题有更多的研究!

本书的目标读者是数据科学家(有抱负且专业的)、机器学习实践者和开发人员,他们想要学习如何实施最常见的无监督学习算法并优化参数,为来自所有业务领域的不同利益相关者提供有价值的见解。

第1章,无监督学习入门,从非常务实的角度介绍机器学习和数据科学。本章讨论主要的概念并展示一些简单的例子,重点关注无监督学习的问题结构。

第2章,聚类基础知识,开始对聚类算法进行探索。本章分析最常见的方法和评估指标,以及演示如何调整超参数并从不同角度评估性能的具体示例。

第3章,高级聚类,讨论一些更复杂的算法。本章对第2章中分析的许多问题使用更强大、更灵活的方法重新评估。如果基本算法的性能不符合要求,就需要使用这些高级算法。

第4章,实操中的层次聚类,致力于介绍一系列算法,可根据特定标准计算完整的聚类层次结构。本章分析最常见的策略以及可提高方法有效性的特定性能指标和算法变体。

第5章,软聚类和高斯混合模型,侧重于一些著名的软聚类算法,特别强调高斯混合,它允许在非常合理的假设下定义所生成的模型。

第6章,异常检测,讨论了无监督学习的特定应用:新值和异常值检测。本章的目的是分析一些可以有效使用的常用方法,以便了解新样本是否可以被视为有效样本,或者是否有需要特别注意的异常值。

第7章,降维与分量分析,涵盖了降维、分量分析和字典学习相关的常用且强大的方法。这些示例展示了如何在不同的特定场景中有效地执行此类操作。

第8章,无监督神经网络模型,讨论了一些非常重要的无监督神经网络模型,特别是针对可以学习通用数据生成过程结构的网络以及执行降维的网络。

第9章,生成式对抗网络和自组织映射,继续对一些深度神经网络进行分析,这些神经网络可以学习数据生成过程的结构并输出从这些过程中抽取的新样本。此外,本章还讨论了一种特殊的网络(如SOM),并展示了一些实际案例。

第10章,问题解答,针对本书各章的问题给出解答。

本书需要你有机器学习和Python编程的基本知识。此外,为了充分理解书中所有的理论,还需要你了解大学阶段的概率论、微积分和线性代数等相关知识。但是,不熟悉这些知识的读者也可以跳过数学讨论,只关注实践方面的内容。在需要时,你可以参考相关论文和书籍,以便更深入地理解复杂的概念。

本书中使用了许多文本约定。

CodeInText:表示文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄。举例说明:“将下载的WebStorm-10*.dmg磁盘映像文件作为系统中的另一个磁盘挂载。”

代码块设置如下:

X_train = faces['images']
X_train = (2.0 * X_train) - 1.0

width = X_train.shape[1]
height = X_train.shape[2]

当我们希望引起你对特定部分的注意时,相关的行或整体将以粗体显示:

import tensorflow as tf

session=tf.InteractiveSession(graph=graph)
tf.global_variables_initializer().run()

粗体:表示新术语、重要词。例如当菜单或对话框中的单词出现在正文中时,要用粗体显示。下面是一个示例:"Select System info from the Administration panel."

 

 

警告或重要说明图示

 

 

 

提示或技巧图示

 


本书由异步社区出品,社区(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%的数据。出于这个原因,数据库会被定期清理,只有重要数据才能永久存储在服务器中。

而现如今,几乎每家公司都可以利用可扩展的云基础架构来应对不断增长的数据量。Apache Hadoop或Apache Spark等工具允许数据科学家和工程师实现大数据的复杂传输。在这一点上,所有的障碍都被扫除,大众化的进程已经到位。然而,这些大数据集合的真正价值又是什么呢?从商业角度看,信息只有在有助于做出正确决策、减少不确定性并提供更好的情境洞察时才有价值。这意味着,没有合适的工具和知识,一堆数据对于公司来说只会增加成本,需要限制以增加利润。

机器学习是计算机科学(特别是人工智能)的一个大分支,其目的是通过利用现有数据集来实现现实中描述性预测性的模型。由于本书致力于实用的无监督解决方案,我们将只关注通过寻找隐藏原因和关系来描述此类情况的算法。虽然仅从理论角度出发,也有助于展示机器学习问题之间的主要差异,但是只有对目标有完全的认识(不局限于技术方面),才能对最初的问题产生理性回答。这就是我们需要机器学习的原因。

我们可以说人类非凡的认知能力启发了许多系统,但是当影响因素的数量显著增加时,人类就缺乏分析技能了。例如,如果你是第一次与班级学生见面的老师,在浏览整个小组后你能粗略地估计女生的百分比。通常,即便是对两个或更多人做出的估算,也可能是准确的或接近实际值的。然而,如果我们将全校所有人聚集在操场来重复这个实验,性别的区分就显得不那么明显了。这是因为所有学生在课堂上都是一目了然的,但是在操场里区分性别会受到某些因素的限制(例如较矮的人会被较高的人遮挡)。抛开这一层因素,我们可以认为大量的数据通常带有大量的信息。为了提取和分类信息,我们有必要采取自动化的方法。

在进入1.2.1节前,让我们讨论一下最初由高德纳(Gartner)定义的描述性分析(Descriptive Analysis)、诊断性分析(Diagnostic Analysis)、预测性分析(Predictive Analysis)和规范性分析(Prescriptive Analysis)的概念。但是,在这种情况下,我们希望关注正在分析的系统(例如通用情况),以便对其行为进行越来越多的控制。

描述性分析、诊断性分析、预测性分析和规范性分析的流程如图1-1所示。

图1-1 描述性分析、诊断性分析、预测性分析和规范性分析的流程

几乎所有的数据科学场景中要解决的第一个问题都是了解其本质。我们需要知道系统如何工作或数据集描述的内容是什么。如果没有这种分析,我们的知识又是有限的,将无法做出任何假设。例如我们可以通过图表观察一个城市几年的平均温度,但是如果我们无法描述发现现象的相关性、季节性、趋势性的时间序列,其他任何问题就不可能被解决。在具体情况下,如果没有发现对象组之间的相似性,就无法找到一种方法来总结它们的共同特征。数据科学家必须针对每个特定问题使用特定工具,但在此阶段结束时,所有可能(以及有用的)的问题将得到解答。

此外,这个过程具有明确的商业价值,让不同的利益相关者参与的目的是收集他们的知识并将其转化为共同语言。例如在处理医疗保健数据时,医生可能会谈论遗传因素,但就我们的目的而言,最好是某些样本之间存在相关性,因此我们并未完全将它们视为统计上的独立因素。一般而言,描述性分析的结果包含所有度量评估和结论的摘要,这些评估和结论是对某种情况进行限定和减少不确定性所必需的。在温度图表的例子中,数据科学家应该能够解答自动关联、峰值的周期、潜在异常值的数量以及趋势的出现等问题。

到目前为止,我们已经处理了输出数据,这是在特定的基础流程生成之后观察到的。系统描述的自然问题与很多因素有关。温度更多取决于气象和地理因素,这些因素既易于观测,又可以完全隐藏。时间序列中的季节性显然受一年中的周期影响,但所出现的异常值又该如何解释呢?

例如我们在一个处于冬季的地区发现了一个温度峰值,我们怎样才能证明它的合理性呢?在简单的方法中,我们可以将其视为可过滤掉的噪声异常值。但是,如果该值已经被观察到并且有存在价值(例如所有各方都认为这不是错误),我们应该假设存在隐藏(或潜在)原因。

这可能是令人惊讶的,但大多数复杂的场景都具有大量难以分析的潜在原因(有时称为因素)。总的来说,这不是一个糟糕的情况,但正如我们将要讨论的那样,将它们包含在模型中并通过数据集了解它们的影响是非常重要的。

另一方面,决定丢弃所有未知元素意味着降低模型的预测能力,并且会成比例地降低准确性。因此,诊断分析的主要目标不一定是找出所有因素,而是列出可观察和可测量的因素(也称为因子),以及所有的潜在因素(通常概括为单个全局因素)。

在某种程度上,因为我们可以轻松监控效果,诊断分析通常类似于逆向工程的过程,但要检测潜在原因与可观察效果之间存在的关系就较为困难。因此这种分析通常是概率性的,并且有助于找出某个确定的原因带来特定影响的概率。这样,排除非影响分量和确定最初排除的关系也更容易。然而,这个过程需要更深入的统计学知识,除了一些例子如高斯混合之外,这类分析将不会在本书中讨论。

如果收集了整体描述性知识并且对潜在原因的认识已令人满意,那么我们就可以创建预测模型了。创建预测模型的目的是根据模型本身的历史和结构来推断未来的结果。在许多情况下,我们将这个阶段与下一个阶段一起分析,因为我们很少对系统的自由演变感兴趣(例如温度将在下个月如何变化),而是对我们可以影响输出的方式感兴趣。

也就是说,我们只关注预测,考虑最重要的因素。第一个需要考虑的因素就是流程性质。我们不需要机器学习用于确定性过程,除非这些过程的复杂性太高以至于我们不得不将它们视为黑匣子。在本章将要讨论的大多数例子都是无法消除不确定性的随机过程。例如一天中的温度可以建模为条件概率(例如高斯),具体取决于前面的观测值。因此,预测不是将系统变为确定性系统,而是减少分布的方差,使概率只有在小的温度范围内,才会很高。另外,正如我们所知,许多潜在因素在幕后工作,该选择会对最终的准确定性产生极大的不利影响,因此不能接受基于尖峰分布的模型(例如基于概率为1的单一结果)。

如果模型被参数化,变量受学习过程影响(例如高斯的均值和协方差矩阵),那么我们的目标是在偏差-方差权衡中找出最佳平衡。由于本章只是概述,我们不用数学公式讲解概念,只需要一个定义即可(更多细节可以在Mastering Machine Learning Algorithms一书中找到)。

定义统计预测模型的常用术语是估计量估计量偏差受不正确的假设和学习过程可测量的影响。换句话说,如果一个过程的平均值是5.0,但我们的估计量平均值为3.0,那就可以说该模型是有偏差的。考虑到前面的例子,如果观测值和预测之间的误差不为零,则我们使用有偏估计。重要的是要理解并不是说每个估计都必须有一个零误差,而是在收集足够的样本并计算均值时,它的值应该非常接近零(只有无限样本才能为零)。当它大于零时,就意味着我们的模型无法正确预测训练值。很明显,我们正在寻找无偏估计量,这些估计量基本上可以产生准确的预测。

另一方面,估计量方差可以衡量不属于训练集的样本的鲁棒性。在本节开头,我们提到过程通常是随机的。这意味着任何数据集都必须被视为从特定数据生成过程pdata中提取的。如果我们有足够的代表性元素xiX,我们可以假设使用有限数据集X训练分类器会生成一个模型,该模型能够对从pdata中提取的所有潜在样本进行分类。

例如如果需要对仅限于肖像的面部分类器进行建模(不允许进一步的面部姿势),那么我们可以收集一些不同个体的肖像。建模过程需要关注的是不排除现实生活中可能存在的类别。假设我们有10000张不同年龄和性别的人物免冠照片,但没有任何戴帽子的肖像。当系统投入生产时,就会收到客户打来的电话,反映系统对许多图片进行了错误分类。经过分析,会发现发生错误分类的是戴帽子的人。显然,这个肖像模型对错误不负责,因为它用仅代表数据生成过程的一个区域的样本进行训练。因此,为了解决问题,我们要收集其他样本,并重复训练。但是,现在我们决定使用更复杂的模型,希望它能更好地运行。结果我们观察到更差的验证准确性(例如在训练阶段未使用子集的准确性)以及更高的训练精度。这里发生了什么?

当估计量学会完美地对训练集进行分类但是对未见过的样本分类能力较差时,我们可以说它是过拟合的,并且其方差对于特定任务来说太高(反之,一个欠拟合模型则具有较大的偏差,并且所有预测都非常不准确)。直观地讲,该模型对训练数据过于了解,已经失去了概括能力。为了更好地理解这个概念,让我们看一下高斯数据的生成过程,如图1-2所示。

图1-2 高斯数据的生成过程(实线)和样本数据的直方图

如果训练集没有以完全统一的方式,采样或者部分不平衡(某些类的样本比其他类少),或者模型过度拟合,则结果可能由不准确的分布表示,如图1-3所示。

图1-3 不准确的分布

在这种情况下,模型会被迫学习训练集的细节,直到它从分布中排除了许多潜在的样本。该结果不再是高斯分布,而是双峰分布,此时一些概率会偏低。当然,测试和验证集是从训练集未覆盖的小区域中采样的(因为训练数据和验证数据之间没有重叠),因此模型将在其任务中失败,从而提供完全错误的结果。

换句话说,模型已经学会了处理太多细节而导致方差太高,在合理的阈值范围内增加了不同分类的可能性范围。例如从肖像分类器可以了解到,戴蓝色眼镜的人是年龄范围在 30~40 岁的男性(这是不切实际的情况,因为细节水平通常非常低,但是对了解问题的本质是有帮助的)。

可以总结一下,一个好的预测模型必须具有非常低的偏差和适当低的方差。不幸的是,通常不可能有效地最小化这两个值,因此我们必须接受平衡。

具有良好泛化能力的系统可能具有较高的偏差,因为它无法捕获所有细节。相反,高方差允许非常小的偏差,但模型的能力几乎限于训练集。在本书中,我们不打算讨论分类器,但是你应该完全理解这些概念,以便理解在处理项目时可能遇到的不同行为。

这样做的主要目的是回答以下问题:如何影响系统的输出?为了避免混淆,最好将这个概念翻译成纯机器学习语言,因此问题可能是获得特定输出需要哪些输入值?

如1.2.3节所述,此阶段通常与预测性分析合并,因为模型通常用于这两个任务。但是,在某些特定情况下,预测仅限于空输入演变(例如在温度示例中),并且必须在规定阶段分析更复杂的模型。主要在于控制影响特定输出的所有因素。

有时,当没有必要时,我们就只做表面分析。当原因不可控时(例如气象事件),或者当包含全局潜在参数集更简单时,就会发生这种情况。后一种选择在机器学习中非常普遍,并且已经开发了许多算法,在已存在潜在因素(例如EM或SVD推荐系统)的情况下仍能够高效工作。出于这个原因,我们并没有关注这一特定方面(这在系统理论中非常重要),同时,我们隐含地假设模型有研究不同输入产生许多可能输出的能力。

例如在深度学习中,我们可以创建反向模型来生成输入空间的显著映射,从而强制产生特定的输出类。以肖像分类器为例,我们可能有兴趣发现哪些视觉因素会影响类的输出。诊断性分析通常对此是无效的,因为原因非常复杂并且其水平太低(例如轮廓的形状)。因此,反向模型可以通过显示不同几何区域的影响来帮助解决规范性问题。然而,完整的规范性分析超出了本书的范围,在许多情况下,也没有必要使用规范性分析,因此不会在后续章节中考虑这样的步骤。现在让我们来分析不同类型的机器学习算法。

在这一节,我们将简要介绍不同类型的机器学习,并重点关注它们的主要特点和差异。在接下来的部分中,我们将讨论非正式定义,以及正式定义。如果你不熟悉讨论中涉及的数学概念,则可以跳过详细信息。但是,研究所有未知的理论因素是非常明智的,因为它们对于理解后面章节的概念至关重要。

在有监督的场景中,模型的任务是查找样本的正确标签,假设在训练集时标记正确,并有可能将估计值与正确值进行比较。有监督这个术语源自外部教学代理的想法,其在每次预测之后提供精确和即时的反馈。模型可以使用此类反馈作为误差的度量,从而减少错误所需的更正。

更正式地说,如果我们假设一个数据生成过程,数据集的获取如下:

其中

                          

如1.2节所述,所有样本必须是从数据生成过程中统一采样的独立且同分布(Independent and Identically Distributed,IID)的值。特别地,所有类别必须代表实际分布(例如,如果p( y = 0) = 0.4且p( y = 1) = 0.6,则该比例应为40%或60%)。但是,为了避免偏差,当类之间的差异不是很大时,合理的选择是完全统一的采样,并且对于y = 1,2,…,M是具有相同数量的代表。

通用分类器可以通过两种方式建模。

对于第一种情况,我们有:

是一个错误的测量结果

考虑整个数据集X,可以计算全局成本函数L

由于L仅取决于参数向量(xiyi是常数),因此通用算法必须找到最小化成本函数的最佳参数向量。例如在回归问题(标签是连续的)中,误差度量可以是实际值和预测值之间的平方误差:

这种成本函数可以用不同的方式优化(特定算法特有的),但一个非常常见的策略(尤其在深度学习中)是采用随机梯度下降Stochastic Gradient DescentSGD)算法。它由以下两个步骤的迭代组成。

对于第二种情况,当分类器是基于概率分布时,它应该表示为参数化的条件概率分布:

换句话说,分类器现在将输出给定输入向量y的概率。现在的目标是找到最佳参数集,它将获得:

在前面的公式中,我们将pdata表示为条件分布。我们可以使用概率距离度量来进行优化,例如Kullback-Leibler散度DKLDKL始终为非负,且仅当两个分布相同时,DKL=0):

通过一些简单的操作,我们得到:

因此,生成的成本函数对应于ppdata之间交叉熵的差值达到定值(数据生成过程的熵)。训练策略现在是基于使用独热编码表示的标签(例如如果有两个标签0→(0,1)和1→(1,0),那么所有元素的总和必须始终等于1)并使用内在概率(例如在逻辑回归中)或softmax滤波器(其将M值转换为概率分布)输出。

在这两种情况下,很明显隐藏教师模型的存在提供了一致的误差测量,它允许模型相应地校正参数。特别地,第二种方法对达到我们的目的非常有用,因此如果你还不太清楚,我建议你进一步研究它(主要定义也可以在Machine Learning Algorithms, Second Edition一书中找到)。

我们现在讨论一个非常基本的监督学习示例,它是一个线性回归模型,可用于预测简单时间序列的演变。

有监督的hello world!

在此示例中,我们要展示如何使用二维数据执行简单的线性回归。特别地,假设我们有一个包含100个样本的自定义数据集,如下所示:

import numpy as np
import pandas as pd

T = np.expand_dims(np.linspace(0.0, 10.0, num=100), axis=1)
X = (T * np.random.uniform(1.0, 1.5, size=(100, 1))) + 
np.random.normal(0.0, 3.5, size=(100, 1))
df = pd.DataFrame(np.concatenate([T, X], axis=1), columns=['t', 'x'])

 

 

我们还创建了一个pandas的DataFrame,因为使用seaborn库创建绘图更容易。在本书中,通常省略了图表的代码(使用Matplotlib或seaborn),但它始终存在于库中。

 

我们希望用一种综合的方式表示数据集,如下所示:

此任务可以使用线性回归算法执行,如下所示:

from sklearn.linear_model import LinearRegression

lr = LinearRegression()
lr.fit(T, X)

print('x(t) = {0:.3f}t + {1:.3f}'.format(lr.coef_[0][0], lr.intercept_[0]))

最后一个命令的输出如下:

X(t) = 1.169t + 0.628

我们还可以将数据集与回归线一起绘制,获得视觉确认,如图1-4所示。

图1-4 数据集与回归线

在该示例中,回归算法最小化了平方误差成本函数,试图减小预测值与实际值之间的差异。由于对称分布,所以高斯(空均值)噪声对斜率的影响最小。

很容易想象在无监督的场景中,没有隐藏的老师,因此主要目标与最小化基本事实的预测误差无关。实际上,在这种背景下,相同的基本事实的概念具有略微不同的含义。事实上,在使用分类器时,我们希望训练样本出现一个零错误(这意味着除了真正类之外的其他类永远不会被接受为正确类)。

相反,在无监督问题中,我们希望模型在没有任何正式指示的情况下学习一些信息。这种情况意味着唯一可以学习的因素是样本本身包含的。因此,无监督算法通常旨在发现样本之间的相似性和模式,或者在给定一组从中得出的向量的情况下,再现输入分布。现在让我们分析一些最常见的无监督模型类别。

1.聚类分析

聚类分析(通常称为聚类)是我们想要找出大量样本中共同特征的示例。在这种情况下,我们总是假设存在数据生成过程,并且将数据集X定义为:

其中

聚类算法基于一个隐含假设,即样本可以根据其相似性进行分组。特别是当给定两个向量,相似性函数被定义为度量函数的倒数或相反数。例如,如果我们在欧几里得空间中,则有:

在前面的公式中,引入了常数ε以避免除以零。很明显,d(a,c) < d(a,b) ⇒ s(a,c) > s(a,b)。因此,给定每个聚类的代表,我们可以根据规则创建一组分配的向量:

换句话说,聚类包含代表距离同所有其他代表相比最小的所有元素。这意味着聚类包含同所有代表相比与代表的相似性最大的样本。此外,在分配之后,样本获得与同一聚类的其他成员共享其功能的权利。

事实上,聚类分析最重要的应用之一是尝试提高被认为相似样本的同质性。例如推荐引擎可以基于用户向量的聚类(包含有关用户兴趣和购买产品的信息)来进行推荐。一旦定义了组,属于同一聚类的所有因素都被认为是相似的,因此我们被隐式授权共享差异。如果用户A购买了产品P并对其进行了积极评价,我们可以向没有购买产品的用户B推荐此商品,反之亦然。该过程看似随意,但是当因素的数量很大并且特征向量包含许多判别因素(例如评级)时,因素就变得非常有效了。

2.生成模型

另一种无监督方法是基于生成模型。这个概念与我们已经讨论的有监督算法的概念没有太大区别,但在这种情况下,数据生成过程不包含任何标签。因此,我们的目标是对参数化分布进行建模并优化参数,以便将候选分布与数据生成过程之间的距离最小化:

该过程通常基于Kullback-Leibler散度或其他类似度量:

在训练阶段结束时,我们假设L→0,所以ppdata。通过这种方式,我们不会将分析限制在可能样本的子集,而是限制在整个分布。使用生成模型,我们可以绘制与训练过程选择样本截然不同的新样本,但它们始终属于相同的分布。因此,它们(可能)总是可以接受的。

例如生成式对抗网络Generative Adversarial NetworkGAN)是一种特殊的深度学习模型,它能够学习图像集的分布,生成与训练样本几乎无法区分的新样本(从视觉语义的角度来看)。无监督学习是本书的主题,因此我们不会在此处进一步讨论GAN。所有这些概念将在第9章(用实际例子)进行深入讨论。

3.关联规则

我们正在考虑的最后一种无监督方法是基于关联规则的,它在数据挖掘领域非常重要。常见的情形是由一部分商品组成的商业交易集合,目标是找出商品之间最重要的关联(例如购买PiPj的概率为70%)。特定算法可以有效地挖掘整个数据库,突出所有可以考虑到的战略和物流目的之间的关系。例如在线商店可以使用这种方法来促销那些经常与其他商品一起购买的商品。此外,预测方法允许通过建议所有很可能售罄的商品来简化供应流程,这要归功于其他项目的销售增加。

在这一点上,读者了解无监督学习的实际例子是有帮助的。不需要特别的先决条件,但你最好具备概率论的基本知识。

4.无监督的hello world!

由于本书完全致力于无监督算法的讲解,在此不将简单的聚类分析显示为hello world!示例,而是假设一个非常基本的生成模型。假设我们正在监控每小时到车站的列车数量,因为我们需要确定车站所需的管理员数量。特别地,要求每列列车至少有1名管理员,每当管理员数量不足时,我们将被罚款。

此外,在每小时开始时发送一个组更容易,而不是逐个控制管理员。由于问题非常简单,我们也知道泊松分布是一个好的分布,参数μ同样也是平均值。从理论上讲,我们知道这种分布可以在独立的主要假设下有效地模拟在固定时间范围内发生的事件的随机数。在一般情况下生成模型基于参数化分布(例如神经网络),并且不对其系列进行具体假设。仅在某些特定情况下(例如高斯混合),选择具有特定属性的分布是合理的,并且在不损失严谨性的情况下,我们可以将该示例视为此类方案之一。

泊松分布的概率质量函数为:

此分布描述了在预定义的间隔内观察k个事件的概率。在我们的例子中,间隔始终是1小时,我们希望观测10多趟列车,然后估计概率。我们如何才能获得μ的正确数值?

最常见的策略称为最大似然估计Maximum Likelihood EstimationMLE)。该策略通过收集一组观测值,然后找到μ的值,该值使分布生成所有点的概率最大化。

假设我们已经收集了 N 个观测值(每个观测值是一小时内到达的列车数量),则相对于所有样本的μ的似然度是在使用以下公式计算的概率分布下所有样本的联合概率μ(为简单起见,假设为IID):

当我们使用乘积和指数时,计算对数似然是一种常见的规则:

一旦计算出对数似然,我们就可以将μ的导数设置为0,以便找到最佳值。在这种情况下,我们省略了证明(直接获得)并直接得出μ的最大似然估计值:

很幸运的是最大似然估计值只是到达时间的平均值。这意味着,如果我们观察到N个平均值为μ的值,则有很大可能生成它们的泊松分布,其特征系数为μ。因此,从这种分布中抽取的任何其他样本将与观察到的数据集兼容。

我们现在可以从第一次模拟开始。假设我们在工作日的下午收集了25个观察结果,如下所示:

import numpy as np

obs = np.array([7, 11, 9, 9, 8, 11, 9, 9, 8, 7, 11, 8, 9, 9, 11, 7, 10, 9, 10, 9, 7, 8, 9, 10, 13])
mu = np.mean(obs)

print('mu = {}'.format(mu))

最后一个命令的输出如下:

mu = 9.12

因此,每小时平均到达9趟列车。初始分布的直方图如图1-5所示。

图1-5 初始分布的直方图

要计算请求的概率,我们需要使用累积分布函数Cumulative Distribution FunctionCDF),它在SciPy中实现(在scipy.stats包中)。特别地,由于我们感兴趣的是观察到的列车数量超过固定值的概率,因此有必要使用与1-CDF相对应的生存函数Survival FunctionSF),如下所示:

from scipy.stats import poisson

print('P(more than 8 trains) = {}'.format(poisson.sf(8, mu)))
print('P(more than 9 trains) = {}'.format(poisson.sf(9, mu)))
print('P(more than 10 trains) = {}'.format(poisson.sf(10, mu)))
print('P(more than 11 trains) = {}'.format(poisson.sf(11, mu)))

上述代码段的输出如下所示:

P(more than 8 trains) = 0.5600494497386543
P(more than 9 trains) = 0.42839824517059516
P(more than 10 trains) = 0.30833234660452563
P(more than 11 trains) = 0.20878680161156604

正如预期的那样,能观测10多趟列车的概率很低(30%),派10名管理员似乎不合理。但是,由于我们的模型是自适应的,我们可以继续收集观测值(例如在清晨),如下所示:

new_obs = np.array([13, 14, 11, 10, 11, 13, 13, 9, 11, 14, 12, 11, 12,14,
8, 13, 10, 14, 12, 13, 10, 9, 14, 13, 11, 14, 13, 14])

obs = np.concatenate([obs, new_obs])
mu = np.mean(obs)

print('mu = {}'.format(mu))

μ的新值如下所示:

mu = 10.641509433962264

现在平均每小时 11 趟列车。假设我们收集了足够的样本(考虑所有潜在的事故),我们可以重新估计概率,如下所示:

print(P(more than 8 trains) = {}'.format(poisson.sf(8, mu)))
print(P(more than 9 trains) = {}'.format(poisson.sf(9, mu)))
print(P(more than 10 trains) = {}'.format(poisson.sf(10, mu)))
print(P(more than 11 trains) = {}'.format(poisson.sf(11, mu)))

输出如下:

P(more than 8 trains) = 0.734624391080037
P(more than 9 trains) = 0.6193541369812121
P(more than 10 trains) = 0.49668918740243756
P(more than 11 trains) = 0.3780218948425254

使用新数据集观测超过9趟列车的概率约为62%(这证实了我们最初的选择),但现在观测超过10趟列车的概率约为50%。由于我们不想承担支付罚款的风险(这比管理员的成本高),因此最好派10名管理员。为了得到进一步的确认,我们决定从分布中抽取2000个值,如下所示:

syn = poisson.rvs(mu, size=2000)

相应的直方图如图1-6所示。

图1-6 从最终泊松分布中抽取2000个值的直方图

该图在10(表示10名管理员)之后(非常接近11时)达到峰值,然后从k=13开始快速衰减,这是使用有限数据集发现的(比较直方图的形状以进一步确认)。但是,在这种情况下,我们正在生成无法存在于观察集中的潜在样本。MLE保证了概率分布与数据一致,并且新样本将相应地进行加权。这个例子非常简单,其目的只是展示生成模型的动态性。

我们将在本书的后续章节中讨论许多更复杂的模型和示例。许多算法常见的一个重要技术在于不是选择预定义的分布(这意味着先验知识),而是选择灵活的参数模型(例如神经网络)来找出最优分布。只有基础随机过程存在较高的置信度时,优先选择预定义(如本例所示)才合理。在其他情况下,最好避免任何假设,只依赖数据,以便找到数据生成过程中的最适当的近似值。

半监督场景可以被视为标准监督场景,它利用了一些属于无监督学习技术的特征。事实上,当很容易获得大的未标记数据集,而标签成本又非常高时,就会出现一个非常普遍的问题。因此,只标记部分样本并将标签传播到所有未标记样本,这些样本与标记样本的距离就会低于预定义阈值。如果从单个数据生成过程中抽取数据集并且标记的样本均匀分布,则半监督算法可以实现与有监督算法相当的精度。在本书中,我们不讨论这些算法,但有必要简要介绍两个非常重要的模型。

第一个称为标签传播Label Propagation),其目的是将一些样本的标签传播到较大的群体。我们可以通过图形来实现该目标,其中每个顶点表示样本并且每条边都使用距离函数进行加权。通过迭代,所有标记的样本将其标签值的一小部分发送给它们所有的近邻,并且重复该过程直到标签停止变化。该系统具有最终稳定点(即无法再演变的配置),算法可以通过有限的迭代次数轻松到达该点。

标签传播在某些样本可以根据相似性度量进行标记的情况下非常有用。例如在线商店可能拥有大量客户,但只有10%的人透露了自己的性别。如果特征向量足够丰富以表示男性和女性用户的常见行为,则可以使用标签传播算法来猜测未公开信息的客户性别。当然,请务必记住,所有分配都基于相似样本具有相同标签的假设。在许多情况下都是如此,但是当特征向量的复杂性增加时,也可能会产生误导。

第二个重要的半监督算法系列是基于标准支持向量机Support Vector MachineSVM)的,对包含未标记样本的数据集的扩展。在这种情况下,我们不想传播现有标签,而是传播分类标准。换句话说,我们希望使用标记数据集来训练分类器,并将分类规则扩展到未标记的样本。

与仅能评估未标记样本的标准过程相反,半监督SVM使用它们来校正分离超平面。假设始终基于相似性:如果A的标签为1,而未标记样本Bd(A,B)<ε(其中ε是预定义的阈值),则可以合理地假设B的标签也是1。通过这种方式,即使仅手动标记了一个子集,分类器也可以在整个数据集上实现高精度。与标签传播类似,这种类型的模型只有在数据集的结构不是非常复杂时,特别是当相似性假设成立时(不幸的是,在某些情况下,找到合适的距离度量非常困难,因此许多类似的样本确实不相似,反之亦然)才是可靠的。

强化学习可以被视为有监督的学习场景,其中隐藏教师仅在模型的每个决策后提供近似反馈。更正式地说,强化学习的特点是代理和环境之间的持续互动。前者负责决策(行动),最终增加其回报,而后者则为每项行动提供反馈。反馈通常被视为奖励,其价值可以是积极的(行动已成功)或消极的(行动不能复用)。当代理分析环境(状态)的不同配置时,每个奖励必须被视为绑定到元组(行动,状态)。因此,我们的最终目标是找到一种方针(建议在每种状况下采取最佳行动的一种策略),使预期总回报最大化。

强化学习的一个非常经典的例子是学习如何玩游戏的代理。在一个事件中,代理会测试所有遇到状态中的操作并收集奖励。算法校正策略以减少非积极行为(即奖励为正的行为)的可能性,并增加在事件结束时可获得的预期总奖励。

强化学习有许多有趣的应用,这些应用并不仅限于游戏。例如推荐系统可以根据用户提供的二进制反馈(例如拇指向上或向下)来更正建议。强化学习和有监督学习之间的主要区别在于环境提供的信息。事实上,在有监督的场景中,更正通常与其成比例,而在强化学习中,必须分析一系列行动和未来的奖励。因此,更正通常基于预期奖励的估计,并且它们的影响受后续行动的价值影响。例如有监督模型没有内存,因此其更正是立竿见影的,而强化学习代理必须考虑一个事件的部分展开,以决定一个操作是否是负的。

强化学习是机器学习的一个有趣分支。遗憾的是,这个主题超出了本书的范围,因此我们不会详细讨论它(你可以在Hands-On Reinforcement Learning with PythonMastering Machine Learning Algorithms中找到更多细节)。

我们现在可以简要解释一下为什么选择Python作为探索无监督学习的主要语言。

在继续进行更多技术讨论之前,我认为解释一下选择Python作为本书的编程语言是有意义的。因为在过去十年中,数据科学和机器学习领域的研究呈指数级增长,诞生了数千篇有价值的论文和数十种完整的工具。特别地,由于Python的高效、优雅和紧凑性,已被许多研究人员和程序员选中,用以创建一个免费发布的完整科学生态系统。

如今,诸如scikit-learn、SciPy、NumPy、Matplotlib、pandas等许多软件包代表了数百种可用于生产系统的支柱,并且它们的使用量还在不断增长。此外,复杂的深度学习应用程序(如Theano、TensorFlow和PyTorch)允许每个Python用户在没有任何速度限制的情况下创建和训练复杂模型。事实上,请务必注意Python不再是脚本语言。它支持许多特定任务(例如Web框架和图形),并且可以与用C或C++编写的本机代码对接。

出于这些原因,Python几乎是任何数据科学项目的最佳选择。由于其特性,所有具有不同背景的程序员都可以在短时间内轻松学会并有效地使用它。还有一些其他可用的免费解决方案(例如R、Java或Scala),然而在使用R的情况下,虽然R完全覆盖了统计和数学函数,但它缺少构建完整应用程序所必需的支持框架。相反,Java和Scala拥有完整的用于生产环境的库生态系统,但Java并不像Python那样紧凑且易于使用,此外对本机代码的支持要复杂得多,并且大多数库完全依赖于JVM(随之而来的是性能损失)。Scala因其功能特性和Apache Spark等框架(可用于使用大数据执行机器学习任务)在大数据全景图中占据了重要位置。但是,考虑到所有的优点和缺点,Python仍然是最佳选择,这就是它被本书选中的原因。

在本章中,我们讨论了使用机器学习模型的主要原因,以及如何分析数据集以描述其特征,列举特定行为背后的原因,预测未来行为并对其进行影响。

我们还探讨了有监督、无监督、半监督和强化学习之间的差异,重点讨论了前两个模型。我们还使用了两个简单的例子来理解有监督和无监督的方法。

在第2章中,我们将介绍聚类分析的基本概念,重点讨论一些非常著名的算法,如K-means和K-Nearest Neighbors以及最重要的评估指标。

1.当有监督学习不适用时,无监督学习是最常见的替代方法吗?

2.贵公司的首席执行官要求你找出决定销售趋势为负的因素。你需要执行哪种分析?

3.给定独立样本数据集和候选数据生成过程(例如高斯分布),可以通过对所有样本的概率求和来获得似然性。正确吗?

4.根据哪种假设,可能性可以通过单一概率的乘积来计算?

5.假设我们有一个学生数据集,其中包含一些未知的数值特征(例如年龄、标记等)。你希望将男女学生分开,因此你决定将数据集分为两组。不幸的是,两个聚类都有大约50%的男生和50%的女生。你怎么解释这个结果?

6.考虑问题5,但重复实验并将其分为5组。你期望在它们中找到什么(列出一些合理的可能性)?

7.你已经对一家网店的顾客进行了聚类。给定一个新样本,你可以做出什么样的预测?


相关图书

深度学习的数学——使用Python语言
深度学习的数学——使用Python语言
动手学自然语言处理
动手学自然语言处理
Web应用安全
Web应用安全
Python高性能编程(第2版)
Python高性能编程(第2版)
图像处理与计算机视觉实践——基于OpenCV和Python
图像处理与计算机视觉实践——基于OpenCV和Python
Python数据科学实战
Python数据科学实战

相关文章

相关课程