机器学习算法(原书第2版)(txt+pdf+epub+mobi电子书下载)

作者:(意)朱塞佩·博纳科尔索(Giuseppe Bonaccorso)

出版社:机械工业出版社

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

机器学习算法(原书第2版)

机器学习算法(原书第2版)试读:

前言

本书介绍了机器学习,一个不仅对于IT专业人员和分析师,而且对于所有想要利用如预测分析、分类、聚类和自然语言处理等强大技术的数据科学家和工程师都十分重要的领域。为便于学习,所有的理论后都附有基于Python的具体实例。

要想对该领域有基本而扎实的理解需要具备一定的数学基础,这不仅是解释算法所必需的,同时还能使读者理解如何通过调整超参数以获得尽可能高的精度。当然,本书不可能覆盖所有细节内容,因而对某些内容只进行了简单的描述,仅将理论用于结果解释。这样,用户能有更多的机会专注于没有过于复杂数学理论的基础内容,并可以通过文献来深入研究所有感兴趣的内容。

所有章节的阅读不需要按特定的顺序,可以随意跳过你已经知道的内容。必要时可以参考解释某些概念的章节。作者在此对本书中任何不准确或笔误的内容表示歉意,同时感谢所有Packt出版社编辑人员的合作和持续关注。读者对象

本书适合那些希望在预测分析和机器学习领域建立扎实基础的机器学习工程师、数据工程师和数据科学家阅读。熟悉Python将是一个额外的优势,这将使你能够充分利用本书。本书内容

第1章介绍了机器学习的世界,解释了创建智能应用程序涉及的最重要方法的基本概念,重点介绍了不同类型的学习方法。

第2章解释了关于常见机器学习问题的数学概念,包括可学习性的概念和信息论的内容。本章包含一些理论,但如果你从头开始学习本章内容,它将非常有用,因为其中深入介绍了大多数算法中使用的最重要的数学工具。

第3章描述了用于预处理数据集、选择信息量最大的特性和降低原始维度的重要技术。

第4章描述了线性回归算法及其优化方法,包括Ridge、Lasso和ElasticNet。本章还给出了更高级的模型,可用于解决非线性回归问题或减轻异常值的影响。

第5章介绍了线性分类的概念,重点介绍了逻辑回归、感知器、随机梯度下降算法和被动攻击算法。5.7节介绍了最重要的评价指标,这些指标用于衡量模型的性能并找到最优的超参数集。

第6章解释了贝叶斯概率理论并描述了广泛使用的朴素贝叶斯分类器的结构。在6.4节中,通过一些具体的例子分析了线性和二次判别。

第7章介绍了SVM算法,特别介绍了利用核技巧解决线性和非线性分类问题。本章的最后介绍了支持向量回归和更复杂的分类模型。

第8章解释了分层决策过程的概念,描述了决策树分类、随机森林、bootstrapped和袋装树以及投票分类器的概念。

第9章描述了高斯混合、k-NN算法和k-means算法。本章最后介绍了确定最优簇数和度量模型性能的不同方法。

第10章介绍了更复杂的聚类技术,包括DBSCAN、谱聚类和双聚类,这些方法可用于非凸数据集结构。10.3节介绍了两种在线聚类算法(mini-batch k-means聚类和BIRCH)。

第11章在上一章的基础上介绍更复杂的聚类算法,还介绍了凝聚聚类和树形图的概念。

第12章解释了推荐系统中最广泛使用的算法:基于内容和用户的策略、协同过滤和交替最小二乘法。一个基于Apache Spark的完整示例展示了如何使用交替最小二乘法处理非常大的数据集。

第13章解释了词袋策略的概念,并介绍了有效处理自然语言数据集所需的最重要的技术(标记、词干抽取、停止词删除、标注和向量化)。13.4节还讨论了基于Reuters数据集的分类器示例。

第14章介绍了主题建模的概念,并描述了最重要的算法,如潜在语义分析(确定性和概率性)和隐性狄利克雷分配。14.2节和14.3节分别介绍了词嵌入和情感分析的问题,阐述了解决这一问题的使用最广泛的方法。

第15章介绍了深度学习的内容,解释了神经网络和计算图的概念。15.2节以多层感知器的具体例子介绍了高级深度学习框架Keras。

第16章解释了最重要的深度学习层的基本功能,并以深度卷积网络和用于处理时间序列的循环网络(LSTM)的Keras示例来说明。16.4节简要介绍了TensorFlow框架,并通过一些示例来展示它的一些基本功能。

第17章解释了如何定义完整的机器学习管道,重点介绍了每个步骤的特性和缺点。充分利用本书

为完全理解本书中的所有算法,需要掌握线性代数、概率论和微积分的基本知识。

所有实例都是用Python编写的,使用了scikit-learn机器学习框架、自然语言工具包(NLTK)、Crab、langdetect、Spark(PySpark)、Gensim、Keras和TensorFlow(深度学习框架)。这些程序适用于Linux、macOS X和Windows系统的Python 2.7及Python 3.3或以上版本。当特定框架用于特定任务时,将提供详细的说明和参考。第1~14章的所有示例都可以使用Python 2.7执行(而TensorFlow需要Python 3.5或以上版本)。但是,强烈建议读者使用Python 3.5或以上版本的发行版。数据科学和机器学习最常见的选择是Anaconda(https://www.anaconda.com/distribution/),它已经包含了所有最重要的软件包。下载示例代码及彩色图像

本书的示例代码及所有截图和样图可以从http://www.packtpub.com通过个人账号下载,也可以访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载。约定使用

本书中使用了一些字体约定。

代码:表示文本中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入和Twitter句柄。例如:“scikit-learn提供了SVC类,这种实现非常有效,可以在大多数情况下使用。”

代码段设置如下:

粗体:新术语和重要词汇以粗体显示。

警告或重要内容用此标识提示。技巧LOGO-1.TIF▼tupian▼提示和技巧用此标识提示。第1章 机器学习简介

近年来,机器学习已经成为IT和人工智能产业的最重要、最多产的分支之一。机器学习相关的应用程序在各个业务部门日益普及,给人们提供了新的更强大的工具和结果。开放源码、产品框架以及每个月发表的数百篇机器学习论文,使得机器学习成为IT历史上发展最快的过程之一。为什么机器学习如此重要和有价值?

在本章中,我们将讨论以下内容:

·经典系统和自适应系统之间的区别

·学习的一般概念,展示不同方法的例子

·为什么基于生物启发的系统和计算神经科学能够显著提高性能

·大数据与机器学习之间的关系1.1 简介——经典机器和自适应的机器

自古以来,人类通过使用工具和机器来简化工作、减少完成许多不同任务所需的工作量。虽然不知道任何物理规律,人们还是发明了杠杆(阿基米德首次正式描述)、仪器和更复杂的机器来执行更长和更复杂的程序。使用简单的技巧可以使锤击钉子变得更容易和更省力,同样,移动重的石头或木头时使用推车可以更加省力。但是,这两个例子有什么区别?可以看出,第二个例子使用了简单的机器,允许单人执行移动重物这样的综合任务,而不必考虑其中的步骤。基本的机械定律使得水平力能够有效地对抗重力,即使古人不了解这个原理,仅仅通过观察到的技巧(轮子)就可以改善他们的生活。

因此,一台机器如果不能进行实际应用,就不会有高效或新潮之说。当用户知道用特定的机器可以省力或全自动完成某项任务时,那么这个机器是有用的,而且会不断得到改进。在对机器改进的过程中,开始对齿轮、轮子或轴等部件附加一定的智能,因此出现了自动化的机器或程序,并使用能源来实现特定的目标。以风、水磨坊等这种基本工具为例,能够实现以最少的人力控制(与直接活动相比)来完成特定任务。

图1-1是一个通用的经典系统表示方法,通过接收输入元素、处理并产生输出的结果。图1-1 经典/非自适应系统交互图

自从相关技术出现以来,人们一直试图将智能转移到自己的工具中。河水和风都表现出流动的特性,这种特性具有一定的能量并且是免费的,但机器需要具有一些意识来使用这些能量。车轮可以绕固定轴转动数百万次,但是需要风推动表面。水磨坊成功的关键是什么?答案似乎很明显,但对于没有任何相关知识或经验的人,可能是不自知地采用了一种全新的技术方法。如果对“智能”这个词定义的话,可以说是从工具开始,先过渡到简单的机器,然后再到更智能机器的过程。

进入现代社会后,对于机器不需要任何中间步骤(但不意味着不重要),也不需要改变使用的范围。计算机的应用正在变得越来越广泛、灵活和强大,同时网络使得人们能够以最小的代价共享软件应用程序和相关信息。我们现在使用的文字处理软件、电子邮件客户端、网络浏览器以及其他工具都体现了这种特性。不可否认的是,IT革命大大改变了人们的生活和工作,但是如果没有机器学习及其所有的应用程序,计算机将难以完成很多任务。仅仅是垃圾邮件过滤、自然语言处理、通过网络摄像头或智能手机进行视觉跟踪以及预测分析等应用就创造了人机互动并增强了人们的期望。在很多情况下,机器学习将电子工具转变为实际的认知延伸,通过填补人类的感觉、语言、推理、模型和人造工具之间的差距,正在改变人类与许多日常活动的交互方式。

图1-2是一个自适应系统的示意图。图1-2 自适应系统交互图

以上自适应系统不是基于静态或永久结构的(指模型参数和架构),而是具有能够适应外部信号(数据集或实时输入)以及像人类一样使用不确定和零碎的信息来预测未来的能力。

在进行更具体的讨论之前,让我们简要地定义不同类型的可执行的系统。这些技术通常被构造为一系列特定操作,其目标是增加整体领域知识并回答特定问题,但是,在某些情况下,可以将流程限制为单个步骤以满足特定业务需求。我总是建议简要地考虑它们,因为许多特定的操作只有在需要某些条件时才有意义,清楚地理解问题及其影响是做出正确决策的最佳方式,同时也需要考虑未来可能的发展。1.1.1 描述性分析

在尝试任何机器学习的解决方案之前,需要创建一个有关上下文的抽象描述。实现这一目标的最佳方法是定义一个数学模型,其优点是任何人都可以很快理解这个模型,特别是当人们具有一定基础知识的时候。然而,描述性分析的目标是找出所观察到的现象的准确描述并验证所有假设。让我们假设任务是优化大型商店的供应链。首先收集有关购买和销售的数据,在与经理讨论后,一般假设销售量在周末前一天增加。这意味着我们的模型应该基于一定的周期性。描述性分析的任务是验证该假设,并发现最初被忽略的所有其他特别的特征。

在这个阶段结束前应该能够发现,例如该时间序列(假设只考虑一个变量)是周期性的,并具有一定趋势,是否有可能找到一组标准规则等。更多的步骤(我更倾向于将这些视为一个整体)是能够定义一个将所有结果与精确的原因联系起来的诊断模型。这个过程似乎不是这样,但其目标非常接近于描述性分析。事实上,当描述一种现象时,自然会找到一个理性的理由来证明每一个特定的步骤。假设在观察了时间序列中的周期性之后,发现了一个不遵守这个规则的序列。诊断分析的目标是给出一个合适的答案(如商店周日开放)。这条新的信息丰富了我们的知识并使其专业化:现在,可以判断只有在休息一天时系列才是周期性的,因此可能不希望增加一个工作日之前的销售数据,显然这是一个很小的例子。由于许多机器学习模型具有特定的先决条件,因此描述性分析使我们能够立即了解模型是否表现不佳或者考虑到所有已知因素是否是最佳选择。在将要看到的所有示例中,将通过定义每个数据集的特征以及可以观察到的内容来执行简要的描述性分析。由于本书的目标是专注于自适应系统,因而没有足够的空间来进行完整的描述,但请读者想象新的可能的场景,在定义模型之前执行描述性分析。1.1.2 预测性分析

机器学习的目标几乎与这个精确的过程有关。实际上,一旦定义了系统的模型,需要在给定一些初始条件的情况下推断其未来状态。该过程以发现现象之下的规则为基础,以及时推进这些规则(如在时间序列下)并观察下一步的结果。当然,考虑到所有可能的干扰因素,预测模型的目标是最小化实际值和预测值之间的误差。

以大型商店为例,一个好的模型应该能够提前预测当天的峰值和其他的常规的行为。此外,一旦定义和训练了预测模型,就可以用作决策过程。在这种情况下,将预测转化为建议方案。例如,自动驾驶汽车的物体检测器可以非常精确并且及时检测障碍物。但是,什么是为实现特定目标而应该执行的最佳操作?根据预测(位置、大小、速度等),模型必须能够选择最小化车辆损坏风险的动作并最大化安全行车的可能性。这是强化学习中的一项常见任务,当决策者需要在包含很多因素的环境中做出决策时也是非常有用的。因而最后得到的一个原始数据作为输入,而得到的单个结果作为后续模型的输入。回到原来的例子,商店经理对发现隐藏的规律并不感兴趣,他关注的是每天必须订购的商品数量。因此,第一步是预测性分析,第二步是指定性分析,需要考虑先前模型丢弃的许多因素,包括不同的供应商有长短不同的交货时间或供应商根据数量给予不同折扣等。

因此,经理可能将目标定义为最大化(或最小化)一个函数,同时模型必须找到最佳订货量以满足经理的要求,当然要求应该是可达到的,这也取决于对销售量的预测。在本书的其余部分,将讨论针对特定问题的许多解决方案,重点关注预测过程,但首先我们需要定义学习的含义以及为什么它在越来越多不同的商业环境中如此重要。1.2 关于学习

学习究竟是什么?简单来说,学习是在外部刺激下记住大部分以往的经验,从而能够实现改变的能力。因此,机器学习是一种工程方法,对于增加或提高自适应变化的各项技术都十分重要。例如,机械手表是一种非凡的工件,但其结构符合平稳定律,当外部环境发生变化时会变得没有任何用处。学习能力是动物特别是人特有的,根据达尔文的理论,它也是所有物种生存和进化的关键要素。机器虽然不能自主进化,但似乎也遵循同样的规律。

因此,机器学习的主要目标是学习、处理和改进数学模型,该数学模型可以通过环境提供的相关数据进行一次或连续多次的训练得到,利用该数学模型推断未来并做出决策而不需要所有影响因素(外部因素)的全部知识。换句话说,智能体(从环境中接收信息的软件实体,选择达到特定目标的最佳行动并观察其结果)采用统计学习方法,通过确定正确的概率分布来预测最有可能成功(具有最少错误)的动作(值或决策)。

我更喜欢使用术语推断而不是预测,但仅仅是为了避免把机器学习当成一种现代魔法的看法,而这种看法并不罕见。此外,需要介绍一个基本的规律:算法只有在影响实际数据时才能推断出一般的规律,并以相对较高的精度来学习算法的结构。术语预测在使用时具有物理学或系统论中的相同含义。在复杂的情况下,如使用卷积神经网络的图像分类问题,即使信息(尺寸、颜色、特征、对比度等)已经存在于数据中,模型也必须灵活到能提取和学习相关特征。

在接下来的章节中,将会简要介绍常见的机器学习方法,而数学模型、算法和实例将在后面的章节中讨论。1.2.1 监督学习

监督学习中有教师或监督者的概念,其主要功能是提供误差的精确度量(直接与输出值相比)。在实际算法中,该功能由多组对应值(输入和期望输出)组成的训练集提供。基于训练集,可以修正模型参数以减少全局损失。在每次迭代之后,如果算法足够灵活并且数据是相关的,则模型总体精度增加,并且预测值和期望值之间的差异变得接近于零。当然,监督学习的目标是训练一个系统且该系统能够预测以前从未见过的样本。因此,模型需要具有泛化能力,以避免一个常见的称为过拟合的问题。过拟合将导致由于拟合能力过剩而导致的过度学习。这一问题将在第2章中详细讨论,可以说,过拟合的主要影响是虽然能够正确预测用于训练的样本,但其他样本的误差却很大。

图1-3中,圆圈表示训练样本点,细蓝线代表较好的泛化曲线(图中连接成了线段)。图1-3 具有不同插值曲线的股票价格回归示例

使用相同的数据集训练两个不同的模型,分别对应于红线和绿线。红线所表示的模型不能接受,因为它的泛化能力差且预测精度低,而绿线代表的模型在趋势和预测分析中,对残差和泛化性能有非常好的折中。

一般来讲,前面所示的例子称为回归,其基于连续的输出值。相反,如果只有一个离散量表示的结果(称为类别),则该过程称为分类。有时,除了预测实际的类别,最好是确定其概率分布。例如,可以训练一种算法来识别手写字母,其输出(英文中的26个字母)是分类。另一方面,对于人类来说,当无法确定是哪一个字母时,会导致多于一个可能的结果。这意味着通过离散概率分布可以更好地描述实际输出,例如,使26个字母表示的连续值归一化,使得它们的总和为1。

图1-4是一个具有两个特征的数据集的分类实例,该实例是一个线性问题。大多数算法尝试通过施加不同的条件来找到最佳的分割超平面。在分类过程中,目标是相同的,即减少错误分类的数量并增加对于噪声的鲁棒性。例如,对于接近分割超平面(此处为直线)的三角形的点(其坐标约为[5.1-3.0]),当第二个特征受到噪声的影响时的坐标值远小于3.0时,略高一点的超平面就可能会错误地将该点分类。我们将会在后面的章节中讨论一些强大的技术来解决这类问题。图1-4 线性分类示例

常见的监督学习应用包括:

·基于回归或分类的预测性分析

·垃圾邮件检测

·模式检测

·自然语言处理

·情感分析

·自动图像分类

·自动序列处理(例如音乐或语音)1.2.2 无监督学习

无监督学习方法没有任何监督,因而没有对绝对误差的衡量。当需要对一组数据根据其相似度(或距离)进行分组(聚类)时,采用无监督学习方法。例如,前面的分类图中,不需要考虑颜色或形状就可以立即识别出两个类。事实上,圆点(以及三角形)确定了一个集合,不管集合内的点之间的分离程度如何,圆点所代表的集合很容易与三角形代表的集合区分开来。这就像是当理想的样本是海洋时,仅仅考虑岛屿之间的相互位置和内部联系就可以将海洋分成几个区域。

图1-5的每个椭圆表示一个聚类,类中的点用相同的记号标记,类之间的边界点(例如,与圆形区域重叠的三角形)通过特定标准(通常是权衡距离度量)来确定所属的类别。对于模糊的分类,好的聚类方法应该考虑存在的异常值并对它们进行处理,以增加内部一致性(意味着选择使局部密度最大化的分类)和聚类之间的距离。图1-5 二维数据集拆分为四个自然聚类示例

举例来说,分类时可以优先考虑单个点和质心之间的距离,或者属于同一聚类的点和其他聚类的点之间的平均距离。图中所有边界上的三角形彼此接近,因此最近的点是另一个三角形,其属于同一类。然而,现实生活中的分类问题往往存在着部分重叠的边界,这意味着根据特征考虑某些点时具有不确定性。

分类问题还可以从概率分布的角度进行解释,可以将每个椭圆看成是用最小和最大方差界定的多元高斯分布的面积。在整个区域中,单个的点(例如一个蓝色星号标记的点)可能属于任何一个类,但第一类(左下角)给出的概率最高,因此决定了该点属于第一类。一旦所有高斯分布的方差和平均值(即形状)变得稳定,则边界点在特定的高斯分布范围内(除了等可能的情况)。从技术上讲,可以说这种方法最大限度地提高了给定的某个数据集的高斯混合分布的可能性。这是在很多不同应用程序中用到的非常重要的统计学习的概念,本书将在第2章进行更深入的探讨。此外,本书还将讨论一些常见的聚类方法及其优缺点,并比较其在各种测试分布上的性能。

对于涉及标记和未标记数据的问题,所使用的方法为半监督学习。当需要对只含几个完整(标记)的样本的大量数据进行分类时,或者当需要对聚类算法施加一些约束时(例如,分配一些样本到特定的聚类或从某些特定聚类中去除一些样本),一般采用半监督学习方法。

常见的无监督应用包括:

·对象分割(例如用户、产品、电影、歌曲等)

·相似性检测

·自动标记

·推荐引擎1.2.3 半监督学习

在许多问题中,标记样本的数量与所有样本的数量相比非常小。直接监督方法是不可行的,因为用于训练模型的数据不能代表整个分布,因此有必要在监督策略和无监督策略之间找到折中。为了解决这些问题,需要研究半监督学习。这是个前沿的研究课题,本书不会涉及(感兴趣的读者可以查看Mastering Machine Learning Algorithms一书,作者为Bonaccorso G.,由Packt出版)。半监督学习方法追求的主要目标如下:

·考虑到整个数据集,将标记的样本扩展到未标记的样本。带有标记的样本作为吸引子,将其影响扩展到邻居样本,直到达到某个平衡点。

·执行分类训练模型(通常是支持向量机(SVM),见第7章),使用标记的样本强化实现良好分类所需的条件,同时尝试利用未标记的样本作为平衡样本被标记的样本所影响。当数据集仅包含少量标记样本时,半监督SVM的表现很好,能显著减少构建和管理非常大的数据集的障碍。

·通过考虑数据集的结构实现非线性降维。高维数据集(即图像)中的约束导致的问题是最具挑战性的问题之一,寻找差异最小的原始数据的低维分布是三维以上数据进行可视化的基本任务。此外,关键是在没有特别多的信息丢失的情况下降低维度,同时使用简单的模型。在本书中,将讨论一些常见的线性技术(例如主成分分析(PCA)),以便读者能够理解如何在不影响最终精度但增加训练速度的情况下移除某些特征。

可以看出,半监督学习利用了发现分割超平面(分类)以及自动发现结构关系(聚类)的能力。不失一般性,真正的监督者根据底层信息层纠正决策(表示关系)。为了更好地理解这个逻辑,假设有一组用户,其中只有1%被标记(为简单起见,假设他们是均匀分布的),我们的目标是为剩余部分找到最准确的标签。聚类算法可以根据相似性重新排列结构(因为标记的样本是均匀的,可以期望找到其中心是标记,而邻居样本点是未标记的)。在一些假设下,我们可以将聚类中心的标签传播给邻居样本,重复这个过程,直到每个样本的标签变得稳定。此时,标记了整个数据集,可以使用其他算法来执行其他特别的操作。显然,这只是一个例子,但在现实生活中,考虑到半监督方法所达到的准确性,标记数百万个样本的情况也是极其常见的。1.2.4 强化学习

在无法提供实际的监督数据时,强化学习使用基于环境提供的反馈来进行学习。在这种情况下,反馈得到的更多是定性的信息,并不能确定其误差的精确度量。在强化学习中,这种反馈通常被称为奖励(reward)(有时候,负面的反馈被定义为惩罚),而了解在一个状态下执行某个行为是否是正面的是非常有用的。最有用的行为的顺序是必须学习的策略,以便能够为得到最高的即时和累积奖励做出最好的决策。换句话说,一个动作可能是不完美的,但就整体策略而言,它必须能够提供最高的奖励。理性的决策总是追求增加总财富是这个概念的基础。看(see)的能力是高级智能体的显著标记,而短视者往往无法正确评估其即时行动的后果,因此他们的策略总是次优的。

当处于经常动态变化的不确定环境时,我们无法实现对误差的精确测量,因此强化学习成为一种非常有效的方法。在过去几年中,许多经典算法被应用于深度神经网络来学习玩Atari视频游戏(一款美国流行的电子游戏)的最佳策略,并训练智能体如何将正确的动作与表示状态的输入(通常是屏幕截图或内存转储)相关联。

图1-6给出了训练深度神经网络玩著名的Atari视频游戏的示意图。输入是一个或多个连续的截图(捕获瞬时的动态画面就足够了),通过神经网络中不同层的处理(稍后讨论)产生表示特定状态转换的策略的输出。应用输出策略后游戏产生的反馈(作为奖励或惩罚),将反馈用于优化输出直到网络变得稳定。在这种情况下,游戏状态能够被正确识别,保证输出的策略始终是最佳的。最终,总奖励超过了预定义的值。图1-6 深层强化学习体系的一般结构

我们将在第15章和第16章中讨论强化学习的一些例子,这些例子致力于引入深度学习和TensorFlow。一些常见的例子如下:

·自动机器人控制

·游戏

·基于反馈的股票交易分析1.2.5 计算神经科学

得益于计算神经科学领域的研究成果,很多机器学习算法已被定义和完善。同时,最广泛的自适应系统是其神经系统可以与环境进行有效互动的动物。从机械的角度来看,我们需要假设在巨大的神经元网络内工作的所有过程负责所有的特征计算,从低级感知到高级抽象(如语言、逻辑推理、艺术创作等)。

在1900年年初,Ramóny Cajal和Golgi发现了神经细胞和神经元结构,但他们认为这些神经细胞的行为纯粹是计算性的。两位科学家绘制了代表输入单元(树突)、实体(体细胞)、主要通道(轴突)和输出门(突触)的草图,但是细胞群的动态和学习机制没有被完全理解。神经科学界确信学习等同于持续的结构性变化,但他们无法准确定义学习过程中发生的变化。1949年,加拿大心理学家Donald Hebb提出了一个著名的规则(更广泛的讨论可以参阅图书Mastering Machine Learning Algorithms和Theoretical Neuroscience),该规则主要集中在神经元的突触可塑性上。换句话说,变化的因素是连接到大量其他神经元的输出门的数量和特性。Hebb认为,如果神经元产生尖峰并且突触将其传播到另一个行为方式相同的神经元,则连接会增强,否则连接会减弱。这似乎是一个非常简单的解释,但它让你明白了基本神经元如何实现如检测对象的边界、对信号进行去噪,甚至找到具有最大方差的维度(PCA)的操作。

计算神经科学领域的研究一直持续到今天,许多公司和高校目前正在使用最先进的神经影像技术研究大脑的计算行为。这些发现有时令人惊讶,因为它们证实了仅凭想象但从未观察到的东西。特别是,大脑的某些区域可以轻松管理监督和无监督的问题,而其他区域则利用强化学习来预测最可能的未来感知。例如,动物很快学会将脚步声与遇到捕食者的可能性联系起来,并学习如何应对。以同样的方式,其通过来自眼睛的输入可以提取检测对象的有用信息。这种程序在机器学习中非常普遍,令人惊讶的是,许多算法实现了与动物大脑相同的目标。当然,人类思维的复杂性超出了任何完美的解释,但是使用计算机软件仔细分析这些行为大大提高了决策的速度。在本书的最后,我们将讨论深度学习的基础知识,这是机器学习最先进的分支。但是,请读者尝试理解所有的动态行为(即使它们看起来很抽象),因为底层逻辑总是基于非常简单和自然的机制,你的大脑很可能正在执行边读书边学习的操作!1.3 超越机器学习——深度学习和基于生物启发的适应系统

在过去若干年中,由于功能更强大和价格更便宜的计算机的出现,研究人员开始采用深层神经网络的体系结构,以实现二十年前难以想象的目标。自1957年以来,当Rosenblatt发明了感知器时,人们对于神经网络的兴趣变得越来越大。然而,许多限制(关于内存和CPU速度)阻碍了此方面的研究,并且限制了算法的大量应用。

在过去十年中,研究人员开始训练越来越大的模型,建立几个不同层次(这就是为什么这种方法被称为深度学习)以解决新的具有挑战性的问题。便宜和快速的计算机的可用性允许他们使用非常大的数据集(由图像、文本和动画组成的数据)在可接受的时间范围内获得结果。这一努力取得了令人印象深刻的成果,如基于照片元素的分类和使用强化学习的实时智能交互。

这些技术背后的想法是创建像大脑一样工作的算法,由于神经科学和认知心理学的贡献,这一领域已经有了很多重要进展。特别是对模式识别和联想记忆的研究,采用了与人类大脑皮层中的新皮层相似的结构和功能。神经网络还包括更简单地称为无模型(model-free)的算法,该算法是基于通用学习技巧和重复经验的方法,而不是基于特定问题的数学物理方法。

对不同的架构和优化算法的测试可以通过并行处理来进行,从而使得其比定义一个复杂的模型要简单得多,而复杂的模型也更难以适用不同的情况。此外,即使是没有基于上下文的模型,深度学习也显示出比其他方法更好的性能。这表明在许多情况下,最好是用不确定性做出不太精确的决定,而不是由非常复杂的模型(通常不是很快)输出确定的精确决策。对于动物来说,这种决策往往生死攸关,虽然决策隐含地放弃了一些精确性。

常见的深度学习应用包括:

·图像分类

·实时视觉跟踪

·自动驾驶

·机器人控制

·物流优化

·生物信息

·语音识别和自然语言理解(NLU)

·自然语言生成(NLG)和语音合成

这些问题中有许多也可以使用经典方法来求解,但有时候复杂得多,而深度学习的效果更好。此外,深度学习可以将其应用扩展到最初被认为非常复杂的情况,例如自动汽车或实时视觉对象识别。

本书只详细介绍了一些经典算法。然而,有许多介绍性和更高级的讨论资源可供参考。

Google DeepMind团队已经得到了许多有趣的结果,建议你访问他们的网站(https://deepmind.com)了解最新的研究结果。另一个非常有用的资源是OpenAI(https://openai.com/),其中还有一个虚拟实验室,可以使用许多强化学习环境。1.4 机器学习和大数据

机器学习可以应用的另一个领域是大数据。Apache Hadoop首次发布就实现了一种高效的MapReduce算法,应对需要管理的不同业务环境中呈指数增长的信息量。将Apache hadoop用于机器学习,使[1]得协同过滤等应用成为现实。

试想当网上商店拥有一百万用户和一千种商品时,可以使用矩阵将每个用户通过隐式方法或排名与每个商品相关联。那么,该矩阵将包含1000000×1000个元素。即使商品数量非常有限,对该矩阵执行的任何运算也都很缓慢而且耗费大量内存。相反,使用聚类以及并行算法,可以在很短的时间内执行高维矩阵的运算。

考虑训练一个具有一百万个样本的图像分类器。单个实例需要迭代多次以处理小批量的图片。即使该问题可以使用流方法(有限的内存)来执行,在模型具有良好的性能之前仍需要等待几天的时间。采用大数据方式,可以异步训练几个本地模型,定期共享更新,并使用主模型重新同步它们,从而快速得到图像分类器。大数据技术还可以用来解决强化学习问题,其中许多智能体(通常由不同的线程管理)玩同一个游戏,为全局智能提供它们各自的贡献。

当然,不是每个机器学习问题都适合采用大数据技术,也不是所有的大数据集在训练模型时都是有效的。在特定情况下,机器学习和大数据的结合可以消除影响较小的样本的限制,从而得到特别的结果。遗憾的是,机器学习和大数据都是持续研究的主题,因此工程师或者科学家必须完成的任务之一就是了解何时特定技术真正有用,何时其负担可能比实际效益更重。现代计算机通常拥有足够的资源来处理几年前被视为大数据的数据集。因此,希望读者仔细分析每种情况,并从商业角度思考问题。Spark聚类的成本有时很不合理。我看到在两台中型机器的聚类上运行的任务使用笔记本电脑可以更快地执行。因此,始终对问题和数据进行描述性/预测性分析,尝试关注以下内容:

·当前的状态

·目标(需要实现什么?)

·数据和维度(使用批量数据吗?是否有传入流?)

·可接受的延迟(是否需要实时处理?是否可以每天/每周处理一次?)

大数据的解决方案被证明是有效的,例如以下情况:

·数据集无法匹配高端机器的内存

·传入的数据流量巨大、连续、需要及时计算(例如点击流、网络分析、消息调度等)

·将数据拆分成小块是不可能的,因为可接受的延迟是最小的(信息必须量化)

·可以有效地并行化操作(虽然现在许多重要的算法已经在分布式框架中实现,但仍然存在无法使用并行体系结构处理的任务)

在专门讨论推荐系统的第12章中,将给出如何使用Apache Spark实现协同过滤,并采用与朴素贝叶斯分类相同的学习框架。如果想了解更多有关Hadoop系统的信息,请访问http://hadoop.apache.org。Apache Mahout(http://mahout.apache.org)是一个专用的机器学习框架,而Spark(http://spark.apache.org)是最快的计算引擎之一,它具有一个称为MLlib的模块,实现了许多受益于并行处理的常用算法。[1] 指利用兴趣相投、拥有共同经验的用户的喜好来推荐其感兴趣的信息。——译者注1.5 本章小结

本章介绍了自适应系统的概念,自适应系统可以从经验中学习,并改变系统的行为以最大限度达到特定目标。机器学习是这一系列技术的总称,通过算法进行预测,并根据其共同的特征自动组织输入数据。

三个主要的学习策略是监督学习、无监督学习和强化学习。监督学习假设存在一个能提供错误的精确度量的教师,可以将预测输出与实际的输出进行比较,实现参数的修正。无监督学习没有外部教师,所以一切都直接从数据中学习。无监督学习算法尝试找出一组数据的共同特征,以便能够将新样本与正确的聚类相关联。根据一些已知的特征,监督学习通过将所有对象自动分类到特定类别中进行实例的分类,而无监督学习的常见应用是对具有后续标记或处理的实例进行自动分组。强化学习与监督学习类似,但它只接受关于其行为质量的环境反馈。虽然强化学习中不能精确知道什么是错的以及错误的大小,但接收到的信息能帮助决定是否继续采取策略或选择另外的策略。

第2章将讨论机器学习的重要元素,包括数学符号和其他章节中有关机器学习的定义,还将讨论统计学习的概念和一些关于可学习性及其局限性的相关理论。第2章 机器学习的重要元素

本章将讨论机器学习主题中的重要元素和方法,并给出常见机器学习技术的哲学基础。首先是相关的数据格式和预测函数的数学基础,虽然不同算法以不同的方式处理预测函数,但目标是相同的。最新的技术如深度学习、广泛使用能量/损失函数就像本章描述的那样,即使存在细微的差异,通过算法使目标函数最小化,好的机器学习效果通常与最佳损失函数的选择有关。

特别是,我们将讨论以下主题:

·机器学习问题的通用结构和使用的数据

·机器学习模型的属性及其对性能的影响

·类平衡

·统计学习的要素(最大后验概率(MAP)和最大似然估计(MLE))

·信息理论简介,重点关注最重要的机器学习工具2.1 数据格式

在监督学习和无监督学习问题中,数据集定义为具有m个特征的实数向量的有限集合:

考虑到方法可能是基于概率的,因而需要考虑从统计多变量分布D中得出的每个X。基于此,在整个数据集X上添加一个非常重要的假设,即所有样本是独立同分布(independent and identically distributed)。这意味着所有变量具有相同的分布D。考虑含有k个变量的任意子集,有:

理解所有机器学习的任务都是基于使用明确定义的分布(即使它们可能部分未知),并且实际数据集由从中抽取的样本组成,这是基本的。在第1章中,我们定义了学习的概念,其考虑到智能体和未知情况之间的相互作用。这是可能的,因为学习表示分布的能力而不是数据集本身!因此,从现在开始,每当使用有限数据集时,读者必须始终考虑应对共享相同分布的新样本的可能性。

相应的输出可以是连续变量或类别。是连续变量时称为回归(regression),是类别时称为分类(classification)。输出为连续变量的例子如下:

当标签可以采用有限数量的值(例如,它是二进制或双极)时,问题是离散的(也称为分类,考虑到每个标签通常与明确定义的类或类别相关联),而y∈R时问题是连续的。i

输出为类别的例子如下:

定义通用回归器(regressor)为一个将输入值与连续输出相关联的向量值函数r(·),定义通用分类器(classifier)为预测输出为类别(离散值)的向量值函数c(·)。如果它们还依赖内部参数向量来确定一个通用预测器,那么称这种方法为参数学习(parametric learning):

向量θ是所有模型参数的汇总,这些参数通常是我们要学习的唯一元素。事实上,大多数模型假设一个不能修改的标准结构(即使有一些特定的动态神经网络允许添加或删除计算单元),并且适应性仅依赖于可能的参数范围。

另一方面,非参数学习不会对预测函数族进行初始化假设(例如,定义r(·)和c(·)的通用参数化形式)。一个常见的非参数族称为基于实例的学习(instance-based learning),不需要预先计算参数值,而仅基于由训练样本(实例集)确定的假设进行实时预测。一个简单而广泛使用的方法是采用半径固定的邻域概念,即在分类问题中,新的样本被已分类的训练样本自动包围,通过考虑附近的样本类别来确定输出类别。本书将讨论属于此类的另一个非常重要的算法族:基于核的支持向量机(kernel-based Support Vector Machine)。

每个算法都有特有的机理和对于参数的解释,因此,不需要现在就讨论阈值或概率等定义,或使用更抽象的定义。通用的参数训练过程应该找到在给定的特定训练数据集上能够最小化回归/分类误差的最佳参数向量,并生成能对未知样本进行泛化的预测器。

如果含有加性噪声,则输出可以表示为:

在上式中,期望输出可以表示为一个较精确的预测加上零均值和低方差的高斯噪声。训练任务变为通过优化参数来提高信噪比。当然,如果存在不具有零平均值(与其他X值无关)的项,那么可能意味着必须考虑一个隐含的趋势(可能是已被过早抛弃的特征)。另一方面,高噪声方差意味着X被污染,其测量值是不可靠的。

在无监督学习中,通常只有一个具有m维向量的输入集X,并且使用以下表达式定义聚类函数cl(·)(具有n个目标类):

正如第1章中所解释的,聚类算法试图发现样本之间的相似性并相应地对它们进行分组。因此cl(·)将始终输出0到n-1之间的标签(或者在1和n之间),表示与样本x最匹配的簇。由于x是假设从训练阶段使用的相同数据生成过程中提取的,因此我们在数学上接受结果在所达到的准确度极限内可靠。另一方面(在每个机器学习问题中都是如此),如果从完全不同的分布中抽取x,则任何预测都将与随机预测无法区分。这个概念非常重要,读者必须理解它(连同所有可能的含义)。假设我们将一级方程式赛车和军用飞机的图像分类,最终准确度为95%。这意味着只有五张代表实际汽车或飞机的照片被错误分类。这可能是由于细节、照片的质量、物体的形状、噪音的存在,等等。相反,如果我们尝试对SUV和大型货机的照片进行分类,那么所有结果都是毫无意义的(即使它们是正确的)。之所以发生这种情况,是因为分类器很少会输出50%概率的分类(意味着不确定性最大),最终的类将始终是两者中的一个。然而,分类器的意识与投掷硬币的神谕没有太大的不同。因此,每当我们需要处理特定样本时,必须确保使用从相同分布中提取的元素来训练模型。在前面的示例中,可以使用所有类型的汽车和飞机重新训练分类器,同时尝试达到相同的原始精度。

在大多数scikit-learn模型中,有一个包含所有训练参数的实例变量coef_。例如,在单参数线性回归问题中(将在第3章中详细讨论),输出是多类策略

到目前为止,我们假设回归和分类都对m长度的向量进行操作,但产生单个值或单个标签(换句话说,输入向量始终只与一个输出元素相关联)。当输出类的数目大于1时,有两种策略来解决分类问题:

·一对多(one-vs-all)

·一对一(one-vs-one)

这两种策略返回给用户的输出都是最终的值或类。然而,为了优化模型总是选择最好的策略(scikit-learn可以自动管理这些选项,以避免在不必要时进行明确选择),有必要了解这两种策略蕴含的不同原理。

1.一对多

这可能是最常见的策略,并在scikit-learn中广泛应用于大多数算法。如果输出有n个类,并行训练n个分类器可以将实际所属的类与剩余的那些类分开。这种方法属于相对轻量级的方法(最多需要n-1个过程来找到正确的类,因此它具有O(n)的复杂度),因此通常是默认选项,并且不需要进一步的操作。

2.一对一

一对多的替代方案是为每两个类训练一个模型。算法的复杂度不2再是线性的(实际上是O(n)),根据多数类的结果来决定哪一个是正确的类。一般来说,选用这种方法,计算量大,因此只有当选用全部数据集效果不好时才考虑采用。

如果想了解更多关于scikit-learn的多类策略,请访问http://scikit-learn.org/stable/modules/multiclass.html。2.2 可学习性

模型的学习可以分为两部分:结构和参数。结构由特定算法进行选择,通常是不可变的(除了在模型提供重新建模功能的情况下),而参数是优化的目标。考虑n个无界参数,共同组成一个n维空间(给参数加入边界约束将生成该空间的一个子空间)。在这个空间中,每个点与待估计函数的固定部分(以及参数的特定集合)共同构成参数学习的假设H:

参数学习过程的目标是找到预测误差最小、泛化能力足以避免过拟合的最佳假设。图2-1是一个数据集的示例,将其中的点划分为红色(A类)或蓝色(B类)。当前有三个假设:第一个(从左边开始的中间的线)错误分类了3个样本,而下面和上面的线分别错误分类了13和23个样本。图2-1 基于3种不同假设的分类器示例

很显然,第一个假设最优,应该被优先选择。但是另一方面,了解可能存在的过拟合的基本概念是非常重要的。考虑一个n维二分类问题。如果存在一个超平面,它将空间分成两个子空间,每个子空间仅包含属于同一类的样本,那么我们说数据集X是线性可分的(不进行变换)。去除线性约束,我们有无限个可替代的一般超平面。然而,参数模型仅采用非周期性和近似函数的族,其振荡和拟合数据集的能力(有时以非常复杂的方式)是由参数数量确定的。

考虑图2-2所示的例子。图2-2 线性和非线性分类器示例

蓝色分类器是直线,而橘红色分类器是一条非线性的三次曲线。很显然,非线性策略似乎表现得更好,由于非线性策略的凹性,该策略可以有更好的分类效果。但是,如果按照最后四个(从右边)定义的趋势添加新样本,则用非线性策略进行分类将是完全错误的。事实上,线性函数的整体表现更好,但不能反映出第0到第4个样本所表现出的振荡特性,而三次非线性曲线几乎可以完美地分类这部分数据,但却失去了保持整体线性趋势的能力。基于以上分析,有两种可能性:

·如果将来的预测数据具有和训练样本一样的分布,复杂的模型可以捕获较低阶模型可能丢弃的小的变化,其可能是一个很好的选择。而在这个例子中,线性(或较低阶)模型可能导致欠拟合,因为它无法精确地表现出数据的小的趋势。

·如果将来的预测数据与训练样本局部分布可能不同,那么为保持整体趋势,则最好选择具有较高残余错误分类误差以及更好泛化能力的模型。使用仅关注训练数据的复杂模型可能会导致过拟合。2.2.1 欠拟合和过拟合

机器学习模型的目的是找到将输入数据与输出数据近似关联的未知函数(对于分类器,我们称之为类)。虽然训练集通常表示样本的全局分布,但该集合不包含所有可能的数据,否则该问题可以通过一对一关联得到解决。同样地,我们不知道可能的函数的解析表达式,因此在训练时有必要考虑拟合模型,在未知输入时保持模型能够实现泛化。在这方面,引入模型的表征能力的概念是有用的,因为它能够在数据集上学习少量/大量可能的分布。显然,模型的低表征能力通常与较简单的模型相关联,例如无法解决非线性问题,而高表征能力(既是基础模型的函数又是参数的函数)将导致更复杂的分离超平面。考虑上一节中的最后一个例子,很容易理解线性分类器等效于线性等式:

在这种情况下,有两个参数,m和q,曲线永远不会改变其斜率(由m定义)。相反,第二个分类器可以想象为一个三次方程:

现在,我们有四个参数和两个输入值的幂。这些条件允许对可以改变其斜率两次的函数进行建模,并且可以适应更复杂的场景。显然,我们可以通过考虑通用多项式函数来继续这种分析:

复杂性(以及因此的容量)与p度成比例。加入多项式和非线性函数,我们可以获得极其复杂的表示(例如使用神经网络实现的表示),这些表示可以足够灵活地捕获非一般数据集的细节。但是,重要的是要记住增加容量通常是不可逆的操作。换句话说,更复杂的模型总是会更复杂,即使更简单的模型可取。学习过程可以拉伸或弯曲曲线,但它永远无法消除斜率变化(有关更完整的解释,请查看《Mastering Machine Learning Algorithms》)。这种情况会导致两种不同的潜在危险。

·欠拟合:意味着可能是因为数据量有限,模型无法得到训练集所呈现出的特征。

·过拟合:模型拟合能力过剩,但由于过多考虑数据的变化而导致泛化能力不足。模型可以将所有已知样本几乎完全关联到相应的输出值,但是当出现未知的输入时,相应的预测误差可能非常高。

图2-3显示了具有较少数据(欠拟合)、正常数据(正常拟合)和过量数据(过拟合)的例子,其中橘红色曲线代表实际的模型,蓝色曲线代表拟合后产生的模型。图2-3 欠拟合(左)、过拟合(右)和正常拟合(中)示例

欠拟合的模型通常具有高偏差,偏差被定义为参数θ的估计值与真实值之间的差值:

当偏差为零时,模型被定义为无偏。另一方面,偏差的存在意味着算法不能学习θ的可接受的表示。在图2-3的第一个例子中,直线在两点(约0.3和0.8)的邻域中只有一个可忽略的误差,并且由于直线的斜率不改变,偏差将迫使误差在其他地方增加。相反,过拟合通常与高方差相关,其定义如下:

高方差是高表征能力的结果。该模型现在能够改变并多次变化其斜率,但它不再是原来的简单表示。图2-3中的右侧示例显示了极其复杂的曲线,可能无法对大多数从未见过的样本进行分类。考虑到预测误差,欠拟合更容易检测,而过拟合可能更难以发现,因为它最初可能被认为是完美拟合的结果。事实上,在分类任务中,高方差模型可以很容易地学习到训练阶段使用的数据集的结构,但是,由于过度的复杂性,它可能变得很特殊。这通常意味着它将以较低的准确度预测从未见过的样本,因为这些特征不能被识别为属于哪一个类别。模型捕获每个小的变化,现在可以更自由地调整其分离面,因此相似性(这是泛化能力的基础)更难以被检测到。我们将在以下章节中讨论的交叉验证和其他技术可以较容易地显示模型如何与在训练阶段与从未见过的测试样本一起工作。这样,就可以在更广泛的情况下评估泛化能力(不是处理所有可能的值,而是始终使用应该反映原始分布的子集)并做出最合理的决策。请读者记住,机器学习模型的真正目标不是过拟合训练集(我们将在第3章中讨论这个),但是要使用新样本,在进入生产阶段之前有必要注意性能指标。

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

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?