精通-Java-机器学习-全-
精通 Java 机器学习(全)
原文:
annas-archive.org/md5/ae0ef35bdc04e7c0f29c1a93734045dd
译者:飞龙
前言
关于机器学习有许多值得注意的书籍,从关于从数据学习理论的教学小册子;到该领域专业化的标准参考书籍,如聚类和异常检测或概率图建模;到提供特定语言中工具和库使用实用建议的食谱书。那些覆盖面广泛的书籍通常在理论细节上比较简短,而那些专注于一个主题或工具的书籍可能不会,例如,在流式处理与批量环境中的方法差异方面有很多可说的。此外,对于喜欢 Java 工具且希望找到一本能够扩展他们知识——同时关注基本方面——的初学者来说,选择非常有限。
在一个地方找到
-
在任何数据可用性场景下,不同技术的优缺点——当数据被标记或未标记,是流式或批量,本地或分布式,结构化或非结构化时
-
为那些与这些技术非常相关的最重要的数学结果提供参考资料,以便更好地理解潜在的理论
-
介绍最成熟的基于 Java 的框架、库和可视化工具,包括如何将这些技术付诸实践的描述和说明,据我们所知,今天是不可能的
因此,本书的核心思想是在保持理论处理与实践处理之间平衡的同时,利用概率、统计学、基础线性代数和基础微积分来服务一方,并强调方法论、案例研究、工具和代码来支持另一方。
根据 KDnuggets 2016 年软件调查,Java 在机器学习使用的语言中,以 16.8%的份额位居第二,仅次于 Python。更重要的是,这比前一年增长了 19%!显然,尽管有些人声称 Java 有所衰退,但它仍然是构建和部署涉及机器学习的系统的重要而有效的工具。通过本书,我们旨在接触那些在 Java 方面有一定经验并且对机器学习有入门知识的专业人士和有志爱好者。我们的目标是使《精通 Java 机器学习》成为他们成为数据科学高级实践者道路上的下一步。为了引导他们在这条道路上前进,本书涵盖了机器学习中的各种技术——其中一些他们可能已经熟悉,而另一些可能不太熟悉,或者只是表面了解——包括数据分析方法、学习算法、模型性能评估以及监督学习和半监督学习、聚类和异常检测、半监督和主动学习中的更多内容。它还介绍了特殊主题,如概率图建模、文本挖掘和深度学习。不忘考虑当今企业规模系统中日益重要的主题,本书还涵盖了从不断变化的数据流中学习的独特挑战,以及适用于实时系统的工具和技术,以及大数据世界的必要性:
-
机器学习在大规模分布式环境中的工作方式是什么?
-
会有哪些权衡?
-
算法应该如何调整?
-
这些系统如何与其他主导的 Hadoop 生态系统中的技术互操作?
本书解释了如何使用正确的方法论、流程、应用和分析,将机器学习应用于现实世界的数据和领域。每一章都伴随着案例研究和如何使用一些最佳开源工具(用 Java 编写)应用新学习技术的示例。本书涵盖了超过 15 个开源 Java 工具,它们之间支持广泛的技术,包括代码和实际用法。代码、数据和配置可供读者下载和实验。我们展示了超过十个机器学习的现实世界案例研究,这些研究说明了数据科学家的工作流程。每个案例研究详细描述了实验中采取的步骤:数据摄入、数据分析、数据清洗、特征减少/选择、映射到机器学习、模型训练、模型选择、模型评估和结果分析。这为读者提供了使用每章中介绍的工具和方法解决手头商业问题的实用指南。
本书涵盖的内容
第一章, 机器学习回顾,是对读者从 Packt 的Java 机器学习学习或类似文本中学到的基本概念和技术的复习。本章回顾了诸如数据、数据转换、采样和偏差、特征及其重要性、监督学习、无监督学习、大数据学习、流和实时学习、概率图模型以及半监督学习等概念。
第二章, 现实世界监督学习的实用方法,抹去尘网,直接深入监督学习的广阔领域及其相关技术的全谱系。我们涵盖了特征选择和降维、线性建模、逻辑模型、非线性模型、SVM 和核、集成学习技术如 bagging 和 boosting、验证技术和评估指标以及模型选择等主题。使用 WEKA 和 RapidMiner,我们进行了详细的案例研究,从数据分析到模型性能分析的所有步骤。与每一章的其他案例研究一样,案例研究作为示例呈现,以帮助读者理解章节中介绍的技术如何在现实生活中应用。案例研究中使用的数据集是 UCI 马科利克。
第三章, 无监督机器学习技术,介绍了聚类和异常检测技术中的许多高级方法及其应用。涵盖的主题包括无监督数据中的特征选择和降维、聚类算法、聚类中的评估方法以及使用统计、距离和分布技术进行异常检测。本章结束时,我们使用真实世界的图像数据集 MNIST 对聚类和异常检测进行了案例研究。我们使用 Smile API 进行特征降维,使用 ELKI 进行学习。
第四章, 半监督学习和主动学习,详细介绍了在只有少量标记数据时进行学习的算法和技术。涵盖的主题包括自训练、生成模型、归纳 SVM、协同训练、主动学习和多视角学习。案例研究涉及学习系统,并在真实世界的 UCI 威斯康星乳腺癌数据集上进行。介绍的工具是 JKernelMachines、KEEL 和 JCLAL。
第五章,实时流机器学习,涵盖了实时数据流在从数据中学习的问题上呈现的独特情况。本章广泛讨论了流机器学习的需求和应用、监督流学习、无监督聚类流学习、无监督异常值学习、流学习中的评估技术以及用于评估的指标。本章末尾提供了一个详细的案例研究,说明了 MOA 框架的使用。所使用的数据集是电力(ELEC)。
第六章,概率图建模,表明许多现实世界问题可以通过在多维空间中对复杂联合概率分布进行编码来有效地表示。概率图模型提供了一种框架,用于在这种情况下表示、推理和有效学习。本章广泛讨论了概率概念、PGMs、贝叶斯网络、马尔可夫网络、图结构学习、隐马尔可夫模型和推理。本章末尾进行了一个基于现实世界数据集的详细案例研究。本案例研究中使用的工具是 OpenMarkov 和 Weka 的贝叶斯网络。数据集是 UCI 成人(Census Income)。
第七章,深度学习,如果今天在流行想象中有一个机器学习的超级明星,那就是深度学习,它在解决最复杂人工智能问题所使用的技巧中占据了主导地位。涵盖的主题广泛,包括神经网络、神经网络的问题、深度信念网络、受限玻尔兹曼机、卷积网络、长短期记忆单元、降噪自编码器、循环网络等。我们提供了一个详细的案例研究,展示了如何实现深度学习网络、调整参数和执行学习。我们使用 DeepLearning4J 和 MNIST 图像数据集。
第八章,文本挖掘与自然语言处理,详细介绍了在文本挖掘领域进行各种分析的技术、算法和工具。涵盖的主题广泛,包括文本挖掘的领域、文本挖掘所需的组件、文本数据的表示、降维技术、主题建模、文本聚类、命名实体识别和深度学习。案例研究使用了现实世界的非结构化文本数据(Reuters-21578 数据集),突出了主题建模和文本分类;所使用的工具是 MALLET 和 KNIME。
第九章,大数据机器学习 – 最终边疆,讨论了当今的一些最重要挑战。当数据量很大或以非常高的速度可用时,有哪些学习选项?如何处理可扩展性?涵盖的主题包括大数据集群部署框架、大数据存储选项、批量数据处理、批量数据机器学习、实时机器学习框架和实时流学习。在针对大数据批量处理和实时处理的详细案例研究中,我们选择了 UCI Covertype 数据集和机器学习库 H2O、Spark MLLib 和 SAMOA。
附录 A,线性代数,涵盖了线性代数的概念,旨在作为简要的复习。它在其覆盖范围内远非完整,但包含了对书中介绍的机器学习技术相关的一些重要概念的快速浏览。它包括向量、矩阵和基本的矩阵运算和属性、线性变换、矩阵逆、特征分解、正定矩阵和奇异值分解。
附录 B,概率,提供了一个关于概率的简要入门。它包括概率的公理、贝叶斯定理、密度估计、均值、方差、标准差、高斯标准差、协方差、相关系数、二项分布、泊松分布、高斯分布、中心极限定理和误差传播。
您需要为这本书准备什么
本书假设您在 Java 编程方面有一些经验,并对机器学习概念有基本的了解。如果您不符合这些条件,但仍然好奇并且有自我驱动力,请不要担心,继续阅读!对于那些有一些背景知识的人来说,这意味着您熟悉数据的基本统计分析以及监督学习和无监督学习中的概念。对于那些可能没有必要的数学知识或者必须挖掘记忆深处来回忆起某个公式或奇怪符号的人,请不要气馁。如果您喜欢挑战,附录中的简短入门可能就是您启动引擎所需的一切——一点坚持就能让您度过难关!对于那些从未接触过机器学习的人来说,第一章同样是为您写的,就像为那些需要复习的人一样——这是您全速投入并了解其全部内容的入门工具。您可以通过任何数量的在线资源来增强您的基础知识。最后,对于那些对 Java 一无所知的人,这里有一个秘密:本书中介绍的大多数工具都有强大的图形用户界面。其中一些包括类似向导的界面,使用起来非常简单,而且不需要任何 Java 知识。所以如果您是 Java 的新手,只需跳过需要编码的示例,学习如何使用基于 GUI 的工具即可!
这本书面向的对象
本书的主要受众是与数据打交道的专业人士,他们的职责可能包括数据分析、数据可视化或转换、机器学习模型的训练、验证、测试和评估——可能使用 Java 或基于 Java 的工具来执行预测、描述性或规范性分析。选择 Java 可能意味着个人偏好,因此可能需要一些在 Java 中编程的经验。另一方面,工作环境或公司政策可能限制第三方工具的使用,仅限于用 Java 编写的工具和一些其他工具。在第二种情况下,潜在读者可能没有 Java 编程经验。本书旨在针对这类读者,就像它针对他们的同事 Java 专家(最初提出该政策的人)一样。
可以通过具有两个属性的个人资料来定义一个次要受众:对机器学习的知识好奇心以及对概念、实用技术和工具的单一全面处理的渴望。这类读者的一个例子可以选择跳过数学和工具,仅专注于学习最常用的监督学习和无监督学习算法。另一个人可能会浏览第一章、第二章、第三章和第七章,完全跳过其他章节,并一头扎进工具——如果你想要快速让自己对客户所说的即将到来的数据集进行分析变得有用,这是一个完全合理的策略。重要的是,通过一些练习重现书中的实验,这将帮助你向专家提出正确的问题!或者,你可能想将这本书作为参考,快速查找亲和传播算法的详细信息(第三章,无监督机器学习技术),或者通过简要回顾方案(第七章,深度学习)来提醒自己 LSTM 架构,或者用书签标记基于流的学习中用于异常检测的距离聚类方法的优缺点列表(第五章,实时流机器学习)。所有读者都受欢迎,每个人都会找到很多内容可以深入研究。
术语
在本书中,你将找到许多文本样式,用于区分不同类型的信息。以下是一些这些样式的示例及其含义的解释。
文本中的代码词汇、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 昵称如下所示:“算法在循环中调用消除函数,如下所示。”
代码块如下设置:
DataSource source = new DataSource(trainingFile);
Instances data = source.getDataSet();
if (data.classIndex() == -1)
data.setClassIndex(data.numAttributes() - 1);
任何命令行输入或输出都如下所示:
Correctly Classified Instances 53 77.9412 %
Incorrectly Classified Instances 15 22.0588 %
新术语和重要词汇以粗体显示。
注意
警告或重要注意事项会以这样的框出现。
小贴士
小贴士和技巧会像这样出现。
读者反馈
我们始终欢迎读者的反馈。让我们知道您对这本书的看法——您喜欢或不喜欢什么。读者反馈对我们来说很重要,因为它帮助我们开发出您真正能从中获得最大利益的标题。
要向我们发送一般反馈,请简单地发送电子邮件至<feedback@packtpub.com>
,并在邮件主题中提及书籍的标题。
如果您在某个领域有专业知识,并且您有兴趣撰写或为书籍做出贡献,请参阅我们的作者指南,网址为www.packtpub.com/authors。
客户支持
现在,您已经是 Packt 书籍的骄傲拥有者,我们有一些可以帮助您充分利用购买的东西。
您可以通过以下步骤下载代码文件:
-
使用您的电子邮件地址和密码登录或注册我们的网站。
-
将鼠标指针悬停在顶部的支持标签上。
-
点击代码下载 & 错误清单。
-
在搜索框中输入书籍的名称。
-
选择您想要下载代码文件的书籍。
-
从下拉菜单中选择您购买此书的来源。
-
点击代码下载。
您也可以通过点击 Packt Publishing 网站上书籍网页上的代码文件按钮来下载代码文件。您可以通过在搜索框中输入书籍的名称来访问此页面。请注意,您需要登录您的 Packt 账户。
下载文件后,请确保您使用最新版本的软件解压缩或提取文件夹:
-
Windows 版本的 WinRAR / 7-Zip
-
Mac 版本的 Zipeg / iZip / UnRarX
-
Linux 版本的 7-Zip / PeaZip
书籍的代码包也托管在 GitHub 上,网址为github.com/mjmlbook/mastering-java-machine-learning
。我们还有其他来自我们丰富图书和视频目录的代码包可供在github.com/PacktPublishing/
找到。查看它们吧!
错误清单
尽管我们已经尽一切努力确保我们内容的准确性,但错误仍然可能发生。如果您在我们的某本书中发现了错误——可能是文本或代码中的错误——如果您能向我们报告这一点,我们将不胜感激。通过这样做,您可以节省其他读者的挫败感,并帮助我们改进此书的后续版本。如果您发现任何错误清单,请通过访问www.packtpub.com/submit-errata
,选择您的书籍,点击错误清单提交表单链接,并输入您的错误清单详情。一旦您的错误清单得到验证,您的提交将被接受,错误清单将被上传到我们的网站或添加到该标题的错误清单部分。
要查看之前提交的勘误表,请访问www.packtpub.com/books/content/support
,并在搜索字段中输入书籍名称。所需信息将显示在勘误部分。
盗版
在互联网上,版权材料盗版是一个跨所有媒体持续存在的问题。在 Packt,我们非常重视我们版权和许可证的保护。如果您在互联网上发现我们作品的任何非法副本,请立即提供位置地址或网站名称,以便我们可以追究补救措施。
请通过<copyright@packtpub.com>
与我们联系,并提供涉嫌盗版材料的链接。
我们感谢您在保护我们作者和我们为您提供有价值内容的能力方面的帮助。
问题和建议
如果您在这本书的任何方面遇到问题,您可以通过<questions@packtpub.com>
联系我们,我们将尽力解决问题。
第一章:机器学习概述
近年来,人工智能(AI)和机器学习在学术界和工业界都得到了复兴,尤其是机器学习。在过去十年中,人工智能取得了显著的成就,这些成就超越了该领域最初承诺以来在中间几年中从业者所取得的成就。
这些成功在很大程度上得益于处理日益增长的大量数据的迫切需求、深度学习领域研究人员不懈努力的关键算法进步,以及摩尔定律推动的原始计算能力的不断增长。在人工智能领域引领复苏的各个领域中,机器学习取得了显著的发展,并在众多领域找到了最广泛的应用。机器学习在帮助最高层级的商业复杂决策中的应用,以及它在提高如今已成为日常应用的准确性(如搜索、语音识别和手机上的个人助理)方面的巨大成功,使得其影响在家庭客厅和会议室中变得司空见惯。如今,不仅可以在科普科技媒体中找到对深度学习力量的狂热赞扬文章,还可以在主流媒体如《纽约时报》和《赫芬顿邮报》等地方找到。机器学习确实在相对较短的时间内变得无处不在。
一个普通的用户在日常活动中以多种方式遇到机器学习。大多数电子邮件服务提供商,包括雅虎和 Gmail,都为用户提供了自动将电子邮件分类到诸如垃圾邮件、垃圾邮件、促销等标题中的功能,这是通过文本挖掘(机器学习的一个分支)实现的。当在电子商务网站如www.amazon.com/
上在线购物或从内容提供商如 Netflix 观看电影时,用户会收到所谓的推荐系统提供的其他产品和内容推荐,这是机器学习的另一个分支,作为一种有效的方式留住客户。
预测天气、估算房地产价格、预测选民投票率,甚至预测选举结果——所有这些都可以说是使用某种形式的机器学习来窥视未来。
随着数据量的不断增长以及能够通过学习这些数据来丰富我们生活的系统的承诺,对数据科学领域有限的专业人员技能的需求也在不断增长。这种需求对于在更流行的语言(如 Java、Python、R 和越来越流行的 Scala)中熟悉机器学习技术的受过良好训练的专家来说尤其迫切。幸运的是,多亏了开源社区中的数千名贡献者,这些语言都有丰富且快速增长的库、框架和教程集,使得最前沿的技术对任何有互联网连接和电脑的人来说都触手可及,这在很大程度上得益于 Java。Java 是这种工具和技术传播的重要载体,尤其是在大规模机器学习项目中,这得益于其在企业级部署中的成熟度和稳定性,以及可移植的 JVM 平台,更不用说多年来采用它的专业程序员大军了。因此,掌握今天劳动力中如此缺乏的技能将使任何有志于进入该领域的专业人士在市场上处于明显的优势地位。
也许你已经在你的专业工作中应用了机器学习技术,或者你可能只是对这个主题有业余爱好者的兴趣。如果你正在阅读这篇文章,很可能你已经能够轻松地将 Java 应用于你的意愿,但现在你感觉你准备好深入挖掘并学习如何在你的下一个数据科学项目中使用最好的开源 ML Java 框架。如果你确实是这样,那么这本书中的章节设计来做到这一切以及更多是多么幸运!
掌握一门学科,尤其是像机器学习这样具有明显应用性的学科,不仅需要理解其核心概念和熟悉其数学基础,还需要更多。与该主题的入门级处理不同,一本声称帮助你掌握该主题的书必须非常关注实践方面,同时介绍更多高级主题,这些主题可能会超出入门材料的范围。在我们开始磨练我们的技能之前,我们将用这一章来快速回顾我们已经知道的内容。对于有志于充分利用这本书的初学者(即使他们对这个主题几乎没有或没有先前的接触,但仍然决心从中获得最大利益),这是我们的建议:确保你不跳过本章的其余部分;相反,将其用作跳板,更深入地探索不熟悉的概念。如有必要,寻求外部资源。查阅维基百科。然后立即回到学习上来。
在本章的剩余部分,我们将回顾以下内容:
-
历史与定义
-
什么是非机器学习?
-
概念与术语
-
机器学习的重要分支
-
机器学习中的不同数据类型
-
机器学习的应用
-
机器学习面临的问题
-
大多数机器学习项目中使用的元过程
-
本书将使用的一些知名工具、API 和资源的详细信息
机器学习 - 历史与定义
给出一个确切的历史很难,但我们今天使用的机器学习的定义最早可以追溯到 19 世纪 60 年代。在雷内·笛卡尔的《方法谈》中,他提到了自动机并说:
因为我们可以很容易地理解一个机器的构成,使其能够说出话语,甚至对它施加的某些物理动作做出响应,从而改变其器官;例如,如果触摸特定部位,它可能会问我们想对它说什么;如果在另一个部位,它可能会惊呼它受伤了,等等。
注意
www.earlymoderntexts.com/assets/pdfs/descartes1637.pdf
www.marxists.org/reference/archive/descartes/1635/discourse-method.htm
阿兰·图灵在他的著名出版物《计算机器与智能》中,通过提出“机器能思考吗?”的问题,对机器学习的目标提供了基本见解。
注意
csmt.uchicago.edu/annotations/turing.htm
www.csee.umbc.edu/courses/471/papers/turing.pdf
阿瑟·塞缪尔在 1959 年写道:"机器学习是研究计算机在没有明确编程的情况下获得学习能力的一个领域。"。
近期,汤姆·米切尔给出了机器学习的更精确定义:"如果一个计算机程序在任务 T 上,通过性能指标 P,从经验 E 中学习,那么它的性能随着经验 E 的提高而提高。"
机器学习与多个领域有关:
-
统计学: 它使用数据抽样、估计、假设检验、学习理论和基于统计的建模等元素,仅举几个例子。
-
算法与计算: 它使用了来自基础计算机科学的基本概念,如搜索、遍历、并行化、分布式计算等。
-
数据库与知识发现: 由于其能够以各种格式存储、检索和访问信息的能力。
-
模式识别: 由于其能够从数据中找到有趣的模式以进行探索、可视化和预测的能力。
-
人工智能: 虽然它被认为是人工智能的一个分支,但它也与其他分支有关,例如启发式、优化、进化计算等。
什么是机器学习?
认识到与机器学习有关但本身不能被视为机器学习一部分的领域很重要。某些学科可能在一定程度上重叠,但机器学习的基本原理是相当独特的:
-
商业智能(BI)和报告:报告关键绩效指标(KPIs),查询 OLAP 进行切片、切块和深入数据,仪表板等,这些都是 BI 的核心组件,并不等同于机器学习。
-
存储和 ETL:数据存储和 ETL 是任何机器学习过程中的关键元素,但它们本身并不等同于机器学习。
-
信息检索、搜索和查询:根据搜索标准或索引检索数据或文档的能力,这是信息检索的基础,并不真正等同于机器学习。许多形式的机器学习,如半监督学习,可以依赖于相似数据的搜索来进行建模,但这并不将搜索视为机器学习。
-
知识表示和推理:为了执行复杂任务(如本体、专家系统和语义网)而表示知识并不等同于机器学习。
机器学习——概念和术语
在本节中,我们将描述在机器学习中通常使用的不同概念和术语:
-
数据或数据集:机器学习的基础在于理解数据。数据或数据集通常指用于机器学习的结构化或非结构化格式的可用内容。结构化数据集具有特定的格式,非结构化数据集通常以某种自由流动的文本形式存在。数据可以以各种存储类型或格式存在。在结构化数据中,每个被称为实例、示例或行的元素都遵循预定义的结构。数据还可以按大小分类:小型或中型数据有几百到几千个实例,而大数据指的是大量数据,通常在数百万或数十亿,无法使用常见设备存储或访问,也无法适应这些设备的内存。
-
特征、属性、变量或维度:在结构化数据集中,如前所述,存在具有自身语义和数据类型的预定义元素,这些元素被统称为特征、属性、指标、指标、变量或维度。
-
数据类型:在许多机器学习算法或技术中,之前定义的特征需要某种形式的类型化。最常用的数据类型如下:
-
分类或名义:这表示数据集中存在的定义良好的类别或值。例如,眼睛颜色——黑色、蓝色、棕色、绿色、灰色;文档内容类型——文本、图像、视频。
-
连续或数值:这表示数据字段具有数值性质。例如,通过浴室秤测量的一个人的体重,传感器测量的温度读数,或信用卡账户的月美元余额。
-
有序:这表示数据可以按某种方式排序。例如,服装尺寸——小号、中号、大号;拳击重量级别:重量级、轻重量级、中量级、轻量级和雏量级。
-
-
目标或标签:数据集中用于从训练数据中学习并在未见数据集中预测的特征或特征集,被称为目标或标签。在某些领域也使用“地面真实”这个术语。标签可以具有之前指定的任何形式,即分类的、连续的或序数的。
-
机器学习模型:每个机器学习算法,基于从数据集中学习到的内容,保持其学习状态以预测或对未来或未见数据提供见解,这被称为机器学习模型。
-
抽样:数据抽样是机器学习中的一个基本步骤。抽样意味着从总体中选择一个子集的例子,目的是将(较小的)样本中观察到的行为视为(较大的)总体行为的代表。为了使样本能够代表总体,必须小心选择样本的方式。通常,总体由在问题域中具有感兴趣属性的所有对象组成,例如,所有有资格参加大选的人,或未来四年内所有潜在的汽车拥有者。由于通常收集总体中所有对象的资料是不切实际的(或不可能的),因此选择一个合适的子集用于分析。抽样过程中的一个关键考虑因素是样本相对于总体是无偏的。以下是基于概率的抽样类型:
-
均匀随机抽样:这指的是在均匀分布的总体上进行的抽样,即每个对象被选中的概率相等。
-
分层随机抽样:这指的是当数据可以分类为多个类别时使用的抽样方法。在这种情况下,为了确保样本中代表所有类别,根据这些分类将总体划分为不同的层,并且每个层按其在总体中类别的比例进行抽样。当总体密度在类别之间变化时,分层抽样很常见,并且比较这些类别时需要具有相同的统计能力。当已知不同的群体以显著不同的方式投票时,政治民意调查通常涉及分层抽样。在随机样本中每个群体的不成比例的代表性可能导致民意调查结果出现重大误差。当我们控制人口统计学因素时,我们可以避免对其他群体过度抽样。
-
聚类抽样:有时在研究的总体中存在自然群体,每个群体都代表了整个总体。一个例子是跨越许多地理区域的数据库。在聚类抽样中,你随机选择一组群体,然后从每个群体中随机抽取样本来构建完整的数据样本。这种抽样可以降低数据收集的成本,同时不会损害总体分布的保真度。
-
系统抽样:当抽样框架(将有限集合的对象视为总体,并作为抽样数据来源,例如,按标题字母顺序排列的维基百科文章集合)中存在某种顺序时,会使用系统抽样或间隔抽样。如果样本是通过从随机对象开始,跳过常数k个对象后选择下一个对象来选择的,那么这种抽样称为系统抽样。k的值是总体与样本大小的比率。
-
-
模型评估指标:评估模型性能通常基于不同类型学习的不同评估指标。在分类中,通常基于准确率、接收者操作特征(ROC)曲线、训练速度、内存需求、假阳性比率等,仅举几例(见第二章,实际应用监督学习)。在聚类中,找到的聚类数量、凝聚力、分离度等形成了一般的指标(见第三章,无监督机器学习技术)。在基于流的学习中,除了前面提到的标准指标外,适应性、学习速度和对突发变化的鲁棒性是评估学习器性能的一些传统指标(见第五章,实时流机器学习)。
为了说明这些概念,给出了一个常见样本天气数据集的具体示例。数据给出了一组天气条件和标签,该标签指示主题是否决定在当天打网球:
@relation weather
@attribute outlook {sunny, overcast, rainy}
@attribute temperature numeric
@attribute humidity numeric
@attribute windy {TRUE, FALSE}
@attribute play {yes, no}
@data
sunny,85,85,FALSE,no
sunny,80,90,TRUE,no
overcast,83,86,FALSE,yes
rainy,70,96,FALSE,yes
rainy,68,80,FALSE,yes
rainy,65,70,TRUE,no
overcast,64,65,TRUE,yes
sunny,72,95,FALSE,no
sunny,69,70,FALSE,yes
rainy,75,80,FALSE,yes
sunny,75,70,TRUE,yes
overcast,72,90,TRUE,yes
overcast,81,75,FALSE,yes
rainy,71,91,TRUE,no
数据集的格式是ARFF(属性-关系文件格式)文件。它由一个标题组成,提供有关特征或属性及其数据类型的信息,然后是数据标签之后的实际逗号分隔数据。数据集有五个特征,即outlook
、temperature
、humidity
、windy
和play
。特征outlook
和windy
是分类特征,而humidity
和temperature
是连续的。特征play
是目标,也是分类的。
机器学习 – 类型与亚型
现在我们将探讨机器学习的不同子类型或分支。尽管以下列表并不全面,但它涵盖了最知名的类型:
-
监督学习:这是机器学习中最受欢迎的分支,它涉及从标记数据中学习。如果标签的数据类型是分类的,它就变成了分类问题;如果是数字的,它就被称为回归问题。例如,如果使用数据集的目标是检测欺诈,欺诈具有真或假的分类值,我们处理的是一个分类问题。另一方面,如果目标是预测房屋的最佳上市价格,这是一个数值美元值,问题就是一个回归问题。下图展示了需要使用分类技术(如适合线性可分数据的逻辑回归)的标记数据,也就是说,当存在一条可以干净地分离两个类别的线时。对于可能线性可分的高维数据,人们谈论的是分离超平面:
线性可分数据
一个不是线性可分的数据集的例子。
这种类型的问题需要分类技术,例如支持向量机。
-
无监督学习:当没有给出标签时,理解数据并探索数据以构建机器学习模型被称为无监督学习。聚类、流形学习、异常值检测是这一主题下的技术,这些技术将在第三章《无监督机器学习技术》中详细讨论。需要无监督学习解决的问题有很多。根据购买行为对客户进行分组就是一个例子。在生物数据的情况下,可以使用无监督学习技术根据相似的基因表达值对组织样本进行聚类。
下图展示了具有固有结构的数据,这些结构可以通过无监督学习技术,如 k-means,揭示为不同的聚类:
数据中的聚类
使用不同的技术来检测全局异常值——相对于整个数据集而言异常的例子,以及局部异常值——在其邻域中不匹配的例子。在下图中,为两个特征数据集展示了局部和全局异常值的概念:
局部和全局异常值
-
半监督学习:当数据集只有一些标记数据以及大量未标记数据时,从这样的数据集中进行学习被称为半监督学习。例如,在处理旨在检测欺诈的金融数据时,可能会有大量未标记数据,而只有少量已知的欺诈和非欺诈交易。在这种情况下,可以应用半监督学习。
-
图挖掘:挖掘表示为图结构的数据被称为图挖掘。它是社交网络分析以及不同生物信息学、网络挖掘和社区挖掘应用中的结构分析的基础。
-
概率图建模和推理:学习和利用以图模型表示的特征之间的条件依赖结构属于概率图建模的分支。贝叶斯网络和马尔可夫随机场是这类模型的两个类别。
-
时间序列预测:这是一种学习形式,其中数据具有明显的时序行为,并且与时间的关系被建模。一个常见的例子是在金融预测中,某个特定领域的股票表现可能是预测模型的目标。
-
关联分析:这是一种学习形式,其中数据以项集或购物篮的形式存在,并建立关联规则来探索和预测项目之间的关系。关联分析中的一个常见例子是学习客户在访问杂货店时购买的最常见项目之间的关系。
-
强化学习:这是一种学习形式,其中机器根据从环境中获得的奖励或惩罚形式的反馈来最大化性能。一个著名的例子是 AlphaGo,这是谷歌开发的一种机器,在 2016 年 3 月决定性地击败了世界围棋冠军李世石。使用奖励和惩罚方案,该模型首先在监督学习阶段对数百万个棋盘位置进行训练,然后在强化学习阶段自我对弈,最终变得足够好,能够战胜最佳人类选手。
注意
www.theatlantic.com/technology/archive/2016/03/the-invisible-opponent/475611/
-
流学习或增量学习:以监督、无监督或半监督方式从实时或伪实时流数据中进行学习被称为流学习或增量学习。从不同类型的工业系统中学习传感器的行为以将其分类为正常和异常的应用需要实时反馈和实时检测。
机器学习中使用的数据集
要从数据中学习,我们必须能够理解和管理所有形式的数据。数据来源于许多不同的来源,因此,数据集在结构上可能差异很大,或者几乎没有结构。在本节中,我们以常见示例为依据,对数据集进行高级分类。
根据其结构或结构的缺失,数据集可以分为以下几种:
-
结构化数据:具有结构化数据的数据集更适合作为大多数机器学习算法的输入。数据以记录或行形式存在,遵循一个已知的格式,具有特征,这些特征可以是表格中的列或由分隔符或标记分隔的字段。记录或实例之间没有明确的关系。数据集主要在平面文件或关系数据库中可用。以下图所示的银行交易记录是一个结构化数据的例子:
带有欺诈标签的金融卡交易数据
-
交易或市场数据:这是一种特殊形式的结构化数据,其中每个条目对应一组项目。市场数据集的例子包括不同客户购买的杂货清单或客户观看的电影,如下表所示:
来自杂货店的商品市场数据集
-
非结构化数据:非结构化数据通常不以已知的格式存在,与结构化数据不同。文本数据、图像数据和视频数据是非结构化数据的不同格式。通常,需要某种形式的转换来从这些数据形式中提取特征,以便将其转换为结构化数据集,从而应用传统的机器学习算法。
样本文本数据,没有可识别的结构,因此是非结构化的。将垃圾邮件与正常消息(ham)区分开来是一个二元分类问题。在这里,通过它们的标签(每个数据实例中的第二个标记)区分真正的阳性(垃圾邮件)和真正的阴性(ham)。SMS 垃圾邮件收集数据集(UCI 机器学习库),来源:来自联邦大学圣卡洛斯分校的 Tiago A. Almeida。
-
序列数据:序列数据具有明确的“顺序”概念。这种顺序可以是时间序列数据中特征与时间变量之间的关系,或者是在基因组数据集中以某种形式重复的符号。序列数据的两个例子是天气数据和基因组序列数据。以下图显示了时间和传感器级别之间的关系:
来自传感器数据的时间序列
考虑了三个基因组序列,以展示这三个基因组序列中
CGGGT
和TTGAAAGTGGTG
的重复情况:DNA 的基因组序列作为符号序列。
-
图数据:图数据的特点是数据中实体之间存在关系,形成图结构。图数据集可以是结构化记录格式或非结构化格式。通常,图关系必须从数据集中挖掘出来。保险领域的索赔可以被认为是包含相关索赔细节的结构化记录,索赔人通过地址、电话号码等相关联。这可以看作是图结构。以万维网为例,我们有网页作为非结构化数据,包含链接,以及可以使用网页链接构建的网页之间的关系图,从而产生了今天最广泛挖掘的图数据集之一:
将保险索赔数据转换为表示车辆、驾驶员、保单和地址之间关系的图结构
机器学习应用
由于机器学习在人类努力的不同领域的快速增长使用,任何试图列出在不同行业中使用的某些形式的机器学习的典型应用都必须是不完整的。尽管如此,在本节中,我们按领域和所采用的学习类型列出了一组广泛的机器学习应用:
领域/行业 | 应用 | 机器学习类型 |
---|---|---|
金融 | 信用风险评估、欺诈检测和反洗钱 | 监督学习、无监督学习、图模型、时间序列和流学习 |
网络 | 在线活动、健康监控和广告定位 | 监督学习、无监督学习和半监督学习 |
医疗保健 | 基于证据的医学、流行病学监控、药物事件预测和索赔欺诈检测 | 监督学习、无监督学习、图模型、时间序列和流学习 |
物联网(IoT) | 网络安全、智能道路和传感器健康监控 | 监督学习、无监督学习、半监督学习和流学习 |
环境 | 天气预报、污染建模和水质量测量 | 时间序列、监督学习、无监督学习、半监督学习和流学习 |
零售 | 库存、客户管理和推荐、布局和预测 | 时间序列、监督学习、无监督学习、半监督学习和流学习 |
机器学习的应用
机器学习中的实际问题
在处理需要机器学习的问题时,理解约束的性质和可能出现的次优条件是必要的。在接下来的章节讨论中,我们将解决这些问题性质、它们存在的影响以及处理它们的方法。在此,我们简要介绍我们面临的实际问题:
-
数据质量和噪声:缺失值、重复值、由于人为或仪器记录错误导致的错误值以及格式错误是在构建机器学习模型时需要考虑的一些重要问题。不处理数据质量可能导致模型错误或不完整。在下一章中,我们将强调这些问题以及一些通过数据清洗克服这些问题的策略。
-
不平衡数据集:在许多现实世界的数据集中,训练数据中的标签之间存在不平衡。这种数据集的不平衡会影响学习选择、算法选择、模型评估和验证过程。如果不采用正确的技术,模型可能会出现大的偏差,学习效果不佳。下一章将详细介绍各种使用元学习过程的技术,如成本敏感学习、集成学习、异常检测等,这些技术可以应用于这些情况。
-
数据量、速度和可扩展性:通常,大量数据以原始形式或高速实时流数据的形式存在。由于算法或硬件限制或两者的组合,从整个数据中学习变得不可行。为了将数据集的大小减少到适合可用资源,必须进行数据采样。采样可以通过多种方式进行,每种采样形式都会引入偏差。必须通过采用各种技术,如分层采样、变化样本大小和在不同集合上增加实验规模,来验证模型对样本偏差的适应性。使用大数据机器学习也可以克服数据量和采样偏差。
-
过拟合:预测模型的核心问题之一是模型泛化不足,被训练数据拟合得“太好”。这导致模型在应用于未见数据时表现不佳。后续章节中描述了各种克服这些问题的技术。
-
维度诅咒:在处理高维数据时,即具有大量特征的数据集,机器学习算法的可扩展性成为一个严重的问题。向数据添加更多特征的问题之一是它引入了稀疏性,即在特征空间的单位体积中平均数据点更少,除非特征数量的增加伴随着训练示例数量的指数级增加。这可能会损害许多方法,如基于距离的算法的性能。添加更多特征也可能降低学习者的预测能力,如以下图所示。在这种情况下,需要更合适的算法,或者必须降低数据的维度。
在分类学习中体现的维度诅咒,其中添加更多特征会降低分类器的性能。
机器学习 - 角色和流程
将机器学习应用于大型问题的任何努力都需要多个角色的协作,每个角色都遵循一套旨在确保严谨性、效率和鲁棒性的系统流程。以下角色和流程确保了在开始时明确界定努力的目标,并在数据分析、数据抽样、模型选择、部署和性能评估等方面采用正确的方法论——所有这些都是进行一致性和可重复性分析的综合框架的一部分。
角色
参与者在每个步骤中扮演特定的角色。这些责任在以下四个角色中得以体现:
-
业务领域专家:了解问题领域的主题专家
-
数据工程师:参与数据的收集、转换和清洗
-
项目经理:流程顺利运行的监督者
-
数据科学家或机器学习专家:负责应用描述性或预测性分析技术
流程
CRISP(跨行业标准流程)是一个知名的高级数据挖掘流程模型,它定义了分析流程。在本节中,我们对 CRISP 流程添加了一些自己的扩展,使其更加全面,更适合使用机器学习进行数据分析。整个迭代过程在以下示意图中展示。我们将在本节中详细讨论流程的每一步。
-
识别业务问题:理解项目或流程的目标和最终目标是第一步。这通常由业务领域专家与项目经理和机器学习专家共同完成。在数据可用性、格式、规格、收集、投资回报率、商业价值、交付成果等方面,最终目标是什么?所有这些问题都在这个阶段讨论。明确地识别目标,并在可能的情况下以可衡量的术语进行,例如节省的金额、找到预定义数量的异常或聚类,或者预测不超过一定数量的假阳性等,是这个阶段的重要目标。
-
机器学习映射:下一步是将业务问题映射到前文讨论的机器学习类型之一或多个。这一步骤通常由机器学习专家执行。在这个过程中,我们确定是否只使用一种学习形式(例如,监督学习、无监督学习、半监督学习)或者混合形式更适合项目。
-
数据收集:获取处理所需格式的原始数据,并遵循既定的规范,这是下一步。这一步通常由数据工程师执行,可能需要处理一些基本的 ETL 步骤。
-
数据质量分析:在这一步中,我们对数据进行缺失值、重复值等分析,对分类和连续类型进行基本统计分析,以及类似任务来评估数据质量。数据工程师和数据科学家可以共同执行这些任务。
-
数据采样和转换:确定数据是否需要划分为样本,并执行不同大小的数据采样以进行训练、验证或测试——这些是在这一步执行的任务。它包括采用不同的采样技术,如对训练数据集进行过采样和随机采样,以便算法能够有效地学习,尤其是在标签数据高度不平衡的情况下。数据科学家参与这项任务。
-
特征分析和选择:这是一个结合建模的迭代过程,在许多任务中确保对特征进行评估,以确定它们的区分度或有效性。这可能包括寻找新的特征、转换现有特征、处理前面提到的数据质量问题、选择特征子集等,在建模过程之前进行。数据科学家通常负责这项任务。
-
机器学习建模:这是一个基于数据特征和学习类型的迭代过程,针对不同的算法进行工作。它涉及不同的步骤,如生成假设、选择算法、调整参数,并通过评估结果来找到符合标准模型的步骤。数据科学家执行这项任务。
-
模型评估:虽然这一步在一定程度上与前面的所有步骤都有关联,但它与业务理解阶段和机器学习映射阶段更为紧密相关。评估标准必须以某种方式映射到业务问题或目标。每个问题/项目都有自己的目标,无论是提高真正阳性、减少假阳性、寻找异常簇或行为,还是分析不同簇的数据。根据学习技术,使用不同的技术来隐式或显式地衡量这些目标。数据科学家和业务领域专家通常参与这一步骤。
-
模型选择和部署:根据评估标准,选择一个或多个模型——可以是独立的或作为集成——。模型的部署通常需要解决几个问题:运行时可扩展性措施、环境的执行规范和审计信息等。基于学习的关键参数捕获的审计信息是流程的一个基本部分。它确保模型性能可以跟踪和比较,以检查模型的老化和退化。保存关键信息,如训练数据量、日期、数据质量分析等,与学习类型无关。监督学习可能涉及保存混淆矩阵、真正例率、假正例率、ROC 曲线下面积、精确度、召回率、错误率等。无监督学习可能涉及聚类或异常评估结果、聚类统计等。这是数据科学家和项目经理的领域。
-
模型性能监控:这项任务涉及定期跟踪模型性能,根据其评估的标准,如真正例率、假正例率、性能速度、内存分配等。衡量这些指标与训练模型性能连续评估之间的偏差至关重要。随着时间的推移,偏差和偏差容忍度将提供有关重复过程或调整模型的信息。数据科学家负责这一阶段。
如前图所示,整个过程是一个迭代的过程。在部署了一个或一组模型之后,商业和环境因素可能会以影响解决方案性能的方式发生变化,需要重新评估业务目标和成功标准。这又把我们带回了循环中。
机器学习 – 工具和数据集
要熟练掌握成功完成任何规模或复杂度机器学习项目的必要技术,一个可靠的方法是通过使用广泛使用的数据集进行实验,熟悉可用的工具和框架,正如后续章节所展示的。以下列表提供了一个对最流行的 Java 框架的简要概述。后续章节将包括您将使用以下工具进行的实验:
-
RapidMiner:一个领先的分析平台,RapidMiner 提供多种产品,包括 Studio,一个用于流程的可视化设计框架,Server,一个通过允许共享数据源、流程和实践来促进协作环境的产品,以及 Radoop,一个具有将部署和执行转换为 Hadoop 生态系统功能的系统。RapidMiner Cloud 提供了一个基于云的存储库和按需计算能力。
-
许可证:GPL(社区版)和商业版(企业版)
-
网站:
rapidminer.com/
-
-
Weka: 这是一个综合性的开源 Java 工具集,用于数据挖掘和构建机器学习应用,拥有自己的公共数据集集合。
-
许可证: GPL
-
-
Knime: KNIME 分析平台(我们被鼓励以无声的 k 发音,即“naime”)是用 Java 编写的,提供了一个集成的工具集、丰富的算法集和可视化的工作流程,无需标准编程语言(如 Java、Python 和 R)即可进行数据分析。然而,人们可以用 Java 和其他语言编写脚本以实现 KNIME 中未本地提供的功能。
-
许可证: GNU GPL v3
-
网站:
www.knime.org/
-
-
Mallet: 这是一个用于 NLP 的 Java 库。它提供文档分类、序列标记、主题建模以及其他基于机器学习的文本应用,以及用于任务管道的 API。
-
许可证: 公共公共许可证版本 1.0 (CPL-1)
-
-
Elki: 这是一个以研究为导向的 Java 软件,主要专注于使用无监督算法进行数据挖掘。它通过使用改进多维数据访问性能的数据索引结构,实现了高性能和可扩展性。
-
许可证: AGPLv3
-
-
JCLAL: 这是一个用于主动学习的 Java 类库,是一个开发主动学习方法的开源框架,该方法是处理从标记和无标记数据混合中学习预测模型(半监督学习是另一个领域)的领域之一。
-
许可证: GNU 通用公共许可证版本 3.0 (GPLv3)
-
-
KEEL: 这是一个用 Java 编写的开源软件,主要用于设计实验,特别适合于实现基于进化学习和软计算技术的数据挖掘问题。
-
许可证: GPLv3
-
网站:
www.keel.es/
-
-
DeepLearning4J: 这是一个用于 Java 和 Scala 的分布式深度学习库。DeepLearning4J 与 Spark 和 Hadoop 集成。异常检测和推荐系统是适合通过深度学习技术生成的模型的应用案例。
-
许可证: Apache 许可证 2.0
-
-
Spark-MLlib: (包含在 Apache Spark 发行版中)MLlib 是 Spark 中包含的机器学习库,主要用 Scala 和 Java 编写。自从 Spark 中引入了 Data Frames,推荐使用基于 Data Frames 编写的
spark.ml
包,而不是原始的spark.mllib
包。MLlib 包括对分析过程所有阶段的支持,包括统计方法、分类和回归算法、聚类、降维、特征提取、模型评估以及 PMML 支持,等等。MLlib 的另一个方面是支持使用管道或工作流。MLlib 可从 R、Scala 和 Python 访问,除了 Java 之外。-
许可证: Apache 许可证 v2.0
-
-
H2O: H2O 是一个基于 Java 的库,除了 Java 之外,还支持 R 和 Python 的 API。H2O 还可以在 Spark 上作为其自己的应用程序 Sparkling Water 运行。H2O Flow 是一个基于网页的交互式环境,在单个笔记本样式的文档中包含可执行单元格和丰富的媒体。
-
许可证: Apache 许可证 v2.0
-
网站:
www.h2o.ai/
-
-
MOA/SAMOA: 针对从数据流中进行机器学习,SAMOA 提供了流处理平台的插件式接口,截至写作时,SAMOA 是 Apache 孵化器项目。
-
许可证: Apache 许可证 v2.0
-
-
Neo4j: Neo4j 是一个用 Java 和 Scala 实现的开源 NoSQL 图形数据库。正如我们将在后面的章节中看到的,图分析有多种用途,包括匹配、路由、社交网络、网络管理和更多。Neo4j 支持完全 ACID 事务。
-
许可证: 社区版—GPLv3 和企业版—包括商业和教育等多个选项 (
neo4j.com/licensing/
) -
网站:
neo4j.com/
-
-
GraphX: 这包含在 Apache Spark 发行版中。GraphX 是 Spark 的图形库。API 提供了对查看和操作图结构以及一些图算法的广泛支持,例如 PageRank、连通组件和三角形计数。
-
许可证: Apache 许可证 v2.0
-
-
OpenMarkov: OpenMarkov 是一个用于编辑和评估概率图模型(PGM)的工具。它包括一个用于交互式学习的图形用户界面。
-
许可证: EUPLv1.1 (
joinup.ec.europa.eu/community/eupl/og_page/eupl
)
-
-
Smile: Smile 是一个针对 JVM 的机器学习平台,拥有丰富的算法库。其功能包括自然语言处理(NLP)、流形学习、关联规则、遗传算法以及一套用于可视化的多功能工具。
-
许可证: Apache 许可证 2.0
-
数据集
许多公开可用的数据集极大地促进了数据科学的研究和学习。以下列出的数据集中,有一些是广为人知的,多年来被众多研究人员用来作为他们方法的基准。不断有新的数据集被提供出来,以满足不同建模者和用户群体的需求。大多数数据集来自不同领域的现实世界数据。本卷中的练习将使用此列表中的几个数据集。
-
UC Irvine (UCI) 数据库: 由加州大学欧文分校(UCI)机器学习与智能系统中心维护的 UCI 数据库是一个包含约 350 个不同大小数据集的目录,从几十个到超过四千万条记录,以及最多三百万个属性,包括多元文本、时间序列和其他数据类型。(
archive.ics.uci.edu/ml/index.html
) -
Tunedit: (
tunedit.org/
) 这提供了 Tunedit 挑战和进行可重复数据挖掘实验的工具。它还提供了一个举办数据竞赛的平台。 -
Mldata.org: (
mldata.org/
) 由 PASCAL 2 组织支持,该组织汇集了欧洲和世界各地的研究人员和学生,mldata.org 主要是一个用户贡献的数据集存储库,鼓励研究人员群体之间进行数据和解决方案的共享,以帮助实现创建可重复解决方案的目标。 -
KDD 挑战数据集: (
www.kdnuggets.com/datasets/index.html
) KDNuggets 聚合了来自广泛领域的多个数据集存储库。 -
Kaggle: 被誉为“数据科学之家”,Kaggle 是领先的数据科学竞赛平台,也是过去竞赛和用户提交的数据集的存储库。
摘要
尽管机器学习是一个相对较新的领域,但它已经展示了令人印象深刻的成功。随着 Java 资源的普遍存在,Java 的平台独立性以及 Java 中 ML 框架的选择,使用 Java 进行机器学习的卓越技能在当今市场上是一种高度渴望的资产。
机器学习以某种形式存在——至少在思考者的想象中,一开始就是如此——已经很长时间了。然而,最近的发展在许多日常生活的领域产生了革命性的影响。机器学习与统计学、人工智能以及几个其他相关领域有很多共同之处。虽然一些数据管理、商业智能和知识表示系统也可能与数据在每个系统中的核心作用有关,但它们通常不与机器学习领域中体现的数据学习原则相关联。
任何关于机器学习的讨论都会假设对数据及其数据类型有所了解。它们是分类的、连续的还是有序的?数据特征是什么?目标是什么,哪些是预测因子?可以使用哪些采样方法——均匀随机、分层随机、聚类或系统抽样?模型是什么?我们看到了一个包含分类和连续特征的 ARFF 格式的天气数据示例集。
机器学习的类型包括监督学习,当有标记数据时最常见,无监督学习当没有标记数据时,以及半监督学习当我们有两者混合时。接下来的章节将详细介绍这些,以及图挖掘、概率图建模、深度学习、流学习和大数据学习。
数据以多种形式存在:结构化、非结构化、事务性、顺序性和图。我们将在本书后面的练习中使用不同结构的数据。
领域列表和不同类型的机器学习应用不断增长。本综述介绍了最活跃的领域和应用。
理解并有效地处理实际问题,如噪声数据、倾斜数据集、过拟合、数据量和维度诅咒,是成功项目的关键——这也是每个项目在其挑战中的独特之处。
使用机器学习的分析是一个涉及多个角色和明确流程的协作努力。为了获得一致和可重复的结果,采用这里概述的增强 CRISP 方法论至关重要——从理解业务问题到数据质量分析、建模和模型评估,最后到模型性能监控。
数据科学从业者有幸拥有一个丰富且不断增长的公共数据集目录,以及 Java 和其他语言中不断增加的机器学习框架和工具集。在接下来的章节中,你将了解几个数据集、API 和框架,以及高级概念和技术,以帮助你掌握机器学习所需的一切。
准备好了吗?那么,我们就继续吧!
第二章. 实际应用中的现实世界监督学习
从带有明显目标或标签的观察中学习的能力,通常是为了对未见数据做出预测,这被称为监督机器学习。如果目标是类别,则问题属于分类;如果目标是数值,则称为回归。实际上,所尝试的是推断将数据映射到目标的功能。监督机器学习在广泛的机器学习应用中被广泛使用,无论是有标签数据可用还是标签可以手动添加。
监督机器学习的核心假设是,从训练数据中学习到的模式将在未见数据中表现出来。
在本章中,我们将讨论在训练模型之前用于探索、分析和预处理数据的步骤。然后,我们将介绍从简单的线性模型到复杂的集成模型的不同建模技术。我们将展示不同的评估指标和验证标准,这些标准使我们能够比较模型性能。一些讨论伴随着简短的数学解释,这有助于更精确地表达概念并激发更多数学倾向读者的兴趣。在本章中,我们将重点关注分类作为监督学习方法,但原则同样适用于分类和回归,这是监督学习的两个广泛应用。
从本章开始,我们将介绍工具来帮助说明每个章节中提出的概念是如何用于解决机器学习问题的。没有什么比将新学的材料直接应用于现实世界问题更能加强对新材料的理解了。在这个过程中,我们往往比仅仅被动吸收理论更能获得更清晰、更相关的理解。如果学习新工具的机会是学习的一部分,那就更好了!为了达到这个目标,我们将介绍一个大多数数据科学从业者都熟悉的数据集,并使用它来解决一个分类问题,同时突出引导解决方案的过程和方法。
在本章中,我们将使用 RapidMiner 和 Weka 来构建从单个知名数据集中学习的过程。工作流程和代码可在网站上供读者下载、执行和修改。
RapidMiner 是一个基于 GUI 的 Java 框架,它使得在工具内部从头到尾进行数据科学项目变得非常容易。它有一个简单的拖放界面来构建工作流程,用于摄取和清理数据,探索和转换特征,使用广泛的机器学习算法进行训练,进行验证和模型评估,将最佳模型应用于测试数据,等等。它是学习如何使流程的各个部分协同工作并快速产生结果的一个优秀工具。Weka 是另一个基于 GUI 的框架,它有一个我们将用于说明执行分析所需的更多编码的 Java API。
本章我们将涵盖的主要主题包括:
-
数据质量分析
-
描述性数据分析
-
可视化分析
-
数据转换和预处理
-
数据采样
-
特征相关性分析和降维
-
模型构建
-
模型评估、评估和比较
-
案例研究—马绞痛分类
形式描述和符号
我们希望介绍一些用于监督学习中使用的术语的符号和形式定义。在不指定的情况下,我们将遵循这种符号贯穿本书的其余部分,并在遇到新概念时适当扩展。这种符号将提供一个精确和一致的语言来描述术语,并使对主题的理解更加快速和高效。
-
实例:每个观察都是数据实例。通常变量 X 用于表示输入空间。每个数据实例有许多变量(也称为特征),被称为 x(用粗体表示的向量表示)的维度为 d,其中 d 表示每个实例中的变量或特征或属性的数量。特征表示为 x = (x[1],x[2],…x[d])^T,其中每个值在它是数值时对应于特征值。
-
标签:标签(也称为目标)是感兴趣的因变量,通常用 y 表示。在 分类 中,标签的值是问题域中定义良好的类别;它们不需要是数值或可以排序的事物。在 回归 中,标签是实数值。
-
二元分类,其中目标只取两个值,在数学上表示为:
y ∈
-
回归,其中目标可以取实数域内的任何值,表示为:
-
数据集:通常,数据集用 D 表示,由单个数据实例及其标签组成。实例通常表示为集合 {x[1],x[2]…x[n]}。每个实例的标签表示为集合 y = {y[1],y[2],…y[n]}。整个标记数据集表示为集合中的配对元素,如 D = {(x[1], y[1]),(x[2], y[2])…(x[n], y[n])},其中
用于实值特征。
数据质量分析
从质量较差的数据中可以学习到的东西有限。质量问题的因素可能包括,但不仅限于,噪声数据、缺失值和标签错误。因此,第一步是理解我们面前的数据,以便我们确定如何解决任何数据质量问题。异常值仅仅是噪声,还是表明人口中有有趣的异常?对于所有特征,缺失数据是否应该以相同的方式处理?稀疏特征应该如何处理?这些问题以及类似的问题在最初就显现出来。
如果我们很幸运,我们会收到一个清洗过的、准确标记的数据集,并附带描述数据元素、数据的血统以及是否对数据进行过任何转换的文档。这样的数据集就可以准备好按照数据采样部分描述的方法分成训练、验证和测试样本。然而,如果数据没有清洗并且不适合用于我们的目的,我们必须在采样开始之前以原则性的方式准备数据。(数据分区的意义将在本章的“训练、验证和测试集”部分中解释)。
在接下来的章节中,我们将讨论在分析特征之前所需的数据质量分析和转换步骤。
描述性数据分析
应对以下特征进行分析和总结的完整数据样本(包括训练、验证和测试)。在数据尚未分成训练、验证和测试的情况下,数据转换的任务需要确保样本具有相似的特征和统计信息。这对于确保训练的模型可以泛化到未见过的数据至关重要,正如我们将在数据采样部分所学到的。
基本标签分析
分析的第一步是理解不同集合以及整体数据中标签的分布。这有助于确定例如目标变量的分布是否存在不平衡,以及这种不平衡是否在所有样本中一致。因此,第一步通常是找出训练集和测试集中每个类别的例子数量。
基本特征分析
下一步是计算每个特征的统计信息,例如
-
唯一值的数量
-
缺失值的数量:可能包括按不同缺失值代理(NA、null、?等)分组的计数。
-
对于分类:这是跨特征类别的计数,按标签类别跨特征类别的计数,最频繁出现的类别(众数),按标签类别的众数等。
-
对于数值:最小值、最大值、中位数、标准差、方差等。
特征分析提供了基本的见解,这些见解可以作为缺失值和噪声的有用指标,这些缺失值和噪声可能会影响学习过程或算法的选择。
可视化分析
数据的可视化是一个广泛的话题,它是在机器学习和数据挖掘领域不断发展的一个领域。我们只将涵盖一些有助于我们在实践中分析数据的可视化重要方面。
单变量特征分析
这里的目标是每次可视化一个特征,与标签相关。使用的技术如下:
分类特征
堆叠条形图是一种简单的方式来展示每个特征类别在标签中的分布,当问题是一类分类时。
连续特征
直方图和箱线图是连续特征的两种基本可视化技术。
直方图有预定义的区间,其宽度要么是固定的间隔,要么是基于某种用于分割特征值全范围的计算。然后计算每个区间内的数据实例数量,并根据这个计数调整区间的身高。直方图有各种变体,如相对直方图或基于频率的直方图、帕累托直方图、二维直方图等;每个都是概念的一小部分变化,允许对特征有不同见解。对于那些想了解更多关于这些变体的人来说,维基百科上的直方图文章是一个很好的资源。
箱线图是数值特征的键视觉技术,因为它们以百分位数和异常值来展示分布。
多变量特征分析
多变量特征分析的想法是可视化多个特征,以深入了解它们之间的关系。这里解释了一些著名的图表。
-
散点图:理解不同特征之间以及特征和标签之间关系的重要技术。在实践中通常使用二维散点图,其中数值特征形成维度。数据点在某些想象轴上的对齐显示相关性,而数据点的散射则显示无相关性。它还可以用于在低维空间中识别簇。气泡图是散点图的变体,其中两个特征形成维度轴,第三个特征与数据点的尺寸成比例,该图呈现出“气泡”场的样子。密度图通过引入数据点颜色、背景颜色等,帮助可视化更多特征,从而提供额外的见解。
-
散点图矩阵:散点图矩阵是散点图的扩展,其中为每个特征(和标签)可视化了成对的散点图。它提供了一种有效的方式,以比较和执行高维数据的多元分析。
-
并行图:在这种可视化中,每个特征线性排列在 x 轴上,每个特征的值域形成 y 轴。因此,每个数据元素都表示为一条线,该线上的每个特征值都位于平行轴上。如果可用,类标签用于着色线条。并行图提供了对有效分离数据的特征的良好理解。偏差图是并行图的变体,其中不是显示实际数据点,而是绘制均值和标准偏差。Andrews 图是并行图的另一种变体,其中使用傅里叶级数转换数据,并将对应于每个数据的函数值投影。
数据转换和预处理
在本节中,我们将涵盖数据转换的广泛主题。数据转换的主要思想是将输入数据以谨慎的方式进行转换,以便对其进行清理,从中提取最相关的信息,并将其转换为可用于进一步分析和学习的可用形式。在这些转换过程中,我们必须只使用在设计时考虑到不添加任何可能影响数据完整性的偏差或伪影的方法。
特征构建
在某些数据集的情况下,我们需要从已给出的特征中创建更多特征。通常,会使用常见的聚合器,如平均值、总和、最小值或最大值,以创建额外的特征。例如,在金融欺诈检测中,卡欺诈数据集通常包含账户在活跃期间不同时间段的交易行为。通过捕获“每天发生借记交易时的金额总和,对于每个账户,一天之内”的行为合成,就是一个特征构建的例子,它为数据集添加了一个新的维度,这个维度是由现有特征构建的。一般来说,设计新的特征以增强数据的预测能力需要领域知识和对数据的经验,这使得它既是一门艺术也是一门科学。
处理缺失值
在现实世界的数据集中,通常许多特征都有缺失值。在某些情况下,它们是因测量错误、记录失误或由于各种情况下的不可用而缺失;例如,个人可能选择不透露年龄或职业。为什么要在乎缺失值呢?一种极端且不罕见的方法是忽略任何具有缺失特征的记录,换句话说,只保留“完整”的例子。当数据中广泛存在缺失特征时,这种方法可能会严重减少数据集的大小。正如我们稍后将要看到的,如果我们处理的是一个复杂系统,数据集的大小可以给我们带来宝贵的优势。此外,即使存在缺失值,只要我们使用适当的措施来处理问题,即使在“不完整”的记录中,也常常可以挖掘出有预测价值的值。另一方面,当数据本身的省略本身具有重要意义时,如贷款申请中故意隐瞒信息以掩盖事实的情况,可能会无意中丢弃关键信息。
以下是学习过程中的一个重要步骤,即采用某种系统的方式来处理缺失值,并理解每个案例中决策的后果。有一些算法,如朴素贝叶斯,对缺失值不太敏感,但通常,在数据上进行分析之前,将这些缺失值作为预处理步骤处理是良好的实践。以下是一些处理缺失值的方法。
-
用均值和众数替换:当我们用特征的均值替换连续值特征的缺失值时,新的均值显然保持不变。但如果均值受到异常值的影响很大,更好的方法可能是使用计算中去除异常值后的均值,或者使用中位数或众数,而不是均值。同样,当特征在数据集中稀疏表示时,均值可能没有意义。对于具有分类值的特征,用样本中出现频率最高的值替换缺失值是一个合理的选择。
-
通过插补替换:当我们插补一个缺失值时,实际上是在构建一个关于该特征的分类或回归模型,并基于记录中的其他特征进行预测,以便对缺失值进行分类或估计。
-
最近邻插补法:对于分类特征的缺失值,我们将该特征视为目标,并使用已知的类别数量 k 训练一个 KNN 模型。然后使用此模型来预测缺失值。(KNN 模型是非参数的,根据其邻居的函数为其“传入”数据实例分配一个值——该算法将在本章后面关于非线性模型时进行描述)。
-
基于回归的插补:在连续值变量的情况下,我们使用线性模型如线性回归来估计缺失数据——原理与分类值相同。
-
用户定义的插补:在许多情况下,用于插补缺失值的最合适的值必须来自问题域。例如,pH 值为 7.0 是中性的,更高的是碱性,更低的是酸性。对于 pH 值,插补一个中性值可能比均值或中位数更有意义,这种洞察力是用户定义插补的一个例子。同样,在用正常体温或静息心率进行替换的情况下——所有这些都是来自医学的例子。
异常值
处理异常值需要大量的注意和分析。异常值可能是数据中的噪声或错误,也可能是特定感兴趣的特殊行为。后一种情况在第三章“无监督机器学习技术”中进行了深入讨论。在这里,我们假设前一种情况,即领域专家满意地认为这些值确实是第一种意义上的异常值,即噪声或错误获取或记录的数据,需要适当处理。
以下是检测数据中异常值的不同技术
-
四分位数范围(IQR):四分位数范围是数据变异性的度量,或者说,是统计分散度的度量。每个数值特征根据其在数据集中的值进行排序,然后有序集被分为四分位数。通常使用中位数来衡量集中趋势。IQR 被测量为上四分位数和下四分位数的差,即 Q3-Q1。通常认为,异常值是高于 Q3 + 1.5 * IQR 和低于 Q1 - 1.5 * IQR 的数据值。
-
基于距离的方法:基于距离的最基本方法使用k-最近邻(k-NN)和距离度量来评分数据点。通常的参数是 k-NN 中的值k和一个距离度量,如欧几里得距离。距离最远的数据点被认为是异常值。有许多变体使用局部邻域、概率或其他因素,这些将在第三章,无监督机器学习技术中全部涵盖。混合数据集,既有分类特征又有数值特征,可能会扭曲基于距离的度量。
-
基于密度的方法:基于密度的方法计算给定距离D内数据点的比例,如果比例小于指定的阈值p,则被认为是异常值。参数p和D被认为是用户定义的值;选择这些值适当的挑战是使用这些方法在预处理阶段的主要障碍之一。
-
特征的数学变换:对于非正态数据,比较平均值是非常误导的,例如在存在异常值的情况下。非参数统计使我们能够对高度偏斜的数据做出有意义的观察。使用对数或平方根函数对这些值进行变换往往会在许多情况下使数据归一化,或者使它们更容易进行统计测试。这些变换会极大地改变特征的分布形状——异常值越极端,对数变换的影响就越大,例如。
-
在机器学习模型中使用鲁棒统计算法处理异常值:我们将在下一节建模中讨论的许多分类算法,隐式或显式地处理异常值。作为元学习框架的 Bagging 和 Boosting 变体,通常对异常值或噪声数据点具有弹性,可能不需要预处理步骤来处理它们。
-
归一化:许多算法——基于距离的方法就是一个例子——对特征的规模非常敏感。预处理数值特征确保它们都在一个良好的行为范围内。这里给出了特征归一化的最知名技术:
-
最小-最大标准化:在这种技术中,给定范围 [L,U],通常是 [0,1],每个具有值 x 的特征分别使用最小值和最大值 x[max] 和 x[min] 进行归一化,使用以下公式:
-
Z 分数标准化:在这种技术中,也称为标准化,特征值会自动转换,使得平均值是 0,标准差是 1。转换的技术如下:对于每个特征 f,计算其均值 µ(f) 和标准差 σ(f),然后将具有值 x 的特征转换如下:
-
离散化
许多算法只能处理分类值或名义值才能有效,例如贝叶斯网络。在这种情况下,将数值特征通过监督或无监督方法离散化为类别变得至关重要。讨论的一些技术包括:
-
通过分箱进行离散化:这种技术也被称为等宽离散化。对于每个特征 f 的整个数据范围,从值 x[max] 到 x[min],被划分为预定义的 k 个等间隔,每个间隔的宽度为
。"切割点"或离散化间隔如下:
-
通过频率进行离散化:这种技术也被称为等频率离散化。特征被排序后,整个数据被离散化为预定义的 k 个间隔,使得每个间隔包含相同比例的数据。这两种技术,通过分箱和通过频率的离散化,由于预定义的 k 值而损失信息。
-
通过熵进行离散化:给定标签,计算在值变化的迭代点处的熵,使得区间的箱子尽可能纯净或具有区分性。请参阅特征评估技术部分,了解基于熵(信息增益)的理论和计算。
数据采样
接收到的数据集可能经常需要谨慎采样,以便有效地从数据中学习。数据的特征以及建模练习的目标决定了是否需要采样,以及如何进行。在我们开始从这些数据中学习之前,创建训练、验证和测试数据样本至关重要,如本节所述。
是否需要采样?
当数据集很大或噪声较多,或者偏向于某一类型时,是否进行采样的问题变得重要。答案取决于各种方面,如数据集本身、目标以及用于选择模型的评估标准,以及可能的其他实际考虑。在某些情况下,算法在内存和空间方面存在可扩展性问题,但通过模型性能(根据它们预期实现的回归或分类目标)在样本上工作得很好。例如,SVM 在内存和训练时间上的可扩展性分别为O(n²)和O(n³)。在其他情况下,数据的不平衡程度如此之高,以至于许多算法不足以处理偏斜。在文献中,通过创建新的训练样本来重新平衡原始数据集中类别分布的步骤也被称为重采样。
欠采样和过采样
在类别分布上存在明显不平衡的数据集可以称为包含一个独特的少数类。通常,这个少数类是我们特别感兴趣的实例集合,因为其成员在如此罕见的情况下出现。例如,在信用卡欺诈中,不到 0.1%的数据属于欺诈。这种偏斜不利于学习;毕竟,当我们寻求最小化分类的总误差时,我们给予所有类别相同的权重,无论一个类别相对于另一个类别是否代表性不足。在二元分类问题中,我们将少数类称为正类,将多数类称为负类,这是我们将在以下讨论中遵循的惯例。
大类欠采样是一种常用的技术,用于解决数据中的偏斜问题。以信用卡欺诈为例,我们可以从原始数据集中创建不同的训练样本,使得每个样本都包含原始数据集中的所有欺诈案例,而非欺诈实例则以某种固定的比例分布在所有训练样本中。因此,通过这种方法创建的给定训练集中,与原始偏斜数据集相比,多数类现在代表性不足,从而有效地平衡了类别的分布。可以通过这种方式创建带有标记的正例和负例实例,比例为,例如,1:20 到 1:50,但必须注意,使用的负例样本应具有与主要数据集的数据统计和分布相似的特征。使用多个训练样本,以及正负实例的不同比例,是为了使任何可能存在的采样偏差变得明显。
或者,我们也可以选择对少数类进行过采样。和之前一样,我们创建多个样本,其中少数类的实例是通过从原始数据集中有放回或无放回地采样选出的。当无放回地采样时,样本之间没有重复的实例。有放回地采样时,某些实例可能出现在多个样本中。在完成样本的初始播种后,我们可以通过在每个样本中对少数类进行随机有放回采样,直到我们得到所需的正负实例比例,从而产生更平衡的类别分布。过采样可能导致过拟合,因为分类决策边界由于重复值而变得更加具体。SMOTE(合成少数类过采样技术)是一种通过在特征空间中创建合成数据点来缓解此问题的技术,它通过在正类相邻实例之间进行插值来实现(参考文献 [20])。
分层采样
创建样本,使得具有相似特征的数据以与它们在总体中出现的相同比例被抽取,这被称为分层采样。在多类分类中,如果有 N 个类别,每个类别以一定的比例存在,那么创建的样本将代表原始数据集中每个类别的相同比例。通常,创建多个样本来训练和测试模型,以验证采样偏差是良好的实践。
训练集、验证集和测试集
创建良好的分类模型的圣杯是在一组高质量、具有代表性的(训练数据)上训练,调整参数并找到有效的模型(验证数据),最后,通过其在未见数据上的行为来估计模型的表现(测试数据)。
逻辑分组背后的核心思想是确保模型在训练期间未见过的数据上进行验证或测试。否则,一个简单的“死记硬背的学习者”可能会优于算法。学习算法的泛化能力必须在不同于训练数据集但来自同一总体的数据集上评估(参考文献 [11])。在从训练数据中移除过多数据以增加验证和测试预算之间取得平衡可能导致模型“欠拟合”,即没有足够的例子来构建有助于泛化的模式。另一方面,将所有标记数据分配给训练,而不进行任何验证或测试的极端选择可能导致“过拟合”,即模型过于忠实于例子,泛化能力不足。
通常,在大多数机器学习挑战和现实世界的客户问题中,人们一开始就得到一个训练集和一个测试集来评估模型的性能。在这些合作中,唯一的问题是如何在给定的训练集的基础上验证并找到最有效的参数。在某些合作中,只提供了标记的数据集,你需要考虑训练、验证和测试集,以确保你的模型不会过度拟合或欠拟合数据。
建模需要三个逻辑过程,因此需要三个逻辑数据集,即训练、验证和测试。训练数据集的目的是向学习算法提供标记数据以构建模型。验证集的目的是通过在验证集上训练来观察被评估的训练模型参数的效果。最后,在训练和验证集的组合上重新训练最佳参数或模型,以找到一个最优模型,然后在该模型上测试盲测试集。
图 1:训练、验证和测试数据及其使用方法
两个因素会影响学习或泛化能力:算法的选择(及其参数)和训练数据的数量。这种泛化能力可以通过包括预测误差在内的各种指标来估计。模型对未见数据的总体误差估计或风险由以下给出:
在这里,噪声是随机噪声,Var (G,n)被称为方差误差,它是衡量我们的假设或算法(G)如果给定不同的数据集有多敏感的度量。被称为偏差误差,表示模型中最佳算法(所有可能数据集上的平均学习者)与最优算法的距离。
如图 2和图 3所示的学习曲线——其中训练和测试错误是固定的算法及其参数或训练数据大小——可以提供对欠拟合或过拟合的指示。
当训练数据量固定时,不同的算法或具有不同参数选择的相同算法可以表现出不同的学习曲线。图 2显示了在相同数据量下,两种算法给出基于偏差和方差的两种不同学习曲线的情况。
图 2:当模型复杂度固定时,训练数据与错误率的关系表明了不同模型的选择。
算法或模型选择也会影响模型性能。一个复杂的算法,具有更多可调整的参数,可能导致过拟合,而一个简单的算法,参数较少,可能存在欠拟合。当训练数据量固定时,以下经典图示了模型性能和复杂性的关系:
图 3:当训练数据量固定时,模型复杂性与训练和测试数据中的错误率的关系。
验证允许探索参数空间以找到最佳泛化模型。正则化(将在线性模型中讨论)和验证是两种用于防止过拟合的机制。有时使用“k 折交叉验证”过程进行验证,这涉及到创建k个数据样本,使用(k – 1)个进行训练,剩余的一个进行测试,重复k次以给出平均估计。以下图示了 5 折交叉验证作为示例:
图 4:5 折交叉验证。
以下是一些常用的数据采样、验证和学习的技巧:
-
训练、验证和测试的随机分割:60%,20%,20%。在 60%的数据上训练,使用 20%进行验证,然后将训练集和验证集合并以训练一个最终模型,用于在剩余的 20%上进行测试。分割可以是随机的,基于时间、基于地区等。
-
训练、交叉验证和测试:分为训练集和测试集各占三分之一,在训练集上使用交叉验证进行验证,在全部三分之二的数据上训练,在三分之一的数据上测试。分割可以是随机的,基于时间、基于地区等。
-
训练和交叉验证:当训练集较小时,只能进行模型选择而不需要大量参数调整。在整个数据集上运行交叉验证,并选择在整个数据集上学习的最佳模型。
特征相关性分析和降维
特征相关性和选择的目标是找到对目标变量有区分性的特征,并帮助减少数据的维度[1,2,3]。这主要通过改善维度灾难的影响和去除无关特征的噪声来提高模型性能。通过仔细评估在验证集上添加和去除特征时的模型,我们可以看到特征相关性的影响。由于对k个特征的穷举搜索涉及 2^k – 1 个集合(考虑所有k个特征的组合,每个特征要么保留要么去除,不考虑一个特征都不存在的退化情况),因此需要评估的模型数量可能变得不可接受,因此需要某种启发式搜索技术。以下将描述这些技术中最常见的一些。
特征搜索技术
一些非常常见的搜索技术被用来寻找特征集:
-
前向或爬山搜索:在这种搜索中,每次添加一个特征,直到评估模块输出性能不再进一步变化。
-
反向搜索:从整个集合开始,每次移除一个特征,直到不再发生性能改进。某些应用程序交替使用前向和反向技术来搜索特征。
-
进化搜索:可以使用各种进化技术,如遗传算法,作为搜索机制,并且可以使用基于过滤器或包装器的评估指标作为适应度标准来指导过程。
特征评估技术
在高层次上,评估特征有三个基本方法。
过滤器方法
这种方法指的是使用技术而不使用机器学习算法进行评估。过滤器方法的基本思想是使用搜索技术选择一个特征(或特征子集)并使用某种统计量来衡量其重要性,直到达到停止标准。
单变量特征选择
这种搜索与根据使用的统计量对每个特征进行排名一样简单。
信息论方法
所有信息论方法都以熵机制为核心概念。其思想是,如果特征在数据集中随机出现,则熵最大,或者说,压缩或编码的能力低,特征可能是不相关的。另一方面,如果特征值的分布使得某些值在一个类别中相对于其他类别更普遍,那么熵最小化,特征具有区分性。以这种方式将问题表述为熵需要某种形式的离散化,以便将数值特征转换为类别,以便计算概率。
考虑一个具有训练数据 D[X] 的二分类问题。如果 X[i] 是具有 v 个不同分类值的 i^(th) 特征,使得 D[Xi] = {D[1], D[2]… D[v]},那么特征 X[i] 中的信息或熵为:
在这里,Info(D[j]) 是分割的熵,其计算如下:
在这里,p[+](D) 是数据集 D 中的数据属于正类的概率,而 p_(D) 是它属于负类的概率,在该样本中。特征的信息增益是根据整体信息和特征信息来计算的
InfoGain(X[i]) = Info(D) – Info(D[Xi])
对于数值特征,值按升序排序,并且考虑相邻值之间的分割点作为不同的值。
熵的减少越大,特征的相关性就越高。当特征具有大量值时,信息增益存在问题;这时增益比率就派上用场。增益比率通过引入分割信息来纠正大分割的信息增益。特征X[i]和GainRatio的分割信息如下:
还有其他杂质度量,如基尼杂质指数(如决策树算法部分所述)和基于不确定性的度量来计算特征相关性。
统计方法
卡方特征选择是最常见的特征选择方法之一,其基础是统计假设检验。零假设是特征和类别变量相互独立。数值特征被离散化,以便所有特征都具有分类值。列联表的计算如下:
特征值 | 类别=P | 类别=N | 对类别 niP + niN 求和 |
---|---|---|---|
X[1] | (n[1P]|µ[1P]) | (n[1N]|µ[1N]) | n[1] |
…. | … | …. | … |
X[m] | (n[mP]|µ[mP]) | (n[mN]|µ[mN]) | n[m] |
n[*P] | n[*P] | n |
列联表 1:显示二元类别的特征值和类别分布。
在前面的表中,n[ij]是具有值——在离散化后——等于x[i]和类别值j的特征的数量。
值求和如下:
这里n是数据实例的数量,j = P, N是类别值,i =1,2, … m是特征的不同离散化值的索引,该表有m – 1个自由度。
卡方统计量由以下公式给出:
卡方值用于与置信水平阈值进行比较以测试显著性。例如,对于i = 2,5%置信水平下的卡方值为 3.84;如果我们的值小于表格中的 3.83,那么我们知道该特征是有趣的,并且零假设被拒绝。
多变量特征选择
大多数多变量特征选择方法有两个目标:
-
减少特征与其他选定的特征之间的冗余
-
最大化特征与类别标签的相关性或相关性
寻找此类特征子集的任务不能穷尽,因为该过程可能具有很大的搜索空间。通常使用启发式搜索方法,如回溯搜索、前向搜索、爬山法和遗传算法来找到特征子集。接下来将介绍两种非常著名的评估技术,以实现上述目标。
最小冗余最大相关性(mRMR)
在这种技术中,数值特征通常被离散化——就像在单变量预处理中做的那样——以获得不同的值类别。
对于每个子集 S,两个特征 X[i] 和 X[j] 之间的冗余可以测量如下:
这里,MI (X[i], X[j]) = 两个特征 X[i] 和 X[j] 之间的互信息度量。特征 X[i] 与类别 C 之间的相关性可以测量如下:
此外,可以将这两个目标结合起来,使用以下方法找到最佳特征子集:
基于相关性的特征选择 (CFS)
基本思想与前面的例子相似;子集 S 的整体优点被测量为:
在这里,k 是特征的总数, 是平均特征类别相关性,
是平均特征间互相关性。分子给出相关性因子,分母给出冗余因子,因此搜索的目标是最大化整体比率或优点 (S)。
还有其他技术,如基于快速相关性的特征选择,它基于相同的原则,但在计算指标方面有所变化。读者可以在 Weka 中尝试这些和其他技术。
过滤方法的优势在于其方法与学习算法无关,因此可以免除选择算法和参数的麻烦。它们也比基于包装的方法更快。
包装方法
搜索技术与在特征搜索方法中讨论的方法相同;只是评估方法不同。在包装方法中,使用机器学习算法来评估基于各种指标发现的具有区分性的特征子集。用作包装方法的机器学习算法可能与用于建模的算法相同或不同。
最常用的交叉验证用于学习算法。性能指标,如曲线下面积或 F 分数,作为交叉验证的平均值,指导搜索过程。由于训练和评估模型的成本非常高,我们选择具有快速训练速度的算法,如线性回归、线性 SVM 或基于决策树的算法。
一些包装方法使用特定的算法,如随机森林来衡量特征相关性,已经非常成功。
嵌入方法
这种方法不需要特征搜索技术。不是在预处理中进行特征选择,而是在机器学习算法本身中进行。规则归纳、决策树、随机森林等算法在训练算法中执行特征选择。一些算法,如回归或基于 SVM 的方法,被称为收缩方法,可以在模型中添加正则化项以克服数据集中噪声特征的影响。岭回归和 lasso 正则化是回归中提供隐式特征选择的知名技术。
在第三章“无监督机器学习技术”中,将讨论其他使用无监督算法的技术,这些技术也可以在监督环境中有效地使用,例如,主成分分析(PCA)。
模型构建
在现实世界的问题中,学习有许多约束,评估模型在未见数据上的性能也有许多方法。每个建模算法在应用于特定问题或特定领域的问题类时都有其优势和劣势。这一点在著名的无免费午餐定理(NFLT)中得到了阐述,该定理指出——对于监督学习的情况——在所有数据分布的平均情况下,每个分类算法的表现几乎与其他任何算法一样好,包括总是选择同一类的算法!监督学习、搜索和优化的 NFLT 应用可以在www.no-free-lunch.org/
找到。
在本节中,我们将讨论最常用的实用算法,提供必要的细节来回答诸如算法的输入和输出是什么?它是如何工作的?在选择算法时需要考虑哪些优势和局限性?对于每个模型,我们将包括测试所选数据集时获得的示例代码和输出。这应该为读者提供对过程的洞察。一些算法,如神经网络和深度学习、贝叶斯网络、基于流的机器学习等,将在各自的章节中单独介绍。
线性模型
当数据线性可分时,线性模型效果很好。这始终应该是首先要确定的事情。
线性回归
线性回归可用于分类和估计问题。它是实践中最广泛使用的方法之一。它包括通过数据点找到最佳拟合超平面。
算法输入和输出
特征必须是数值型的。分类特征使用各种预处理技术进行转换,例如,当分类值成为具有 1 和 0 值的特征时。线性回归模型在分类中输出一个分类类别,在回归中输出数值。许多实现还给出置信度值。
它是如何工作的?
模型试图在输入空间中学习一个“超平面”,以最小化每个类别的数据点之间的误差(参考文献 [4])。
线性模型在 d 维输入空间中学习的超平面由以下公式给出:
模型将输入空间分割成两个区域(二元分类),分别是和
。将特征 0 的坐标赋值为 1,即x0=1,假设空间或模型的向量表示为:
权重矩阵可以通过各种方法推导出来,例如普通最小二乘法或使用矩阵表示的迭代方法,如下所示:
在最小二乘问题中,如果矩阵X^TX不是满秩的,或者遇到各种数值稳定性问题,解决方案将进行修改如下:
这里,被添加到大小为(n + 1, n + 1)的单位矩阵I[n]的对角线上,其余值被设置为 0。这种解决方案被称为岭回归,参数λ理论上控制了平方损失和解决方案低范数的权衡。常数λ也称为正则化常数,有助于防止“过拟合”。
优点和局限性
-
当特征少于 100 个且数据点只有几千个时,这是一个尝试获取洞察力的合适方法。
-
在一定程度上是可解释的,因为权重提供了对每个特征影响的洞察。
-
假设线性关系、可加性和不相关特征,因此它不模拟复杂的非线性现实世界数据。一些线性回归的实现允许移除共线性特征来克服这个问题。
-
非常容易受到数据中的异常值的影响,如果有巨大的异常值,在进行线性回归之前必须先处理这些异常值。
-
异方差性,即训练点的方差不等,可能会影响简单的最小二乘回归模型。采用加权最小二乘等技术来克服这种情况。
朴素贝叶斯
基于贝叶斯规则,朴素贝叶斯分类器假设数据的特征相互独立(参考文献 [9])。它特别适合于大型数据集,尽管它对特征独立性的假设是朴素的,但通常比其他更复杂的技术表现更好。
算法输入和输出
朴素贝叶斯模型可以接受既是分类又是连续的特征。通常,如果连续特征以正确的格式离散化,朴素贝叶斯模型的性能会得到提高。朴素贝叶斯输出所有类别的类别和概率分数,使其成为评分模型的良好分类器。
它是如何工作的?
它是一个基于概率的建模算法。基本思想是使用贝叶斯定理并测量不同项的概率,如这里所示。测量概率可以通过预处理(如离散化)、假设某种分布或,如果数据足够多,映射数值特征的分布来完成。
应用贝叶斯定理以获得后验概率作为预测,其中k代表k^(th)类别。
优点和局限性
-
它对孤立噪声数据点具有鲁棒性,因为在估计输入数据的概率时,这些点会被平均。
-
从贝叶斯分类中得到的概率分数可以作为评分模型。
-
能够很好地处理缺失值,因为它们在估计概率时没有被使用。
-
此外,它对无关属性具有鲁棒性。如果特征没有用,类别的概率分布将是均匀的,并且会相互抵消。
-
在训练速度和内存方面非常好,它可以并行化,因为方程中每个概率的计算都是相互独立的。
-
当使用朴素贝叶斯时,相关特征可能成为一个大问题,因为条件独立性假设不再有效。
-
大多数优化算法都假设误差是正态分布的。
逻辑回归
如果我们使用线性回归模型,比如使用最小二乘回归方法,输出必须转换为类别,比如 0 和 1。许多线性回归算法输出类别和置信度作为概率。一般来说,如果我们看到线性回归的概率大多超出了 0.2 到 0.8 的范围,那么逻辑回归算法可能是一个更好的选择。
算法输入和输出
与线性回归类似,所有特征都必须是数值的。分类特征必须转换为数值。像在朴素贝叶斯中一样,此算法为每个类别输出类别和概率,可以用作评分模型。
如何工作?
逻辑回归使用输入特征的线性函数来模拟类别的后验概率。
二元分类的逻辑回归模型如下所示:
该模型是线性模型的对数几率或 logit 转换(参考文献 [6])。权重向量通常使用各种优化方法计算,如迭代加权最小二乘法(IRLS)或Broyden-Fletcher-Goldfarb-Shanno(BFGS)方法,或这些方法的变体。
优点和局限性
-
克服了输入和输出之间异方差性和某些非线性问题。
-
在误差估计中不需要正态分布的假设。
-
它是可解释的,但不如线性回归模型那么可解释,因为需要一些统计学知识。它提供诸如优势比、p 值等信息,这些信息有助于理解特征对类别的影响,以及根据 p 值的重要性进行隐式特征相关性。
-
在实践中,必须使用 L1 或 L2 正则化来克服逻辑回归模型中的过拟合问题。
-
许多优化算法可用于提高训练速度和鲁棒性。
非线性模型
接下来,我们将讨论一些知名、实用且最常用的非线性模型。
决策树
决策树也被称为分类和回归树(CART)(参考文献 [5])。它们的表示是通过在每个内部节点评估一个关于单个属性的不等式来构建的二叉树,每个叶子节点对应于从其路径到达的决策产生的输出值或类别。当提供新的输入时,通过从根节点开始遍历树来预测输出。
算法输入和输出
特征可以是分类的也可以是数值的。它生成类别作为输出,大多数实现使用基于频率的估计给出分数或概率。尽管有一些扩展,但决策树的概率并不是像朴素贝叶斯和逻辑回归那样的平滑函数。
它是如何工作的?
通常,从根节点开始创建单个树,根节点使用单个特征进行决策,根据特征的值将决策分支到各个分支,而在叶子节点处则是一个类别或更多特征。有许多选择要做,例如树的数量、如何选择根级别或后续叶子级别的特征,以及如何在不分类的情况下分割特征值。这导致了许多不同的算法或对基本决策树的修改。许多分割特征值的技术与在离散化部分讨论的内容相似。通常,会应用某种形式的剪枝来减少树的大小,这有助于解决过拟合问题。
Gini 指数是另一种用于分割特征的流行技术。所有数据点的集合 S 中的数据点的 Gini 指数如下 ,其中 p[1],p[2] … p[k] 是每个类别的概率分布。
如果 p 是所有数据点集合 S 中属于正类别的数据点的分数或概率,那么 1 – p 是其他类别的分数或二分类中的错误率。如果数据集 S 以 r 种方式分割为 S[1], S[2],…S[r],那么每个集合的错误率可以量化为 |S[i]|。r 种分割的 Gini 指数如下:
使用最低 Gini 指数的分割用于选择。流行的决策树算法 CART 使用 Gini 指数作为分割标准。
数据点集 S 的熵可以类似地计算如下:
类似地,基于熵的分割计算如下:
熵分割的值越低,特征越好,这一点在 ID3 和 C4.5 决策树算法中得到了应用(参考文献 [12])。
停止标准与剪枝标准相关。提前停止树的生长或剪枝的目的是减少“过拟合”,这与线性模型和逻辑模型中的正则化类似。通常,训练集被分为树生长集和剪枝集,这样剪枝就可以使用不同的数据来克服生长集的任何偏差。最小描述长度(MDL),根据节点数量惩罚树的复杂性,是许多决策树算法中常用的方法。
图 5:显示了一个二维二分类问题和一个通过在阈值X[1t]和X[1t]处进行分割诱导的决策树
优点和局限性
-
决策树的主要优点是它们很容易解释。它们可以用通俗易懂的语言来理解,并且特别适合商业领域的专家轻松理解精确模型。
-
如果特征数量很多,那么构建决策树可能需要大量的训练时间,因为算法的复杂性会增加。
-
决策树固有的问题是过拟合。许多树算法都有剪枝选项来减少这种影响。使用剪枝和验证技术可以在很大程度上减轻这个问题。
-
当特征之间存在相关性时,决策树工作得很好。
-
决策树在类别之间构建轴平行的边界,这种偏差可能会引入错误,尤其是在复杂、平滑、非线性边界的情况下。
K-近邻(KNN)
K-近邻属于非参数和懒惰算法的分支。K-近邻不对底层数据做出任何假设,也不从训练数据中构建和泛化模型(参考文献 [10])。
算法输入和输出
虽然 KNN 可以处理分类和数值特征,但寻找邻居的核心——距离计算,与数值特征配合得更好。将数值特征归一化到相同的范围是必须的步骤之一。KNN 的输出通常是基于邻居距离计算的类别。
如何工作?
KNN 使用整个训练数据对未见过的测试数据进行预测。当出现未见过的测试数据时,KNN 通过某种距离计算找到 K 个“最近的邻居”,并根据邻居和决定类别的度量标准对新的点进行分类。如果我们考虑由x[1]和x[2]表示的两个数据点,对应的向量,距离计算如下:
-
欧几里得距离:
-
余弦距离或相似度:
用于对未见数据分类的度量可能仅仅是K个邻居中的多数类。
训练时间很小,因为它只需构建数据结构以以最小化未见面数据时最近邻的计算方式来存储数据。该算法依赖于从训练数据点存储数据的选择,以实现搜索邻居的高效性,使用哪种距离计算来找到最近邻,以及使用哪种度量来根据所有邻居的类别进行分类。通过使用验证技术来选择 KNN 中的"K"值是至关重要的。
图 6:使用二维数据以及不同的 k 值选择来展示 K-最近邻。
优点和局限性
-
对底层数据分布没有假设,并且训练时间最小,这使得它成为学习的一个非常有吸引力的方法。
-
KNN 使用局部信息来计算距离,在特定领域可以产生高度自适应的行为。
-
当K值选择得当,对噪声训练数据具有鲁棒性。
-
根据数据点的数量和硬件限制,保留整个训练数据用于分类可能会出现问题。
-
特征数量和维度的诅咒会影响此算法,因此在 KNN 建模之前必须进行某种形式的维度缩减或特征选择。
支持向量机(SVM)
简单来说,SVM 可以被视为通过解决约束优化问题来最大化分离超平面和数据之间边界的线性分类器。SVM 甚至可以通过使用后面描述的核将数据转换到更高维空间来处理非线性可分的数据。
算法输入和输出
SVM 仅对数值特征有效,尽管大多数实现可以通过将特征转换为数值或二进制来处理分类特征。归一化通常是选择之一,因为它有助于训练中的优化部分。SVM 的输出是类别预测。有一些实现提供概率估计作为置信度,但这需要相当多的训练时间,因为它们使用 k 折交叉验证来构建估计。
如何工作?
在其线性形式中,SVM 的工作方式类似于线性回归分类器,在两个类别之间绘制线性决策边界。两者的区别在于,在 SVM 中,边界是以最大化边界附近点之间的“间隔”或距离的方式绘制的。边界上的点被称为“支持向量”(参考文献 [13 和 8])。
因此,支持向量机(SVM)试图在类似于线性回归模型的线性模型中找到权重向量,如下所示:
权重 w[0] 在这里表示为 b。对于二类分类问题,SVM 试图找到一个超平面:
超平面试图将数据点分离,使得属于同一类别的所有点都位于超平面的同一侧,如下所示:
模型通过约束优化和惩罚函数 C(用于克服误差)来最大化间隔:
使得 和
。
由于这个原因,它们也被称为大间隔分类器。基于核的 SVM 将输入数据转换到一个假设的特征空间,在这个空间中,SV 机制以线性方式工作,边界在特征空间中绘制。
在变换后的表示上,核函数如下给出:
这里 Φ 是输入空间上的一个变换。可以看出,SVM 的整个优化和求解过程保持不变,唯一的例外是点积 x[i] · x[j] 被核函数 k(x[i], x[j]) 所替代,这是一个涉及不同空间中两个向量的函数,实际上并没有转换到那个空间。这被称为核技巧。
通常使用的最著名的核函数包括:
-
高斯径向基核:
-
多项式核:
-
Sigmoid 核:
SVM 的性能对一些优化参数、核参数以及核心 SV 参数(如代价函数 C)非常敏感。通常使用网格搜索或进化搜索等技术,结合交叉验证等验证技术来寻找最佳参数值。
图 7:从训练数据中学习得到的 SVM 线性超平面,它能在两个类别之间创建最大间隔分离。
图 8:核变换说明如何使用多项式变换将二维输入空间转换为三维特征空间,其中数据是线性可分的。
优点和局限性
-
SVM 在泛化、低过拟合方面表现优异,如果参数选择得当,对于复杂非线性数据有良好的理论基础。
-
SVM 在具有大量特征和较少训练数据的情况下也能很好地工作。
-
SVM 对噪声训练数据不太敏感。
-
SVM 的最大缺点是它们不可解释。
-
SVM(支持向量机)的另一个大问题是其训练时间和内存需求。它们是 O(n²) 和 O(n³),当数据量大或存在硬件限制时,可能会导致严重的可扩展性问题。有一些修改可以帮助减少这两者。
-
SVM 通常在二分类问题上表现良好,但对于多分类问题,尽管有诸如一对多和一对一等技术,但它的鲁棒性不如决策树等一些其他分类器。
集成学习和元学习器
将多个算法或模型组合起来进行分类,而不是仅仅依赖一个,这被称为集成学习。它有助于结合各种模型,因为每个模型都可以被视为——在高级别上——在整个数据集中检测特定模式的专家。每个基学习器也可以在略微不同的数据集上学习。最后,将所有模型的结果结合起来进行预测。根据组合中使用的算法的相似程度、如何向每个算法展示训练数据集以及算法如何组合结果以最终对未见数据集进行分类,集成学习有许多分支:
图 9:集成学习策略的说明
一些常见的集成学习方法包括:
-
不同的学习算法
-
相同的学习算法,但具有不同的参数选择
-
不同特征集上的不同学习算法
-
不同训练数据的不同学习算法
自助聚合或 bagging
它是用于在不同样本中划分数据并在每个样本上构建分类器的最常用的集成方法之一。
算法输入和输出
输入受所使用的基学习器的选择限制——如果使用决策树,基本上没有限制。该方法输出类成员资格以及类的概率分布。
它是如何工作的?
bagging 的核心思想是对具有高方差的不同学习器应用自助估计,例如决策树。自助估计是任何依赖于有放回随机抽样的统计量。整个数据被使用自助估计分成不同的样本,并对每个样本使用基学习器构建模型。最后,在预测时,通过多数投票得到平均预测——这是结合所有学习器的一种技术。
随机森林
随机森林是基本 Bagged 决策树的改进。即使在 Bagging 的情况下,基本的决策树在创建树时在每个分割点都有所有特征的选择。正因为如此,即使有不同的样本,许多树也可以形成高度相关的子模型,这导致 Bagging 的性能下降。通过给不同的模型提供随机特征以及随机数据集,子模型之间的相关性降低,与基本 Bagged 树相比,随机森林表现出更好的性能。随机森林中的每棵树都在随机特征上生长其结构,从而最小化偏差;在决策上结合许多这样的树可以减少方差(参考文献 [15])。随机森林还用于通过平均树中的不纯度减少来衡量特征相关性,并对所有特征进行排名,以给出每个特征的相对重要性。
优点和局限性
-
比单个基学习器有更好的泛化能力。克服了基学习器过拟合的问题。
-
由于 Bagging 作为元学习器结合了甚至可解释的学习器,其可解释性非常低。
-
与大多数其他集成学习器一样,Bagging 对噪声和异常值具有弹性。
-
随机森林通常不会对训练数据是独立同分布(iid)的情况下产生过拟合。
Boosting
Boosting 是另一种流行的集成学习方法,它基于使用弱学习器并迭代地学习“错误分类”或难以学习的点。因此,想法是“提升”难以学习的实例,并使基学习器更有效地学习决策边界。Boosting 有各种变体,如 AdaBoost、LogitBoost、ConfidenceBoost、Gradient Boosting 等。我们在这里介绍一个非常基本的 AdaBoost 形式(参考文献 [14])。
算法输入和输出
输入受所使用的基学习器的选择约束——如果使用决策树,基本上没有限制。输出类成员资格以及类别的概率分布。
如何工作?
Boosting 背后的基本思想是迭代地重新加权输入样本,以创建新的数据分布,以便在每次迭代中从简单的基学习器中学习模型。
初始时,所有实例都使用的权重均匀加权,并且在每次迭代t时,种群被重新抽样或重新加权,如
所示,其中
和Zt 是归一化常数。
最终模型作为迭代中学习到的所有模型的线性组合工作:
每次迭代的重新加权或重新抽样数据基于“错误”;导致错误的点被抽样更多或具有更大的权重。
优点和局限性
-
比基学习器有更好的泛化能力,并且非常有效地克服了过拟合的问题。
-
一些提升算法,如 AdaBoost,可能对均匀噪声敏感。存在一些提升算法的变体,如“GentleBoost”和“BrownBoost”,它们可以减少异常值的影响。
-
提升算法在误差估计上有理论上的界限和保证,使其成为一个统计上稳健的算法。
模型评估、评估和比较
这里讨论的关键思想包括:
-
如何评估或估计分类器在未见数据集上的性能,这些数据集将是它未来预测未见数据集的。
-
我们应该使用哪些指标来评估模型的性能?
-
如果我们必须在它们之间进行选择,我们如何比较算法?
模型评估
为了训练模型(s),调整模型参数,选择模型,并最终估计模型在未见数据上的预测行为,我们需要许多数据集。我们不能在单一数据集上训练模型并估计其在该数据集上的行为,因为这会产生明显的乐观偏差,估计结果不太可能匹配未见数据的行为。因此,至少需要将可用的数据进行分区,形成训练集和测试集。此外,在我们对测试集进行测试之前,我们需要调整模型的参数,并在单独的数据集上测试调整的效果。如果我们使用同一数据集进行训练、参数调整和测试,乐观偏差和错误估计的问题同样适用。因此,从理论和实践上讲,需要有三个数据集,即训练集、验证集和测试集。
模型在训练集上训练,不同参数对训练集的影响在验证集上得到验证,最终选择参数的模型在测试集上运行以评估模型在未见数据上的性能。当数据集不够大,或者数据集很大但类别之间的不平衡性很大,即一个类别只占总人口的很小一部分时,我们无法创建太多的样本。记住,我们方法中描述的步骤之一是创建不同的数据样本和数据集。如果总训练数据量很大,并且数据量和类别比例良好,那么使用随机分层划分来创建这三个集合是最常见的选项。在某些显示季节性和时间相关行为的特定数据集中,基于时间界限创建数据集是一种常见的做法。在许多情况下,当数据集不够大时,可能只创建两个物理分区,即训练和测试。训练数据集大约占 66%到 80%,其余用于测试。然后使用 k 折交叉验证技术从训练数据集中创建验证集。训练数据集被分成k次,每次产生k-1/k随机训练1/k测试数据样本,并生成所需的性能平均指标。这样,有限的训练数据被分成k次,并使用不同训练/测试分割的平均性能来评估参数的影响。在交叉验证中,使用 10 折交叉验证是最常见的做法。
模型评估指标
在调整参数或选择模型时,下一个重要的决定是基于某些性能指标做出决策。在分类学习中,有不同可用的指标,你可以根据业务需求做出决策。例如,在某个领域,不漏掉任何一个真正的阳性是最重要的关注点,而在其他领域,人类参与判断模型结果时,过多的假阳性是更大的关注点。在某些情况下,整体良好的准确率被认为更为重要。在高度不平衡的数据集,如欺诈或网络攻击中,一个类别的实例只有几个,而另一个类别的实例有数百万。在这种情况下,准确率给出了模型性能的错误指示,因此使用一些其他指标,如精确度、真正阳性比率或曲线下面积作为指标。
我们现在将讨论在分类算法评估中最常使用的指标(参考文献 [16, 17 和 19])。
图 10:分类模型的模型评估指标
混淆矩阵和相关指标
图 11:混淆矩阵
混淆矩阵是许多模型性能指标定义的核心。指标和同义词的激增是矩阵元素在不同学科中衍生出的不同数量的效用结果,每个学科都强调模型行为的不同方面。
矩阵的四个元素是假阳性、假阴性、真阳性和真阴性的数量原始计数。通常,这些数量的不同比率更有趣,例如真阳性率(或灵敏度、或召回率)和假阳性率(FPR,或 1—特异性,或漏报率)。准确率反映了正确预测的百分比,无论是类别 1 还是类别 0。对于倾斜的数据集,准确率并不特别有用,因为即使是恒定的预测也可能看起来表现良好。
ROC 和 PRC 曲线
之前提到的指标,如准确率、精确率、召回率、灵敏度和特异性,是汇总指标,即它们描述了整个数据集的行为。在许多复杂问题中,观察 TP 和 FP 等指标之间的权衡通常很有价值。
许多分类器,主要是基于概率的分类器,除了给出分类外,还给出预测的置信度或概率。获得 ROC 或 PRC 曲线的过程是在学习模型上运行未见验证或测试集,然后获得预测和预测概率。根据置信度按降序对预测进行排序。对于每个概率或置信度,计算两个指标,即 FP 的分数(FP 率)和 TP 的分数(TP 率)。
将 TP 率绘制在 y 轴上,FP 率绘制在 x 轴上,可以得到 ROC 曲线。随机分类器的 ROC 曲线靠近对角线,而优秀分类器的 ROC 曲线倾向于图表的左上角。曲线下面积(AUC)是通过使用 ROC 曲线从 0 到 1 的梯形面积来测量的面积。例如,在运行交叉验证时,可能会有许多 ROC 曲线。有两种方法可以得到“平均”ROC 曲线:首先,使用垂直平均,即 TPR 平均在不同 FP 率下绘制;其次,使用水平平均,即在不同的 TP 率下绘制 FPR 平均。根据经验法则,曲线下面积大于 0.8 的分类器被认为对未见数据具有良好的预测能力。
精确率-召回率曲线或 PRC 曲线与 ROC 曲线类似,但与 TPR 对 FPR 不同,分别将精确率和召回率绘制在 y 轴和 x 轴上。当数据高度不平衡时,即 ROC 曲线并不能真正显示影响,而 PRC 曲线在判断性能方面更为可靠。
收益图和提升曲线
提升和增益图更偏向于敏感性或真正阳性。这两个图表的全部目的在于展示,与随机选择相比,模型的预测和置信度可以检测到未见数据样本中更好的质量或真正阳性。
这通常对用于检测金融犯罪中的欺诈或网络安全中的威胁的检测引擎非常有吸引力。增益图和提升曲线给出了在不同四分位数或总数据区间的不同区间内将被检测到的真正阳性的精确估计。这将给业务决策者提供洞察,了解需要多少调查人员或需要花费多少小时来检测欺诈行为或网络攻击,从而可以给出模型的实际投资回报率。
生成增益图或提升曲线的过程与通过模型运行未见过的验证或测试数据并获取预测以及置信度或概率的过程类似。这涉及到按降序排列概率,并计算数据集每个四分位数的 TPs 数量。最后,每个四分位数的计数直方图给出提升曲线,而每个四分位数的 TPs 累计计数给出增益图。在许多工具,如 RapidMiner 中,为了获得计数和累计计数,使用分箱技术而不是粗略的区间(如四分位数),而是使用固定的较大区间。
模型比较
当涉及到选择算法,或者给定算法的正确参数时,我们会在不同的数据集上,或者在交叉验证的情况下,在同一数据集的不同分割上进行比较。在这些比较中,会使用统计测试的度量来做出决策。使用经典统计学中的假设检验的基本思想是比较算法中的两个度量。零假设是算法基于测量的度量之间没有差异,因此测试是为了根据测量的度量来验证或拒绝零假设(参考文献 [16])。统计测试回答的主要问题是——算法获得的结果或度量是其真实特征,还是偶然得到的?
在本节中,我们将讨论在实际情况中使用的比较分类算法的最常见方法。
比较两个算法
一般过程是在相同的训练集上训练算法,然后在多个验证集、不同的测试集或交叉验证上运行模型,衡量之前讨论的兴趣度量,如错误率或曲线下面积,然后获取每个算法的度量统计,以决定哪个效果更好。每种方法都有其优点和缺点。
McNemar 测试
这是一个非参数测试,因此它不对数据分布做出假设。McNemar 的测试构建了一个关于性能度量值(如“误分类或错误”)的列联表,例如:
两个算法误分类的数量(c[00])
-
算法 G1 误分类但算法 G2 正确分类的数量(c[01])
-
算法 G2 误分类但算法 G1 正确分类的数量(c[10])
-
同时被 G1 和 G2 正确分类的数量(c[11])
如果 χ² 超过 统计量,则可以在 1 – α 的置信水平下拒绝两个算法 G1 和 G2 的性能度量值相等的零假设。
配对 t 检验
这是一个参数测试,并且假设计算出的度量值呈正态分布是有效的。通常,它与交叉验证过程结合使用,并计算曲线下面积、精确度或错误率等度量值的结果,然后测量均值和标准差。除了正态分布假设之外,两个度量值来自具有相等方差的总体这一额外假设可能对这种方法是一个很大的缺点。
是两个算法 G1 和 G2 性能度量值的均值差异。
在这里,di 是试验中两个算法 G1 和 G2 性能度量值的差异,并且有 n 次试验。
t-统计量使用均值差异和标准误差(从标准差计算得出)计算,并与表格中的正确 alpha 值进行比较,以检查显著性:
Wilcoxon 符号秩检验
在数据集上测试两个度量值最流行的非参数方法是使用 Wilcoxon 符号秩检验。算法在相同的训练数据和度量值(如错误率或准确率下的面积)上训练,并在不同的验证或测试集上计算。设 d[i] 为 N 个数据集的第 i 次试验中两个分类器性能度量值的差异。差异根据其绝对值进行排名,并关联平均秩以处理平局。设 R^+ 为第二个算法优于第一个算法的秩之和,R^– 为第一个算法优于第二个算法的秩之和:
统计量 然后与 alpha 值的阈值进行比较,
以拒绝假设。
比较多个算法
现在我们将讨论在涉及两个以上算法且需要跨多个算法进行评估指标比较时使用的两种最常见技术。
ANOVA 测试
这些是参数测试,假设样本呈正态分布,即我们用于评估的指标。方差分析(ANOVA)测试遵循与其他测试相同的过程,即使用相似的训练集训练模型/算法,并在不同的验证或测试集上运行。ANOVA 测试计算的主要量包括每个算法性能的指标均值,然后计算所有算法的整体指标均值。
设p[ij]为i = 1,2… k和j = 1,2 …l的试验和分类器的性能指标。分类器j在所有试验中的平均性能和整体平均性能如下:
评估两种类型的变异。第一种是组内变异,即每个算法与整体指标均值的总偏差,第二种是组间变异,即每个算法指标均值的偏差。组内变异和组间变异用于计算相应的组内和组间平方和,如下:
使用两个平方和以及如 F 统计量这样的计算,即两者的比率,可以在 alpha 值上进行显著性测试以接受或拒绝零假设:
ANOVA 测试在假设指标的正态分布和方差相等方面与配对 t 测试具有相同的局限性。
弗里德曼测试
弗里德曼测试是一种针对多个算法比较的非参数测试,它对数据分布或指标的方差没有假设,ANOVA 测试有这些假设。它使用排名而不是直接使用性能指标进行计算。在每个数据集或试验中,算法被排序,最好的算法排名为 1,依此类推,对所有分类器都如此。计算算法在n个数据集上的平均排名,记为R[j]。弗里德曼统计量在l个分类器上的计算如下,并与 alpha 值比较以接受或拒绝零假设:
案例研究 – 马肠阻塞分类
为了说明第一章中描述的不同步骤和方法,从数据分析到模型评估,需要一个具有现实世界特征的代表性数据集。
我们从以下链接可用的 UCI 存储库中选择“马肠阻塞数据集”:archive.ics.uci.edu/ml/datasets/Horse+Colic
该数据集有 23 个特征,具有类别和连续特征的混合。它包含大量具有缺失值的特征和实例,因此在本处理中,理解如何替换这些缺失值并在建模中使用它们变得更加实用。实际上,大量缺失数据(30%)是该数据集的一个显著特征。数据由连续属性以及类型为名义的属性组成。此外,存在自预测因子使得从实际角度处理此数据集具有指导意义。
本练习的目的是应用我们迄今为止已吸收的监督学习技术。我们将使用真实数据集并通过使用两个开源工具包——WEKA 和 RapidMiner 来完成。借助这些工具,我们将构建一个管道,使我们能够从数据文件的摄取开始,通过数据清洗、学习过程和模型评估。
Weka 是一个机器学习的 Java 框架——我们将看到如何使用这个框架通过几行代码从头到尾解决一个分类问题。除了 Java API 之外,Weka 还有一个 GUI。
RapidMiner 是一个具有拖放功能和大量算法及可视化工具的图形化环境,这使得快速运行数据实验和不同建模技术变得极其简单。
业务问题
业务问题是确定数据集中已知变量的值——如果马的病变是手术性的。我们将使用测试集作为必须分类的未见数据。
机器学习映射
基于数据和标签,这是一个二元分类问题。数据已经分为训练数据和测试数据。这使得评估技术更简单,因为从特征选择到模型的所有方法都可以在相同的测试数据上评估。
该数据集包含 300 个训练样本和 68 个测试样本。有 28 个属性,目标对应于病变是否为手术性的。
数据分析
在查看标签类别在训练和测试样本中的分布后,我们在特征分析之前将 300 个训练样本和 68 个测试样本合并。
标签分析
训练集中无类别与有类别的比例是 109/191 = 0.57,测试集中为 0.66:
训练数据集 |
---|
手术病变? |
示例数量 |
测试数据集 |
手术病变? |
示例数量 |
表 2:标签分析
特征分析
以下是一个截图,展示了具有类型、缺失值、最小值、最大值、众数和标准差基本统计特征的顶级功能,并按缺失值排序。观察结果如下:
-
没有非缺失值的分类或连续特征;最少的特征是“脉搏”,有 74 个缺失值,共 368 个,即 20%的值缺失,这高于一般的噪声阈值!
-
大多数数值特征也存在缺失值,例如,“鼻胃反流 PH”中有 247 个缺失值,共 368 个,即 67%的值缺失!
-
许多分类特征存在缺失值,例如,“腹部穿刺外观”中有 165 个缺失值,共 368 个,即 45%的值缺失!
-
必须以某种方式处理缺失值,以克服由如此大量缺失值产生的噪声!!特征分析
图 12:数据集特征的基本统计信息。
监督学习实验
在本节中,我们将介绍使用两种不同工具进行的监督学习实验——突出一种工具的编码和分析,另一种工具的 GUI 框架。这为开发者提供了探索他们最舒适路径的机会。
Weka 实验
在本节中,我们给出了整个代码,并将从加载数据、转换数据、选择特征、构建样本模型、在测试数据上评估它们,甚至比较算法的统计显著性等方面进行过程讲解。
Java 中的端到端流程示例
在每个算法中,使用相同的训练/测试数据,并对所有指标进行评估,如下所示。训练和测试文件按如下方式加载到内存中:
DataSource source = new DataSource(trainingFile);
Instances data = source.getDataSet();
if (data.classIndex() == -1)
data.setClassIndex(data.numAttributes() - 1);
使用 WEKA 的通用代码如下所示,其中每个分类器都被一个过滤分类器包裹,用于替换缺失值:
//replacing the nominal and numeric with modes and means
Filter missingValuesFilter= new ReplaceMissingValues();
//create a filtered classifier to use filter and classifier
FilteredClassifier filteredClassifier = new FilteredClassifier();
filteredClassifier.setFilter(f);
// create a bayesian classifier
NaiveBayes naiveBayes = new NaiveBayes();
// use supervised discretization
naiveBayes.setUseSupervisedDiscretization(true);
//set the base classifier e.g naïvebayes, linear //regression etc.
fc.setClassifier(filteredClassifier)
当分类器需要执行特征选择时,在 Weka 中,AttributeSelectedClassifier
进一步包裹了FilteredClassifier
,如下所示:
AttributeSelectedClassifier attributeSelectionClassifier = new AttributeSelectedClassifier();
//wrap the classifier
attributeSelectionClassifier.setClassifier(filteredClassifier);
//univariate information gain based feature evaluation
InfoGainAttributeEval evaluator = new InfoGainAttributeEval();
//rank the features
Ranker ranker = new Ranker();
//set the threshold to be 0, less than that is rejected
ranker.setThreshold(0.0);
attributeSelectionClassifier.setEvaluator(evaluator);
attributeSelectionClassifier.setSearch(ranker);
//build on training data
attributeSelectionClassifier.buildClassifier(trainingData);
// evaluate classifier giving same training data
Evaluation eval = new Evaluation(trainingData);
//evaluate the model on test data
eval.evaluateModel(attributeSelectionClassifier,testingData);
评估的样本输出如下所示:
=== Summary ===
Correctly Classified Instances 53 77.9412 %
Incorrectly Classified Instances 15 22.0588 %
Kappa statistic 0.5115
Mean absolute error 0.3422
Root mean squared error 0.413
Relative absolute error 72.4875 %
Root relative squared error 84.2167 %
Total Number of Instances 68
=== Detailed Accuracy By Class ===
TP Rate FP Rate Precision Recall F-Measure MCC ROC Area PRC Area Class
0.927 0.444 0.760 0.927 0.835 0.535 0.823 0.875 1
0.556 0.073 0.833 0.556 0.667 0.535 0.823 0.714 2
Weighted Avg. 0.779 0.297 0.789 0.779 0.768 0.535 0.823 0.812
=== Confusion Matrix ===
a b <-- classified as
38 3 | a = 1
12 15 | b = 2
Weka 实验者和模型选择
如在模型评估指标部分所述,为了选择模型,我们需要验证哪个模型在未见过的数据集上表现良好。必须在训练集上进行交叉验证,并使用标准的统计测试指标来分析所选的性能指标。在此,我们展示了使用相同训练数据、10 折交叉验证、对两个模型进行 30 次实验,并使用配对 t 检验比较结果的示例。
一种方法是使用预处理过的朴素贝叶斯,包括替换缺失值并通过移除任何得分低于 0.0 的特征进行特征选择。
另一种方法是使用相同的预处理和 AdaBoostM1 与朴素贝叶斯。
图 13:WEKA 实验者显示了使用 30 次重复的交叉验证运行两个算法的过程。
图 14:WEKA 实验者结果显示了使用配对 t 检验比较两个算法在百分比正确或准确度指标上的结果。
RapidMiner 实验
现在我们使用 RapidMiner 中的马绞痛数据集进行一些实验。我们将再次遵循章节第一部分介绍的方法。
注意
本节的目的不是作为 RapidMiner 工具的教程。实验者应阅读优秀的文档和用户指南,以便熟悉工具的使用。软件中每个操作员都有一个专门的教程——我们建议您在想要了解如何使用特定操作员时使用这些教程。
一旦我们使用数据访问工具导入测试和训练数据文件,我们就会想要直观地探索数据集,以便熟悉情况。特别重要的是要识别出这 28 个属性中的每一个是连续的(在 RapidMiner 中为数值、整数或实数)还是分类的(在 RapidMiner 中为名义、二项或多项)。
可视化分析
从工具的结果面板中,我们执行数据的单变量、双变量和多变量分析。统计工具为每个特征提供简短的摘要——对于连续类型,有最小值、最大值、平均值和标准差;对于名义类型,有最少、最多和频率。
当我们进行双变量分析时,数据的有趣特征开始显现。在四分位数颜色矩阵中,颜色代表两个可能的目标值。正如箱线图所示,我们立即注意到一些属性比其他属性更明显地区分这两个目标值。让我们检查几个:
图 15:四分位数颜色矩阵
蠕动:这个特征在按目标值分开时显示出明显的分布差异。两个四分位数区域之间几乎没有重叠。这表明这个特征在目标方面的区分能力。
另一方面,直肠温度的图表在分布上没有明显的差异。这表明这个特征与目标的相关性较低。从脉搏这个特征也可以得出类似的推断。我们预计这些特征在评估它们相对于目标区分能力时排名相当低。
最后,疼痛的图表具有非常不同的特征。它也是区分目标的,但与蠕动的区分方式非常不同。在疼痛的情况下,类别 2 的数据方差比类别 1 大得多。腹部膨胀在类别之间也有明显不同的方差,除了类别 2 比类别 1 有更大的方差。
图 16:散点图矩阵
探索数据的一个重要部分是理解不同的属性如何相互关联以及与目标的相关性。在这里,我们考虑特征对,并查看值的组合发生是否告诉我们有关目标的信息。在这些图中,数据点的颜色代表目标。
图 17:气泡图
在气泡图中,我们可以通过使用绘图工具指定 x 轴和 y 轴以及表示特征大小的第三维(气泡大小)来同时可视化四个特征。目标类别由颜色表示。
在总蛋白的低端,我们看到直肠温度中值范围内的 pH 值较高。在这个簇中,高 pH 值似乎与手术后的病变有更强的相关性。对于总蛋白大于 50 的值,也发现了一个总蛋白变化范围更宽的簇。这个簇中的 pH 值变化也较低。
特征选择
在对数据有了初步了解之后,我们准备使用理论中提出的评估特征相关性的技术。
在这里,我们使用了两种技术:一种基于与目标属性相关的卡方统计量来计算特征权重,另一种基于吉尼不纯度指数。结果如表所示。请注意,正如我们在通过可视化分析特征时推断的那样,脉搏和直肠温度都证明与两种技术显示的低相关性。
卡方检验 | 吉尼指数 |
---|---|
属性 | 权重 |
--- | --- |
疼痛 | 54.20626 |
腹部 | 53.93882 |
蠕动 | 38.73474 |
腹部膨胀 | 35.11441 |
周围脉搏 | 23.65301 |
腹腔穿刺外观 | 20.00392 |
四肢温度 | 17.07852 |
黏膜 | 15.0938 |
鼻胃管反流 | 14.95926 |
聚集细胞体积 | 13.5733 |
直肠指检-粪便 | 11.88078 |
毛细血管充盈时间 | 8.078319 |
呼吸频率 | 7.616813 |
总蛋白 | 5.616841 |
鼻胃管反流 PH | 2.047565 |
脉搏 | 1.931511 |
年龄 | 0.579216 |
鼻胃管 | 0.237519 |
腹腔穿刺总蛋白 | 0.181868 |
直肠温度 | 0.139387 |
表 3:由两种不同技术(卡方检验和吉尼指数)确定的关联特征。
模型流程
在 RapidMiner 中,您可以使用具有输入和输出的运算符定义计算流程,这些运算符可以串联在一起。以下流程表示执行整个操作集的流程,从加载训练和测试数据,处理缺失值,按相关性加权特征,过滤掉得分低的特征,训练使用 Bagging 和随机森林作为算法的集成模型,最后将学习模型应用于测试数据并输出性能指标。请注意,应用于训练数据集的所有预处理步骤必须以相同的顺序通过 Group Models 运算符应用于测试集:
图 18:RapidMiner 流程图
在流程的顶部,训练集由最左侧的运算符摄取,随后排除非预测因子(医院编号、CP 数据)和自预测因子(病变 1)。这之后是替换缺失值(对于连续属性使用均值,对于分类属性使用众数)的运算符。接下来,特征权重运算符根据卡方统计量评估每个特征的权重,随后是一个忽略低权重特征的过滤器。然后,使用 Bagging 和随机森林分类器训练模型,使用预处理后的数据集。
在训练数据上使用的预处理步骤通过 Group Models 运算符按适当顺序分组,并在倒数第二步应用于测试数据。最后,在最后一步,对测试示例上的目标变量的预测以及混淆矩阵和其他性能指标进行评估和展示。
模型评估指标
我们现在可以比较各种模型的结果。如果您一直跟随,您可能会发现您的结果与这里展示的不同——这可能是由于某些学习算法的随机性质,或者模型中使用的某些超参数值的差异。
我们考虑了三个不同的训练数据集:
-
原始训练数据包含缺失值
-
处理缺失值的转换后的训练数据
-
处理缺失值并应用特征选择(卡方检验)以选择高度区分性特征的转换后的训练数据
我们在每个数据集上考虑了三组不同的算法:
-
线性算法(朴素贝叶斯和逻辑回归)
-
非线性算法(决策树和 KNN)
-
集成算法(Bagging、Ada Boost 和随机森林)
混淆度指标评估
模型 | 真阳性率 | 假阳性率 | 精确率 | 特异性 | 准确率 | AUC |
---|---|---|---|---|---|---|
朴素贝叶斯 | 68.29% | 14.81% | 87.50% | 85.19% | 75.00% | 0.836 |
逻辑回归 | 78.05% | 14.81% | 88.89% | 85.19% | 80.88% | 0.856 |
决策树 | 68.29% | 33.33% | 75.68% | 66.67% | 67.65% | 0.696 |
k-NN | 90.24% | 85.19% | 61.67% | 14.81% | 60.29% | 0.556 |
Bagging (GBT) | 90.24% | 74.07% | 64.91% | 25.93% | 64.71% | 0.737 |
Ada Boost (朴素贝叶斯) | 63.41% | 48.15% | 66.67% | 51.85% | 58.82% | 0.613 |
表 4:在具有缺失值的马肠炎数据上训练的模型在未见(测试)数据上的结果
模型 | 真阳性率 | 假阳性率 | 精确度 | 特异性 | 准确率 | AUC |
---|---|---|---|---|---|---|
朴素贝叶斯 | 68.29% | 66.67% | 60.87% | 33.33% | 54.41% | 0.559 |
逻辑回归 | 78.05% | 62.96% | 65.31% | 37.04% | 61.76% | 0.689 |
决策树 | 97.56% | 96.30% | 60.61% | 3.70% | 60.29% | 0.812 |
k-NN | 75.61% | 48.15% | 70.45% | 51.85% | 66.18% | 0.648 |
Bagging (随机森林) | 97.56% | 74.07% | 66.67% | 25.93% | 69.12% | 0.892 |
Bagging (GBT) | 82.93% | 18.52% | 87.18% | 81.48% | 82.35% | 0.870 |
Ada Boost (朴素贝叶斯) | 68.29% | 7.41% | 93.33% | 92.59% | 77.94% | 0.895 |
表 5:在替换缺失值后训练的模型在马肠炎数据上的未见(测试)数据结果
模型 | 真阳性率 | 假阳性率 | 精确度 | 特异性 | 准确率 | AUC |
---|---|---|---|---|---|---|
朴素贝叶斯 | 75.61% | 77.78% | 59.62% | 29.63% | 54.41% | 0.551 |
逻辑回归 | 82.93% | 62.96% | 66.67% | 37.04% | 64.71% | 0.692 |
决策树 | 95.12% | 92.59% | 60.94% | 7.41% | 60.29% | 0.824 |
k-NN | 75.61% | 48.15% | 70.45% | 51.85% | 66.18% | 0.669 |
Bagging (随机森林) | 92.68% | 33.33% | 80.85% | 66.67% | 82.35% | 0.915 |
Bagging (GBT) | 78.05% | 22.22% | 84.21% | 77.78% | 77.94% | 0.872 |
Ada Boost (朴素贝叶斯) | 68.29% | 18.52% | 84.85% | 81.48% | 73.53% | 0.848 |
表 6:使用卡方统计技术选择的特征在马肠炎数据上训练的模型在未见(测试)数据上的结果
ROC 曲线、提升曲线和增益图
性能图使我们能够直观地评估三个实验中使用的两个模型——在没有替换缺失数据的情况下,以及在用卡方加权特征替换缺失数据后——并将它们相互比较。成对的图显示了我们在本章 earlier 中了解到的每个线性(逻辑回归)、非线性(决策树)和集成(Bagging,使用梯度提升树)技术的性能曲线,这些曲线来自两个实验的结果。
图 19:使用缺失数据进行的实验的 ROC 性能曲线
图 20:使用缺失数据进行的实验的累积增益性能曲线
图 21:使用缺失数据进行的实验的升力性能曲线
结果、观察和分析
处理缺失值的影响是显著的。在七个分类器中,除了朴素贝叶斯和逻辑回归之外,当按照各种指标(包括 AUC、精确度、准确率和特异性)处理缺失值时,所有分类器都表现出显著的改进。这告诉我们,处理可能“噪声”的缺失值是数据转换的重要方面。朴素贝叶斯有其处理缺失值的内部方式,而我们实验的结果显示,它在处理空值方面比我们的外部转换做得更好。但总的来说,当考虑到所有分类器时,转换缺失值的概念似乎是有益的。
如建模部分所述,一些算法需要正确处理缺失值和特征选择才能获得最佳性能。从结果中我们可以看到,例如,决策树的性能从缺失数据的 0.696 逐步提高到管理缺失数据的 0.812,以及与特征选择一起处理缺失数据时的最佳性能 0.824。七个分类器中有六个在执行这两个步骤时,AUC(以及其他指标)的性能都有所提高;比较AUC的表 5和表 6提供了这些快速见解。这证明了在进行建模之前进行预处理(如处理缺失值和特征选择)的重要性。
从结果中得出的一个主要结论是,问题高度非线性,因此从最简单的决策树到集成随机森林的多数非线性分类器都表现出色。最佳性能来自元学习算法随机森林,在适当处理缺失值并使用最相关特征进行训练的情况下。以 AUC 衡量的最佳线性模型性能是逻辑回归的 0.856(数据如原样,即包含缺失值),而随机森林通过适当处理缺失数据并伴随特征选择实现了 AUC 性能的 0.915。一般而言,如表 3所示,非线性分类器或元学习者在大多数性能指标上都优于线性分类器。
正确处理缺失值,这可以被视为“噪声”,可以显著提高 AdaBoost 的性能。AUC 从 0.613 提高到 0.895,FPR 从 48.15%降低到 7.41%。这确实符合该技术的预期理论行为。
与其他常见技术相比,元学习技术,即使用提升和袋装概念的技巧,在处理现实世界数据时相对更有效。这似乎由结果得到证实,因为基于经过适当噪声处理的 AdaBoost(以朴素贝叶斯作为基学习器)在大多数指标上优于朴素贝叶斯,如表 5和表 6所示。随机森林和 GBTs 与 AdaBoost 相比,在表 6中也表现出最佳性能,再次证实了正确的过程和集成学习可以在现实世界的噪声数据集中产生最优化结果。
注意
本章中 WEKA 和 RapidMiner 处理文件的全部数据、模型和结果均可在以下网址找到:github.com/mjmlbook/mastering-java-machine-learning/tree/master/Chapter2
。
摘要
监督学习是机器学习应用中占主导地位的技术。该方法包括一系列步骤,从数据探索、数据转换和数据采样开始,通过特征减少、模型构建,最终到模型评估和比较。过程中的每一步都涉及一些决策,这些决策必须回答关键问题:我们应该如何插补缺失值?我们应该使用什么数据采样策略?在数据集中的噪声量和规定的可解释性目标下,最合适的算法是什么?本章展示了将这些过程和技术应用于现实世界问题——使用 UCI 马绞痛数据集的分类问题。
无论问题是分类问题,目标是一个分类值,还是回归问题,目标是一个实值连续变量,用于监督学习的方法都是相似的。在本章中,我们使用了分类进行说明。
第一步是数据分析,这包括特征描述性统计、使用单变量和多变量特征分析的可视化分析。借助各种绘图类型,我们可以揭示数据中的不同趋势,并检查某些特征可能与标签值以及彼此相关或无关。数据分析之后是数据预处理,其中技术包括处理噪声的方法,例如缺失数据的情况,以及异常值,以及通过归一化和离散化准备数据以供建模技术使用。
在预处理之后,我们必须适当地将数据分成训练、验证和测试样本。根据数据和问题的特性,可能使用不同的采样策略,例如,当数据有偏斜或当我们有一个多类分类问题时。根据数据大小,交叉验证是创建单独验证集的常见替代方案。
下一步是剔除无关特征。在过滤方法中,使用单变量分析的技术要么是基于熵的(信息增益、增益比率)要么是基于统计假设检验的(卡方检验)。在主要的多变量方法中,目标是当考虑在一起时减少冗余特征,或者使用与目标标签相关性最高的特征。在包装方法中,我们使用机器学习算法来告诉我们哪些特征更具区分性。最后,一些学习技术将特征选择嵌入到算法中,通常使用岭回归或 Lasso 技术作为正则化项。这些代表嵌入式方法。
建模技术可以广泛地分为线性、非线性以及集成方法。在线性算法中,特征类型可以决定使用哪种算法——线性回归(仅限数值特征)、朴素贝叶斯(数值或分类)和逻辑回归(仅限数值特征,或分类转换为数值)是主要的工具。在选择它们或解释使用这些模型进行学习的结果时,必须理解每种方法的优缺点。
决策树、k-NN 和 SVM 都是非线性技术,每种技术都有其自身的优势和局限性。例如,可解释性是决策树的主要优势。k-NN 在面对噪声数据时具有鲁棒性,但在处理高维数据时表现不佳。SVM 的可解释性较差,但当数据集有限且特征数量较多时,其表现依然出色。
在多个不同模型协作的情况下,集成方法可以充分利用所有模型的优势。Bagging 和 Boosting 都是相对于它们所使用的基学习器在集成中表现更好的技术,并且在许多应用中都很受欢迎。
最后,评价模型性能和比较模型之间有哪些策略和方法可以使用?验证集或交叉验证在泛化到未见数据的能力中起着至关重要的作用。从混淆矩阵中衍生出的性能评估指标被普遍用于评估分类器;某些指标在某些领域和学科中比其他指标更常用。ROC、增益和提升曲线是随着分类阈值变化时模型性能范围的优秀可视化表示。在成对比较模型时,使用基于统计假设检验的几个指标。Wilcoxon 和 McNemar 的检验是两种非参数检验;配对 t 检验是参数方法的一个例子。同样,在比较多个算法时,Friedman 检验是一种常用的非参数检验,它不对数据分布做出假设。ANOVA 是参数检验,它假设指标服从正态分布且方差相等。
本章的最后几节介绍了使用 RapidMiner 工具开发并评估用于从 UCI 马绞痛数据集测试数据分类生成的模型的流程。设计了三个实验来比较和对比在不同数据预处理条件下的模型性能,即不处理缺失数据、使用标准技术替换缺失数据,以及最终在空替换后进行特征选择。在每个实验中,我们选择了多个线性、非线性以及集成方法。作为整体流程的一部分,我们说明了如何使用建模环境。我们可以从结果中得出有意义的结论,这些结论不仅让我们对数据有了深入了解,还展示了不同情况下各种技术类别的相对优势和劣势。我们得出结论,数据高度非线性,集成学习在与其他技术相比时显示出明显的优势。
参考文献
-
D. Bell 和 H. Wang (2000). 相关性形式化及其在特征子集选择中的应用. 机器学习, 41(2):175–195.
-
J. Doak (1992). 特征选择方法及其在计算机安全中的应用评估. 技术报告 CSE–92–18, 加州大学戴维斯分校,计算机科学系.
-
M. Ben-Bassat (1982). *在特征评估中使用距离度量、信息度量以及误差界限. 在 P. R. Krishnaiah 和 L. N. Kanal 编辑的《统计学手册》,第 2 卷,第 773–791 页,North Holland.
-
Littlestone N, Warmuth M (1994) 加权多数算法. 《信息计算》. 108(2):212–261
-
Breiman L., Friedman J.H., Olshen R.A., Stone C.J. (1984) 分类与回归树. Wadsforth 国际集团.
-
B. Ripley(1996), 模式识别与神经网络. 剑桥大学出版社,剑桥.
-
Breiman, L., (1996). Bagging 预测器,机器学习. 24 123-140.
-
Burges, C. (1998). 支持向量机在模式识别中的教程. 《数据挖掘与知识发现》. 2(2):1-47.
-
Bouckaert, R. (2004), 在连续变量上表现良好的朴素贝叶斯分类器,计算机科学讲义, 第 3339 卷,第 1089 – 1094 页.
-
Aha D (1997). 懒惰学习, Kluwer 学术出版社,多德雷赫特
-
Nadeau, C. and Bengio, Y. (2003), 泛化误差的推理. 在《机器学习》52:239– 281.
-
Quinlan, J.R. (1993). C4.5: 机器学习程序, Morgan Kaufmann, 旧金山.
-
Vapnik, V. (1995), 统计学习理论的本质. Springer Verlag.
-
Schapire RE, Singer Y, Singhal A (1998). Boosting 和 Rocchio 应用于文本过滤. 在 SIGIR '98: 第 21 届国际信息检索研究与发展年度会议论文集,第 215–223 页
-
Breiman L.(2001). 随机森林. 《机器学习》, 45 (1), pp 5-32.
-
Nathalie Japkowicz 和 Mohak Shah (2011). 评估学习算法:从分类的角度. 剑桥大学出版社.
-
Hanley, J. & McNeil, B. (1982). 受试者工作特征曲线下面积的意义和使用. 放射学 143, 29–36.
-
Tjen-Sien, L., Wei-Yin, L., Yu-Shan, S. (2000). 比较三十三种旧的和新的分类算法的预测准确性、复杂性和训练时间. 机器学习 40: 203–228.
-
A. W. Moore 和 M. S. Lee (1994). 最小化交叉验证错误的有效算法. 在第 11 届国际机器学习会议论文集中,第 190–198 页,新不伦瑞克州新布鲁斯威克,Morgan Kaufmann 出版社.
-
Nitesh V. Chawla 等人 (2002). 合成少数类过采样技术. 人工智能研究杂志. 16:321-357.
第三章:无监督机器学习技术
在上一章中,我们专注于监督学习,即从标记的训练数据集中学习。在现实世界中,获取带有标签的数据往往很困难。在许多领域,由于数据生成的规模或速度,即使由于标记的成本或难度,实际上也不可能对数据进行标记。在这些情况下,无监督学习,以各种形式,提供了探索、可视化和执行描述性和预测建模的正确方法。在许多应用中,无监督学习通常与监督学习结合作为第一步,以隔离有趣的数据元素进行标记。
在本章中,我们将关注各种适用于无监督学习的方法、技术和算法。我们首先指出在处理数据和转换方面,监督学习和无监督学习共有的问题。然后,我们将简要介绍由于缺乏“真实情况”和在这些条件下的学习性质,无监督学习面临的特定挑战。
然后,我们将讨论应用于未标记数据集的特征分析和降维技术。接下来是聚类方法的广泛介绍和关于实际应用中各种算法的讨论,就像我们在第二章中做的那样,实际应用中的监督学习,展示每个算法的工作原理、何时使用它以及其优势和局限性。我们将通过介绍不同的聚类评估技术来结束对聚类的讨论。
在处理聚类之后,我们将探讨异常检测的主题。我们将对比各种技术和算法,说明为什么某些对象在给定数据集中是异常的——也称为异常值。
本章将以聚类和异常检测实验结束,这些实验使用真实世界的数据集进行,并对获得的结果进行分析。在本案例研究中,我们将使用 ELKI 和 SMILE Java 库进行机器学习任务,并展示实验的代码和结果。我们希望这将为读者提供对这些工具强大功能和易用性的感觉。
与监督学习共有的问题
我们讨论的许多与监督学习相关的问题也与无监督学习相关。其中一些列在这里:
-
算法处理的特征类型:大多数聚类和异常算法需要数值表示才能有效工作。对分类或有序数据进行转换必须谨慎进行
-
维度灾难:具有大量特征会导致稀疏空间,影响聚类算法的性能。必须选择一些选项来适当地降低维度——要么是特征选择,只保留最相关特征的一个子集,要么是特征提取,将特征空间转换成低维空间的新一组主变量
-
内存和训练时间上的可扩展性:许多无监督学习算法由于内存或训练时间限制,无法扩展到几千个实例以上
-
数据中的异常值和噪声:许多算法受到特征中的噪声、异常数据的存在或缺失值的影响。它们需要被适当地转换和处理
无监督学习的特定问题
以下是一些与无监督学习技术相关的问题:
-
参数设置:确定特征数量、特征的有用性、聚类数量、聚类的形状等问题,对某些无监督方法构成了巨大的挑战
-
评估方法:由于缺乏真实标签,无监督学习方法是不良设定的,因此算法的评估变得非常主观。
-
硬标签或软标签:许多无监督学习问题需要以排他性或概率方式对数据进行标记。这对许多算法来说是一个问题
-
结果和模型的可解释性:与监督学习不同,缺乏真实标签和一些算法的性质使得从模型和标签中解释结果变得更加困难
特征分析和降维
需要掌握的第一批工具是不同的特征分析和降维技术。与监督学习一样,降维的需求源于与之前讨论的特征选择和降维类似的多重原因。
较少的判别维度使得数据的可视化和聚类变得容易得多。在许多应用中,无监督降维技术被用于压缩,这可以用于数据的传输或存储。当大数据有额外开销时,这尤其有用。此外,应用降维技术可以提高许多算法在内存和计算速度方面的可扩展性。
符号表示
我们将使用与监督学习章节中使用的类似符号。示例在 d 维度上,表示为向量:
x = (x[1],x[2],…x**[d] )**^T
包含 n 个示例的整个数据集可以表示为一个观察矩阵:
降维的思想是找到 k ≤ d 个特征,通过输入特征的变换、投影或组合,使得较低维度的 k 能够捕获或保留原始数据集的有趣特性。
线性方法
线性降维方法是一些最古老的统计技术,用于减少特征或将数据转换到较低维度,同时保留有趣的判别特性。
从数学上讲,我们使用线性方法执行一个变换,即通过原始数据元素的线性变换来创建一个新的数据元素:
s = Wx
在这里,W[k × d] 是线性变换矩阵。变量 s 也被称为潜在或隐藏变量。
在这个主题中,我们将讨论两种最实用且经常使用的方 法。我们将列出这些技术的变体,以便读者可以使用这些工具进行实验。这里的主要假设——通常形成限制——是变换之间的线性关系。
主成分分析(PCA)
PCA 是降维中广泛使用的技术(参考文献 [1])。原始坐标系被旋转到一个新的坐标系,该坐标系利用了数据中的最大方差方向,从而在低维子空间中产生了在原始特征空间中相关的变量。PCA 对特征的缩放敏感。
输入和输出
PCA 通常对数值数据集有效。许多工具提供了对名义特征的类别到连续的转换,但这会影响性能。主成分的数量,或k,也是用户提供的输入。
它是如何工作的?
PCA 在其最基本的形式中,试图将数据投影到新的轴上,这些轴被称为主成分。主成分是从原始空间捕获最大方差方向的投影。简单来说,PCA 通过将数据的原始轴旋转到最大方差的方向来找到第一个主成分。该技术通过再次确定下一个最佳轴(与第一个轴正交),寻求第二个最高方差,以此类推,直到捕获大多数方差。通常,大多数工具提供选择主成分数量的选项,或者选择继续寻找组件,直到捕获原始数据集中方差的一定百分比,例如 99%。
从数学上讲,寻找最大方差的目标可以写成
λ v = Cv 是特征分解
这相当于:
在这里,W 是主成分,S 是输入数据的新变换。通常,在计算部分使用特征值分解或奇异值分解。
图 1:主成分分析
优点和局限性
-
PCA 的一个优点是它在最小化数据重建误差方面是最佳的。
-
PCA 假设正态分布。
-
对于高维的大型数据集,计算协方差矩阵可能会变得非常密集。作为替代,可以使用奇异值分解(SVD),因为它是迭代的,并且不需要显式的协方差矩阵。
-
当数据中存在噪声时,PCA 会存在问题。
-
当数据位于复杂的流形上时,PCA 会失败,这是一个我们将在非线性降维部分讨论的话题。
-
PCA 假设特征之间存在相关性;在没有这些相关性的情况下,它无法进行任何转换;相反,它只是对它们进行排序。
-
通过将原始特征空间转换成一组新的变量,PCA 导致数据可解释性降低。
-
有许多其他流行的 PCA 变体,它们克服了 PCA 的一些偏差和假设。
独立成分分析(ICA)假设存在来自源的混合的非高斯分布,并使用生成技术尝试在较小的混合或组件中找到原始数据的分解(参考文献 [2])。PCA 和 ICA 之间的关键区别在于,PCA 创建的是不相关的组件,而 ICA 创建的是独立的组件。
从数学上讲,它假设 是独立源 ∈
的混合,使得每个数据元素 y = [y ¹ ,y ² ,….y ^k ]^T,独立性由
表示:
概率主成分分析(PPCA)基于使用混合模型和最大似然公式通过期望最大化(EM)来找到组件。它克服了 PCA 面临的缺失数据和异常值影响的问题。
随机投影(RP)
当数据可以通过大间隔分离——即使它是高维数据——一个人可以将数据随机投影到低维空间,而不会影响分离性,并且使用相对较少的数据实现良好的泛化。随机投影使用这种技术,具体细节在此描述(参考文献 [4])。
输入和输出
随机投影可以与数值和分类特征一起工作,但分类特征会被转换为二进制。输出是输入数据元素的低维表示。要投影的维度数 k 是用户定义输入的一部分。
它是如何工作的?
这种技术使用随机投影矩阵将输入数据投影到低维空间。原始数据 被转换到低维空间
,其中 k << p,使用以下方法:
在这里,k x d 矩阵 R 中的列是独立同分布的零均值正态变量,并缩放到单位长度。R 随机矩阵的构建有几种使用概率抽样的变体。RP 的计算复杂度为 O(knd),这比 PCA 的缩放效果要好得多。在许多实际数据集中,已经证明 RP 的结果与 PCA 相当,并且可以扩展到大型维度和数据集。
优点和局限性
-
它可以扩展到非常大的数据集大小和维度值。在文本和图像学习问题中,对于大型维度,该技术已被成功用作预处理技术。
-
在使用 RP 时,有时可能会发生较大的信息损失。
多维尺度分析(MDS)
MDS 有许多形式——经典、度量和非度量。MDS 的主要思想是保留成对相似度/距离值。它通常涉及将高维数据转换到两个或三个维度(参考文献 [5])。
输入和输出
MDS 可以根据用户选择的距离函数与数值和分类数据一起工作。要转换到的维数 k 是用户定义的输入。
如何工作?
给定 n 个数据元素,计算一个 n x n 的亲和度或距离矩阵。有使用距离的选择,例如欧几里得距离、马氏距离,或者使用相似度概念,如余弦相似度、Jaccard 系数等。MDS 在其最基本的形式中试图在低维空间中找到距离矩阵的映射,其中变换点之间的欧几里得距离与亲和度矩阵相似。
从数学上讲:
这里 输入空间和
映射空间。
如果使用核将输入亲和度空间进行转换,则 MDS 成为降维的非线性方法。当输入空间中点之间的距离是欧几里得距离时,经典 MDS 与 PCA 等价。
优点和局限性
-
关键缺点是需要主观选择所需的低维来解释高维数据,通常限制在两个或三个维度内,这对于人类来说是有局限的。一些数据可能无法有效地映射到这个低维空间。
-
优点是您可以使用该框架将线性和非线性映射到最低维度。
非线性方法
通常,非线性降维涉及对线性方法(如 KPCA)中的计算执行非线性变换,或者在低维中找到非线性关系,如流形学习。在某些领域和数据集中,低维数据结构是非线性的——这就是 KPCA 等技术的有效之处——而在某些领域,数据在低维中不会展开,你需要流形学习。
核主成分分析(KPCA)
核 PCA 使用第二章中描述的核技巧,实际应用中的监督学习,与 PCA 算法一起在多维空间中转换数据,以找到有效的映射(参考文献 [6])。
输入和输出
与 PCA 类似,增加了核和核参数的选择。例如,如果选择径向基函数(RBF)或高斯核,则核以及伽马参数成为用户选择的值。
如何工作?
与前一章中讨论的支持向量机(SVM)一样,KPCA 使用“核技巧”将输入空间转换为高维特征空间。然后在转换空间中执行寻找最大方差的所有 PCA 机制。
如 PCA:
通过构建N x N矩阵,而不是使用ϕ (x)进行实际变换,使用核方法对输入空间应用非线性变换,而不是线性协方差矩阵。
k(x,y) = (( ϕ (x), ϕ (y)) = ϕ (x) ^T ϕ (y)
由于核变换实际上并没有将特征转换到显式的特征空间,因此找到的主成分可以解释为数据在组件上的投影。在以下图中,一个使用 scikit-learn 示例生成的二进制非线性数据集(参考文献 [27])展示了使用 RBF 核进行 KPCA 后的线性分离,并通过逆变换返回几乎相同的输入空间:
图 2:圆数据集上的 KPCA 和逆变换。
优点和局限性
-
KPCA 克服了 PCA 所呈现的非线性映射。
-
KPCA 与标准 PCA 在异常值、噪声和缺失值方面存在类似问题。有稳健的方法和变体可以克服这些问题。
-
由于核矩阵的增加,KPCA 在空间上存在可扩展性问题,这可能在具有高维的大型数据集中成为瓶颈。在这些情况下,可以使用 SVD 作为替代。
流形学习
当高维数据嵌入到非线性但具有复杂结构的低维空间时,流形学习非常有效。
输入和输出
流形学习算法需要两个由用户提供的参数:k,代表初始搜索的邻居数量,以及n,流形坐标的数量。
它是如何工作的?
如下图中所示,使用 scikit-learn 工具(参考文献 [27])绘制的三维 S 曲线,在 2D PCA 和 2D 流形中使用 LLE 表示。观察蓝色、绿色和红色点在 PCA 表示中混合在一起,而使用 LLE 进行流形学习表示时,颜色被干净地分离。还可以观察到,欧几里得距离的秩排序在流形表示中不保持:
图 3:PCA 和流形学习后的数据表示
为了保留结构,保留的是测地距离而不是欧几里得距离。一般的方法是构建一个图结构,如邻接矩阵,然后根据不同的假设计算测地距离。在 Isomap 算法中,全局成对距离被保留(参考文献 [7])。在局部线性嵌入(LLE)算法中,映射是为了处理局部邻域,即附近的点在变换中映射到附近的点(参考文献 [9])。拉普拉斯特征映射与 LLE 类似,但它通过使用图拉普拉斯来尝试保持 LLE 中的“局部性”而不是“局部线性”,(参考文献 [8])。
优点和局限性
-
Isomap 是非参数的;它保留了全局结构,没有局部最优解,但速度受限。
-
LLE 和拉普拉斯特征映射是非参数的,没有局部最优解,速度快,但不保留全局结构。
聚类
聚类算法可以根据技术、输出、过程和其他考虑因素以不同的方式进行分类。在本主题中,我们将介绍一些最广泛使用的聚类算法。
聚类算法
目前有丰富的聚类技术用于广泛的多种应用。本节介绍其中的一些,解释它们的工作原理,它们可以用于哪些类型的数据,以及它们的优缺点。这些包括基于原型、基于密度、基于概率分区、基于层次、基于图理论和基于神经网络的算法。
k-Means
k-means 是一种基于质心或原型迭代的算法,采用分区和重新定位方法(参考文献 [10])。k-means 根据使用的距离度量找到球形形状的簇,例如在欧几里得距离的情况下。
输入和输出
k-means 可以处理大多数数值特征。许多工具提供类别到数值的转换,但计算中存在大量类别可能会导致非最优的聚类。用户定义的k,即要找到的聚类数量,以及用于计算接近度的距离度量是两个基本输入。k-means 生成聚类,将数据关联到每个聚类,以及聚类的质心作为输出。
它是如何工作的?
最常见的变体称为 Lloyd 算法,它通过从集合中随机选择数据元素来初始化给定数据集的k个质心。它使用某些距离度量(如欧几里得距离)将每个数据元素分配到最近的质心。然后,它计算每个聚类的数据点的平均值以形成新的质心,这个过程重复进行,直到达到最大迭代次数或质心没有变化。
从数学上讲,聚类的每一步都可以看作是一个优化步骤,其中要优化的方程由以下给出:
在这里,ci 是属于聚类i的所有点。最小化问题被归类为 NP-hard,因此 k-Means 有陷入局部最优的倾向。
优点和局限性
-
选择聚类数量k是困难的,但通常可以使用搜索技术,如为不同的值改变k并测量如平方误差和等指标来找到良好的阈值。对于较小的数据集,可以尝试层次 k-means。
-
对于较小的k值,k-means 的收敛速度可以比大多数算法快,并且可以找到有效的全局聚类。
-
k-means 的收敛可能受到质心初始化的影响,因此有许多变体执行具有不同种子的随机重启等。
-
当存在异常值和噪声数据点时,k-means 的表现可能会很糟糕。使用稳健技术(如中位数而不是平均值)、k-Medoids 在一定程度上克服了这一点。
-
当聚类形状任意或具有不同的密度时,k-means 无法找到有效的聚类。
DBSCAN
基于密度的空间聚类应用噪声(DBSCAN)是一种基于密度的划分算法。它将空间中的密集区域与稀疏区域分开(参考文献 [14])。
输入和输出
DBSCAN 仅使用数值特征。用户定义的参数是MinPts和由ϵ给出的邻域因子。
它是如何工作的?
算法首先找到每个点p的ϵ邻域,由给出。一个高密度区域被定义为在ϵ邻域中点的数量大于或等于给定MinPts的区域;围绕这样一个ϵ邻域定义的点被称为核心点。位于核心点的ϵ邻域内的点被认为是直接可达的。所有可以通过从一个直接可达的核心点到另一个直接可达的第二点的直接可达点跳跃,以此类推,实际上可以到达的核心点被认为是属于同一个簇。此外,任何在其ϵ-邻域中少于MinPts的点,但可以从核心点直接到达的点,属于与核心点相同的簇。这些位于簇边缘的点被称为边界点。任何既不是核心点也不是边界点的点被称为噪声点。
优点和局限性
-
DBSCAN 算法不需要指定簇的数量,可以从数据中自动找到它。
-
DBSCAN 可以找到各种形状和大小的簇。
-
DBSCAN 具有内置的鲁棒性以应对噪声,并可以从数据集中找到异常值。
-
DBSCAN 在识别点和将其分类为边界或核心时并不完全确定,这取决于数据处理顺序。
-
选择如欧几里得距离的距离度量通常会影响性能,这是由于维度的诅咒。
-
当存在密度变化大的簇时,{MinPts, ϵ**}的静态选择可能是一个很大的限制。
均值漂移
均值漂移是许多基于图像、视频和运动检测数据集的有效聚类算法(参考文献 [11])。
输入和输出
在均值漂移算法中,只接受数值特征作为数据输入。核的选择和核带宽是用户驱动的选择,这些选择会影响性能。均值漂移生成数据点的模式并在模式周围聚类数据。
如何工作?
均值漂移基于统计概念核密度估计(KDE),这是一种概率方法,用于从样本中估计潜在的数据分布。
对于给定带宽h的核K(x)的核密度估计由以下公式给出:
对于具有d维度的n个点。均值漂移算法通过将每个数据点移动到局部密度增加的方向来工作。为了估计这个方向,将梯度应用于核密度估计,梯度具有以下形式:
这里 g(x)= –K'(x)是核的导数。向量,m(x),被称为均值漂移向量,它用于将点移动到局部密度增加的方向。
x^((t+1)) = x^t + m(x)
此外,当密度函数的梯度为零时,它保证收敛。最终位于相似位置的点被标记为属于同一区域的簇。
优点和局限性
-
均值漂移是非参数的,不对数据分布做出任何假设。
-
它可以找到形状和大小各异的非复杂簇。
-
没有必要显式给出簇的数量;带宽参数的选择,该参数用于估计,隐式地控制簇。
-
均值漂移对于给定的带宽参数没有局部最优解,因此它是确定性的。
-
由于核密度估计(KDE),均值漂移对异常值和噪声点具有鲁棒性。
-
均值漂移算法计算缓慢,并且在大数据集上扩展性不好。
-
带宽选择应谨慎进行;否则可能会导致模式合并,或者出现额外的浅层模式。
期望最大化(EM)或高斯混合模型(GMM)
GMM 或 EM 是一种基于概率划分的方法,它使用基于概率分布的技术将数据划分为 k 个聚类(参考文献 [13])。
输入和输出
只允许在 EM/GMM 中使用数值特征。模型参数是混合成分的数量,由 k 给定。
如何工作?
GMM 是一种生成方法,它假设存在 k 个高斯成分,每个高斯成分有一个均值 µ[i] 和协方差 Ʃ[i]。以下表达式表示给定 k 个高斯成分的数据集的概率:
对于每个高斯成分,找到均值 {µ[1], µ[2], …µ[k]} 的两步任务,使得分配给每个数据点的概率最大化,这是通过期望最大化(EM)过程完成的。
迭代过程可以定义为 E 步,在迭代 i 中计算每个数据点的期望簇:
M 步最大化计算给定属于簇的数据点的 µt+1:
EM 过程可能导致 GMM 收敛到局部最优。
优点和局限性
-
与任何特征都配合得很好;对于分类数据,计算离散概率,而对于数值数据,则估计连续概率函数。
-
它具有计算可扩展性问题。它可能导致局部最优。
-
k 个高斯成分的值必须先验地给出,类似于 k-Means。
层次聚类
层次聚类是一种基于连接性的聚类方法,广泛用于分析和探索数据,而不仅仅用作聚类技术(参考文献 [12])。其思路是迭代地构建二叉树,从顶部或底部开始,使得相似点聚集在一起。树的每一层都提供了数据的有趣总结。
输入和输出
层次聚类通常基于基于相似性的转换,因此接受分类数据和连续数据。层次聚类只需要相似度或距离度量来计算相似度,不需要像 k-means 或 GMM 那样需要聚类数量。
如何工作?
层次聚类有许多变体,但我们将讨论聚合聚类。聚合聚类首先将所有数据元素放入它们自己的组中。然后,它根据使用的相似度度量迭代合并组,直到只剩下一个组。树的每一层或分组提供了数据的独特分割,分析师需要选择适合问题域的正确层。聚合聚类通常使用树状图进行可视化,该图显示了在相似性处的数据点合并。常用的相似度方法选择包括:
-
单链接:相似性是点群之间的最小距离:
-
完全链接:相似性是点群之间的最大距离:
-
平均链接:点群之间的平均相似性:
优点和局限性
-
即使数据中可能没有这样的结构,层次聚类也会在数据上施加层次结构。
-
相似度度量的选择可能导致合并和树状图的大幅不同,因此它对用户输入有很大的依赖性。
-
层次聚类在数据点增加时容易受到可扩展性的影响。根据使用的距离度量,它可能对噪声和异常值敏感。
自组织映射(SOM)
SOM 是一种基于神经网络的算法,可以被视为降维、流形学习或聚类技术(参考文献 [17])。神经生物学研究表明,我们的大脑将不同的功能映射到不同的区域,称为拓扑图,这是该技术的基础。
输入和输出
在 SOM 中仅使用数值特征。模型参数包括距离函数(通常使用欧几里得距离)以及以宽度和高度或晶格中的单元格数量表示的晶格参数。
如何工作?
SOM,也称为 Kohonen 网络,可以被视为一个双层神经网络,其中每个输出层是一个二维晶格,按行和列排列,每个神经元都与输入层完全连接。
与神经网络类似,权重最初使用随机值生成。该过程有三个不同的训练阶段:
-
竞争阶段:在这个阶段,神经元根据判别值进行竞争,通常基于神经元权重与输入向量的距离;这样,两个神经元之间的最小距离决定了输入被分配给哪个神经元。使用欧几里得距离,输入 xi 与晶格位置 (j, i) 的神经元之间的距离由 w[ji] 给出:
-
合作阶段:在这个阶段,获胜神经元在其拓扑邻域中找到最佳空间位置。对于给定神经元 (j, i),获胜神经元 I(x) 的拓扑邻域,距离 S[ij],邻域大小为 σ,定义为:
邻域大小以某种已知衰减函数(如指数函数)随时间减少的方式定义:
-
自适应阶段:在这个阶段,获胜神经元及其邻域神经元的权重被更新。权重的更新通常使用以下方式完成:
在这里,学习率 n(t) 再次定义为与邻域大小类似的指数衰减。
使用统一距离矩阵(U-Matrix)的 SOM 可视化创建了一个衡量神经元权重与其邻居之间平均距离的单个度量,然后可以通过不同的颜色强度进行可视化。这有助于识别邻域中的相似神经元。
优点和局限性
-
SOM 的最大优点是它易于理解,并且使用 U-matrix 可视化对数据进行二维聚类可以非常有效地理解模式。
-
相似性/距离函数的选择对聚类有巨大影响,必须由用户仔细选择。
-
SOM 的计算复杂度使得它无法在大于几千个数据集上使用。
谱聚类
谱聚类是一种基于图理论的分区聚类技术(参考文献 [15])。它将数据集转换为连通图,并进行图分区以找到聚类。这是图像处理、运动检测和一些基于非结构化数据领域的流行方法。
输入和输出
谱聚类仅使用数值特征。模型参数,如核的选择、核参数、要选择的特征值数量以及分区算法(如 k-Means)必须正确定义以实现最佳性能。
如何工作?
以下步骤描述了该技术在实践中的应用:
-
给定数据点,使用高斯核等平滑核函数计算亲和度(或邻接)矩阵:
对于较近的点,
而对于较远的点,
-
下一步是使用各种归一化方法计算图拉普拉斯矩阵。所有拉普拉斯矩阵方法都使用对角度矩阵 D,它测量图中每个节点的度:
简单的拉普拉斯矩阵是 L = D (度矩阵) – A(亲和度矩阵)。
-
从特征值问题或广义特征值问题中计算前 k 个特征值。
-
使用分区算法,如 k-Means,在 k 维子空间中进一步分离聚类。
优点和局限性
-
当聚类形状或大小不规则且非凸时,谱聚类工作得非常好。谱聚类有太多的参数选择和调整,以获得良好的结果是一项相当复杂的任务。
-
理论上已经证明,在存在噪声数据的情况下,谱聚类具有更好的稳定性。当聚类没有很好地分离时,谱聚类表现良好。
亲和传播
亲和传播可以被视为 K-medoids 方法的扩展,因为它与从数据中挑选示例相似(参考文献 [16])。亲和传播使用距离或相似度矩阵的图,并选择训练数据中的所有示例作为示例。作为数据点之间 亲和度 的迭代消息传递自动检测聚类、示例,甚至聚类数量。
输入和输出
通常,除了最大迭代次数,这是大多数算法的共同点,不需要其他输入参数。
如何工作?
我们将首先解释数据点之间交换的两种类型的信息:
-
责任 r(i,k):这是从数据点到候选示例的消息。这提供了一个度量,说明与其它示例相比,该示例对该数据点的适应性如何。更新责任规则的规则如下:
其中 s(i, k) = 数据点 i 和 k 之间的相似度。
a(i, k) = 示例 k 对 i 的可用性。
-
可用性 a(i,k):这是从候选示例到数据点的消息。这提供了一个度量,表示在考虑其他数据点的情况下,示例对数据点的支持有多好。这可以被视为软聚类分配。更新可用性的规则如下:
图 4:亲和传播中使用的消息类型
算法可以总结如下:
-
初始化
-
对于所有增量i到n:
-
结束。
-
对于所有满足(r(i,i) + a(i,i) > 0)的x[i]
-
x[i]是示例。
-
所有非示例x[j]都使用相似度度量s(i, j)分配到最近的示例。
-
-
结束。
优点和局限性
-
相似性传播是一个确定性算法。k-means 或 K-medoids 对初始点的选择很敏感,这通过将每个点视为示例来克服。
-
聚类的数量不必指定,并且通过过程自动确定。
-
它适用于非度量空间,并且不需要距离/相似度来具有约束性质,例如三角不等式或对称性。这使得算法可以在具有分类和文本数据等多种数据集上使用:
-
由于其更新方法,该算法可以轻松并行化,并且具有快速的训练时间。
聚类验证和评估
聚类验证和评估是确定算法有用性的最重要的机制之一(参考文献 [18])。这些主题可以大致分为两类:
-
内部评估指标:在这种情况下,指标使用数据本身的一些聚类质量,而不需要访问真实值。
-
外部评估指标:在这种情况下,指标使用一些外部信息,例如已知的真实值或类别标签。
内部评估指标
内部评估仅使用聚类和数据信息来收集有关聚类结果好坏的指标。应用程序可能对指标的选择有一定的影响。一些算法对特定的评估指标有偏见。因此,在选择合适的指标、算法和参数时必须谨慎,基于这些考虑:
-
紧凑性:使用不同策略测量的聚类方差用于给出紧凑性值;方差越低,聚类越紧凑。
-
分离性:聚类之间分离得有多好?
符号
下面是对以下内容中使用的符号的简要解释:所有数据元素的数据集=D,数据元素数量=n,每个数据元素的维度或特征=d,整个数据集的中心D = c,聚类数量=NC,第i个聚类=C[i],第i个聚类中的数据数量=n[i],第i个聚类的中心=c[i],第i个聚类的方差=σ(C[i]),两点x和y之间的距离=d (x,y)。
R-Squared
目标是使用聚类之间的平方和总和与整个数据上的总平方和的比率来衡量聚类之间的差异程度。公式如下:
Dunn 的指数
目标是识别密集且分离良好的聚类。该度量由以下公式的最大值给出:
Davies-Bouldin 指数
目标是识别具有低簇内距离和高簇间距离的聚类:
轮廓指数
目标是测量簇间和簇内距离的成对差异。它还用于通过最大化指数来找到最佳聚类数量。公式如下:
这里和
。
外部评估度量
聚类的外部评估度量与使用混淆矩阵元素或使用数据和标签的信息论度量分类度量相似。以下是一些最常用的度量方法。
兰德指数
兰德指数使用以下公式衡量聚类算法做出的正确决策:
F-Measure
F-Measure 结合了在聚类中应用的精确度和召回度度量,如下公式所示:
在这里,n[ij]是聚类j中类别i的数据元素数量,n[j]是聚类j中的数据数量,n[i]是类别i中的数据数量。F-Measure 越高,聚类质量越好。
归一化互信息指数
NMI 是应用于聚类的许多基于熵的度量之一。与聚类C相关的熵是关于簇随机选择数据元素的不确定性的度量。
其中
是元素在聚类Ci 中被选中的概率。
两个聚类之间的互信息由以下公式给出:
这里,这是元素被聚类C和C^'同时选中的概率。
归一化互信息(NMI)有多种形式;其中一种如下所示:
异常值或异常检测
格鲁布斯在 1969 年给出了定义,“一个异常值,或称为异常值,是看起来明显偏离其所在样本中其他成员的观察值”。
霍金斯在 1980 年将异常值或异常定义为“一个与其他观察值差异如此之大,以至于引起怀疑它是由不同机制生成的观察”。
巴内特和刘易斯在 1994 年将其定义为“一个(或一组)观察值,似乎与该数据集的其余部分不一致”。
异常值算法
异常值检测技术根据不同的方法来分类,这些方法定义了异常值,即根据某些属性将数据集中的某些对象与其他对象区分开来:
-
基于统计的:根据选择的分布来看,这是不可能的
-
基于距离的:根据选择的距离度量,与邻居孤立,并且阈值距离内的邻居比例
-
基于密度的:与邻居相比,它与其邻居相比更加孤立
-
基于聚类的:这是相对于其他簇孤立存在的簇,或者不是任何簇的成员
-
基于高维度的:这是在数据投影到低维度后,通过常规技术识别出的异常值,或者通过选择一个适合高维度的适当度量
基于统计的方法
使用参数方法进行异常值检测的基于统计的技术假设对数据分布的一些了解(参考文献 [19])。从观察中,估计模型参数。在模型中概率低于阈值值的数据点被认为是异常值。当分布未知或没有合适的假设时,使用非参数方法。
输入和输出
用于异常值检测的统计方法与实值数据集一起工作。在假设多元分布的参数方法中,距离度量的选择可能是一个用户选择的输入。在基于频率直方图的非参数方法中,使用用户定义的阈值频率。在核密度估计技术中,核方法和带宽的选择也是用户决定的。基于统计的方法的输出是一个表示异常程度的分数。
如何工作?
大多数基于统计的异常值检测要么假设一个分布,要么将分布拟合到数据中,以概率方式检测从分布中生成的最不可能的数据。这些方法有两个不同的步骤:
-
训练步骤:在这里,执行拟合数据的模型估计
-
测试步骤:在每个实例上,基于模型和特定实例执行拟合优度检验,得到一个分数和异常值程度
基于参数的方法假设一个分布模型,如多元高斯分布,并且训练通常涉及使用诸如最大似然估计(MLE)等技术来估计均值和方差。测试通常包括均值-方差或箱线图测试等技术,并伴随假设“如果超出三个标准差,则视为异常值”。
一个正常的多元分布可以被估计为:
使用均值 µ 和协方差 Ʃ。
马氏距离可以是数据点从由方程 给出的分布的估计。当马氏距离受到异常值影响时,也会使用一些变体,例如最小协方差行列式(MCD)。
非参数方法涉及诸如使用频率或宽度方法为每个特征构建直方图等技术。当某个箱子中的数据与直方图平均值的比率低于用户定义的阈值时,这样的箱子被称为稀疏。特征的低概率会导致更高的异常值得分。总异常值得分可以计算如下:
在这里,w[f] 是赋予特征 f 的权重,p[f] 是测试数据点中特征值的概率,F 是特征集权重的总和。核密度估计也用于使用用户定义的核和带宽的非参数方法。
优点和局限性
-
当模型拟合或数据分布已知时,这些方法非常高效,因为你不需要存储整个数据,只需存储进行测试所需的关键统计数据。
-
然而,分布的假设在参数方法中可能是一个大问题。大多数使用核密度估计的非参数方法在大数据集上扩展性不好。
基于距离的方法
基于距离的算法在一般假设下工作,即正常数据有其他数据点更接近它,而异常数据与其邻居很好地隔离(参考文献 [20])。
输入和输出
基于距离的技术需要将原生数值或分类特征转换为数值。基于距离的方法的输入包括使用的距离度量、距离阈值 ϵ 和 π,以及阈值分数 π,它们共同决定一个点是否是异常值。对于 KNN 方法,选择 k 是一个输入。
如何工作?
基于距离的异常值有很多种变体,我们将从高层次上讨论它们各自的工作原理:
-
DB (ϵ, π*) 算法:给定半径 ϵ 和阈值 π,如果一个数据点的 π 百分比的距离小于 ϵ,则该数据点被认为是异常值。还有进一步的变体,使用嵌套循环结构、基于网格的结构和基于索引的结构来执行计算。
-
基于 KNN 的方法也非常常见,其中异常值得分是通过计算点到 KNN 的距离或从 {1NN,2NN,3NN…KNN} 到点的平均距离来计算的。
优点和局限性
-
基于距离的算法的主要优点是它们是非参数的,不对分布和模型拟合方式做出假设。
-
距离计算很简单,可以并行计算,有助于算法在大数据集上扩展。
-
基于距离的方法的主要问题是第一章中讨论的维度诅咒;对于高维数据,稀疏性可能导致异常值噪声。
基于密度的方法
基于密度的方法通过不仅测量给定点的局部密度,还测量其邻域点的局部密度来扩展基于距离的方法。因此,添加的相对因子使其在寻找更复杂的局部或全局异常值方面具有优势,但这也增加了计算成本。
输入和输出
基于密度的算法必须提供输入半径 ϵ 中心对象的最小点数 MinPts,以确定它是一个簇的核心对象。
它是如何工作的?
我们将首先讨论 局部异常因子(LOF)方法,然后讨论 LOF 的某些变体 [21]。
给定 MinPts 作为参数,数据点的 LOF 为:
这里 |N [MinPts] (p)| 是点 p 邻域中的数据点数量,lrd [MinPts] 是点的局部可达密度,定义为:
这里 是点的可达性,定义为:
LOF 的一个缺点是它可能会错过那些其邻域密度接近其邻域密度的异常值。使用从数据点起源的基于集合的最近路径和基于集合的最近轨迹的连通性异常值(COF)被用来改进 LOF。COF 对低密度区域和孤立区域的处理不同,克服了 LOF 的缺点:
LOF 的另一个缺点是当簇在变化密度且未分离时,LOF 将生成反直觉的分数。克服这一点的办法之一是使用基于 KNN 和其反向 KNN 或 RNN 的点的影响空间(IS)。RNN 将给定点作为其 K 个最近邻之一。点的异常性称为受影响异常值或 INFLO,其值为:
这里,den(p) 是 p 的局部密度:
图 5:基于密度的异常值检测方法特别适合寻找局部和全局异常值
优点和局限性
-
已证明基于密度的方法比基于距离的方法更有效。
-
基于密度的异常值检测计算成本高,且通常可解释性较差。
基于聚类的算法
一些认为,旨在找到位于一起的数据点群体的聚类技术,在某种程度上与异常或异常值检测问题相对立。然而,作为一种高级无监督学习技术,聚类分析提供了几种方法来找到位于其他簇较远或根本不在任何簇中的有趣簇组。
输入和输出
如前所述,聚类技术适用于实值数据,尽管可以容忍一些转换为数值的类别值。在 k-Means 和 k-Medoids 的情况下,输入值包括簇的数量k和距离度量。变体可能需要阈值得分来识别异常值组。对于使用 EM 的 Gaussian Mixture Models,必须由用户提供混合成分的数量。当使用 CBLOF 时,期望两个用户定义的参数:小簇的大小和大簇的大小。根据使用的算法,单个对象或对象组作为异常值输出。
它是如何工作的?
如我们在聚类章节中讨论的,存在各种类型的聚类方法,我们将给出一些聚类算法如何扩展用于异常值检测的例子。
k-Means 或 k-Medoids 及其变体通常将数据元素聚在一起,并受异常值或噪声的影响。而不是通过删除或转换预处理这些数据点,这些削弱簇“紧密性”的点被视为异常值。通常,异常值通过先运行聚类算法然后评估某种形式的异常值得分来揭示,该得分衡量点与质心的距离。此外,许多变体将小于阈值大小的簇视为异常值组。
高斯混合模型(GMM)使用期望最大化(EM)是另一种著名的基于聚类的异常值检测技术,其中属于某个簇的概率较低的数据点成为异常值,异常值得分成为 EM 概率输出得分的倒数。
基于簇的局部异常因子(CBLOF)使用两阶段过程来寻找异常值。首先,聚类算法将数据划分为各种大小的簇。使用两个用户定义的参数,大簇的大小和小簇的大小,形成两套簇集:
优点和局限性
-
由于基于聚类的技术已被充分理解,结果更具可解释性,并且有更多工具可用于这些技术。
-
许多聚类算法仅检测簇,与给出得分、排名或其他识别异常值的异常值算法相比,在无监督技术中效果较差。
基于高维的方法
距离、密度或甚至基于聚类的几种方法的关键问题之一是维度诅咒。随着维度的增加,距离之间的对比度减小,邻域的概念变得不那么有意义。在这种情况下,正常点看起来像是异常值,并且错误正例的数量大幅增加。我们将讨论一些解决这个问题的最新方法。
输入和输出
将数据投影到低维子空间中的算法可以很好地处理缺失数据。在这些技术中,如 SOD,ϕ,每个维度的范围数量成为输入(参考文献 [25])。当使用进化算法时,具有最低稀疏系数的单元格数量是算法的另一个输入参数。
如何工作?
解决高维异常值问题的广泛思路是:
-
或者将鲁棒的距离度量与所有先前技术相结合,以便可以在完整维度中识别异常值
-
或者将数据投影到较小的子空间中,并在较小的子空间中找到异常值
基于角度的异常值度(ABOD)方法使用这样一个基本假设:如果一个高维数据点是异常值,那么从它出发指向最近数据点的所有向量在或多或少的同一方向上。
图 6:区分异常值和内点的 ABOD 方法
给定点 p 和任意两点 x 和 y,这两点与 p 之间的角度由以下公式给出:
作为 ABOD 分数使用的方差度量由以下公式给出:
ABOD 值越小,角度谱中的方差度量越小,点成为异常值的可能性就越大。
另一种在高维数据中非常有用的方法是使用子空间异常值检测(SOD)方法(参考文献 [23])。其想法是将高维空间划分为每个维度中范围数量相等的区域,例如在 d 个维度中都有 ϕ 个范围。然后,通过在每个 d 维度中选择一个范围形成的单元格 C 的稀疏系数如下测量:
在这里,n 是数据点的总数,N(C) 是单元格 C 中数据点的数量。通常,位于具有负稀疏系数的单元格中的数据点被认为是异常值。
优点和局限性
-
ABOD 方法的时间复杂度为 O(n³)*,与数据点的数量成正比,因此在大数据集上变得不切实际。
-
子空间中的稀疏系数方法需要高效地在低维中进行搜索,问题变得 NP-Hard,因此采用了某种形式的进化或启发式搜索。
-
稀疏系数方法由于是 NP-Hard,可能会导致局部最优。
一类 SVM
在许多领域,存在一个特定的感兴趣类或类别,而“其余”则无关紧要。找到围绕这个感兴趣类的边界是一类别 SVM(参考文献 [26])背后的基本思想。基本假设是正类(感兴趣类)的所有点都聚集在一起,而其他类的元素则散布开来,我们可以在聚集实例周围找到一个紧密的超球体。SVM,具有强大的理论基础和在二类别分类中的应用,被重新公式化以解决一类别 SVM。以下图示说明了如何使用一类别 SVM 和松弛项简化非线性边界,以避免过度拟合复杂函数:
图 7:一类别 SVM 用于非线性边界
输入和输出
数据输入通常是数值特征。许多 SVM 可以接受名义特征并对它们应用二进制转换。还需要标记感兴趣类的类别,SVM 超参数,如核选择、核参数和成本参数等。输出是一个可以预测实例是否属于感兴趣类的 SVM 模型。这与我们之前看到的评分模型不同。
如何工作?
输入是训练实例{x[1],x[2]…x[n]},其中某些实例被标记为属于+1 类,其余属于-1 类。
SVM 的输入也需要一个核,它将输入空间转换为特征空间的变换 ϕ 如 使用:
使用 SVM 重新公式化的方程创建一个界定类的超球体:
如此+
,
R 是以c为中心的超球体的半径,ν ∈ (0,1] 表示异常值数据所占分数的上限。
正常 SVM 一样,我们通过二次规划进行优化,以获得决策边界的解。
优点和局限性
-
使用一类别 SVM 的关键优势——正如二类别 SVM 一样——是许多关于误差和泛化界限的理论保证。
-
高维数据可以轻松地在一类别 SVM 中映射。
-
带核的非线性 SVM 甚至可以找到非球形的形状来界定数据的簇。
-
随着数据量的增加,训练成本在空间和内存中增加。
-
参数调整,尤其是核参数和未标记数据的成本参数调整,是一个巨大的挑战。
异常值评估技术
以标签、排名和分数来衡量异常值是一个活跃的研究领域。当标签或真实标签已知时,由于已知异常值类别,评估的想法变得容易得多,可以采用标准指标。但是,当真实标签未知时,评估和验证方法非常主观,并且没有明确定义、严格的统计过程。
监督评估
在已知真实标签的情况下,对异常值算法的评估基本上是寻找异常值分数(基于评分的异常值)的最佳阈值。
在减少假阳性并提高真阳性之间的平衡是关键概念,并且精度-召回曲线(在第二章 Chapter 2 中描述,《面向现实世界监督学习的实用方法)被用来找到最佳最优阈值。在监督学习中,置信度分数、预测和实际标签被用来绘制 PR 曲线,而在这里,不是使用置信度分数,而是对异常值分数进行排序并使用。ROC 曲线和曲线下的面积也被广泛应用于评估阈值。当已知真实标签时,比较两个或多个算法并选择最佳算法也可以使用曲线下的面积指标来完成。
无监督评估
在大多数现实世界的案例中,知道真实标签是非常困难的,至少在建模任务期间是这样的。霍金斯以非常高的水平描述了这种情况下的评估方法,将其称为“包含异常值的样本将显示出'异常'和'内含'观察值之间的大差距以及异常值与内含组之间的偏差,这些偏差是在某些适当标准化的尺度上测量的”。
当不知道真实标签时,在评估异常值时使用的通用技术是:
-
异常值分数直方图:一种基于可视化的方法,其中异常值分数被分组到预定义的箱中,用户可以根据异常值计数、分数和阈值来选择阈值。
-
评分归一化和距离函数:在这种技术中,进行某种形式的归一化以确保所有产生分数的异常值算法具有相同的范围。使用某种形式的距离或相似性或相关性的方法来找到不同算法之间异常值的共性。这里的总体直觉是:越多的算法将数据点视为异常值,该点实际上为异常值的概率就越高。
现实世界案例研究
在这里,我们提供了一个案例研究,说明了如何使用本章中描述的聚类和异常值技术,通过开源 Java 框架和知名图像数据集在现实世界中应用。
工具和软件
现在我们将介绍本章实验中使用的两种新工具:SMILE 和 Elki。SMILE 提供了一个 Java API,用于展示使用 PCA、随机投影和 IsoMap 进行特征降维。随后,Elki 的图形界面被用来执行无监督学习——具体来说,是聚类和异常值检测。Elki 附带了一组丰富的聚类分析和异常值检测算法,包括大量可供选择的模型评估器。
备注
了解更多关于 SMILE 的信息:haifengl.github.io/smile/
,以及更多关于 Elki 的信息,请访问:elki.dbs.ifi.lmu.de/
。
商业问题
识别字符是许多商业领域遇到的问题,例如,医疗报告和医院图表的翻译,邮政服务中的邮政编码识别,零售银行的支票存款服务,以及其他一些领域。人类手写体在个体之间可能有很大的差异。在这里,我们专门关注手写数字,即 0 到 9。由于某些数字集合(如 1/2/7 和 6/9/0)之间的相似性,这个问题变得很有趣。在本章的实验中,我们使用了几种不同的算法进行聚类和异常值分析,以展示这些方法的相对优势和劣势。鉴于这些技术在数据挖掘应用中的广泛应用,我们的主要目标是深入了解数据和算法以及评估措施;我们不对测试数据进行预测。
机器学习映射
如章节标题所示,我们的实验旨在通过忽略数据集中识别数字的标签来展示无监督学习。从数据集中学习后,聚类和异常值分析可以提供关于数据中模式的有价值信息,并且通常用于探索这些模式和相互关系,而不仅仅是预测未见数据的类别。在本章描述的实验中,我们关注的是描述和探索,而不是预测。当外部评估措施可用时,使用标签,正如这些实验中一样。
数据收集
这已经为我们准备好了。关于数据收集的详细信息,请参阅:MNIST 数据库:yann.lecun.com/exdb/mnist/
。
数据质量分析
数据点中的每个特征都是 784 个像素中的一个的灰度值。因此,所有特征的类型都是数值型;除了类别属性是 0 到 9 范围内的数字之外,没有其他分类类型。此外,数据集中没有缺失数据元素。以下是几个像素的一些基本统计信息的表格。图像在 28 x 28 的框中预先居中,因此在大多数例子中,框边沿的数据是零:
特征 | 平均值 | 标准差 | 最小值 | 最大值 |
---|---|---|---|---|
pixel300 | 94.25883 | 109.117 | 0 | 255 |
pixel301 | 72.778 | 103.0266 | 0 | 255 |
pixel302 | 49.06167 | 90.68359 | 0 | 255 |
pixel303 | 28.0685 | 70.38963 | 0 | 255 |
pixel304 | 12.84683 | 49.01016 | 0 | 255 |
pixel305 | 4.0885 | 27.21033 | 0 | 255 |
pixel306 | 1.147 | 14.44462 | 0 | 254 |
pixel307 | 0.201667 | 6.225763 | 0 | 254 |
pixel308 | 0 | 0 | 0 | 0 |
pixel309 | 0.009167 | 0.710047 | 0 | 55 |
pixel310 | 0.102667 | 4.060198 | 0 | 237 |
表 1:预处理前原始数据集特征摘要
混合国家标准与技术研究院(MNIST)数据集是用于评估无监督学习方法的常用数据集。MNIST 数据集之所以被选中,主要是因为高维数据中的簇没有很好地分离。
原始 MNIST 数据集来自 NIST 的黑白图像。它们被归一化以适应 20 x 20 像素的框,同时保持宽高比。通过计算质心并将其平移到 28 x 28 维网格的中心,图像被定位在 28 x 28 图像的中心。
每个像素的强度基于 0 到 255 的范围。784 个像素值被展平,成为每个图像的高维特征集。以下图展示了数据中的一个样本数字 3,以及映射到网格中,每个像素都有一个从 0 到 255 的整数值。
本节中描述的实验旨在展示无监督学习技术在知名数据集上的应用。正如在第二章中所述,使用监督学习技术进行“现实世界监督学习的实用方法”,进行了多个实验,使用了多种聚类和异常值方法。每个选定方法的有无特征减少的实验结果都进行了展示,随后对结果进行了分析。
数据采样和转换
由于我们的重点是使用各种无监督技术探索数据集,而不是预测方面,所以我们在这里不关心训练、验证和测试样本。相反,我们使用整个数据集来训练模型以执行聚类分析。
在异常值检测的情况下,我们创建了一个仅包含两个数据类别的样本,即 1 和 7。选择具有相似形状的数字数据集是为了设置一个问题空间,在这个空间中,各种异常检测技术的判别能力将更加突出。
特征分析和降维
我们使用 SMILE 机器学习工具包的 Java API 展示了不同的特征分析和降维方法——PCA、随机投影和 IsoMap。
图 8:显示数字 3,像素值分布在 0 到 254 的 28 x 28 矩阵中。
加载数据集和读取值的代码在此处给出,并带有内联注释:
//parser to parse the tab delimited file
DelimitedTextParser parser = new DelimitedTextParser();parser.setDelimiter("[\t]+");
//parse the file from the location
parser.parse("mnistData", new File(fileLocation);
//the header data file has column names to map
parser.setColumnNames(true);
//the class attribute or the response variable index
AttributeDataSet dataset = parser.setResponseIndex(new NominalAttribute("class"), 784);
//convert the data into two-dimensional array for using various techniques
double[][] data = dataset.toArray(new double[dataset.size()][]);
PCA
以下代码片段说明了使用 PCA 支持 API 实现的降维:
//perform PCA with double data and using covariance //matrix
PCA pca = new PCA(data, true);
//set the projection dimension as two (for plotting here)
pca.setProjection(2);
//get the new projected data in the dimension
double[][] y = pca.project(data);
图 9:MNIST 上的 PCA – 在左侧,我们看到超过 90%的数据方差由原始特征数量的一半以下解释;在右侧,使用前两个主成分表示数据。
表 2:PCA 后 11 个随机特征的汇总
PCA 计算将特征数量减少到 274。在下面的表中,您可以看到随机选择的一组特征的基本统计信息。特征数据作为 PCA 的一部分进行了归一化:
特征 | 平均值 | 标准差 | 最小值 | 最大值 |
---|---|---|---|---|
1 | 0 | 2.982922 | -35.0821 | 19.73339 |
2 | 0 | 2.415088 | -32.6218 | 31.63361 |
3 | 0 | 2.165878 | -21.4073 | 16.50271 |
4 | 0 | 1.78834 | -27.537 | 31.52653 |
5 | 0 | 1.652688 | -21.4661 | 22.62837 |
6 | 0 | 1.231167 | -15.157 | 10.19708 |
7 | 0 | 0.861705 | -6.04737 | 7.220233 |
8 | 0 | 0.631403 | -6.80167 | 3.633182 |
9 | 0 | 0.606252 | -5.46206 | 4.118598 |
10 | 0 | 0.578355 | -4.21456 | 3.621186 |
11 | 0 | 0.528816 | -3.48564 | 3.896156 |
表 2:PCA 后 11 个随机特征的汇总
随机投影
在这里,我们展示了使用随机投影进行数据转换的 API 的简单用法:
//random projection done on the data with projection in //2 dimension
RandomProjection rp = new RandomProjection(data.length, 2, false);
//get the transformed data for plotting
double[][] projectedData = rp.project(data);
图 10:PCA 和随机投影 – 使用 Smile API 在二维中的表示
ISOMAP
此代码片段说明了使用 Isomap 转换的 API 的用法:
//perform isomap transformation of data, here in 2 //dimensions with k=10
IsoMap isomap = new IsoMap(data, 2, 10);
//get the transformed data back
double[][] y = isomap.getCoordinates();
图 11:IsoMap – 使用 Smile API 在 k = 10 的情况下在二维中的表示
特征分析和降维观察
我们可以从图中显示的结果中得出以下观察:
-
主成分分析(PCA)的方差和维度数量图清晰地显示,大约有 100 个线性组合的特征在数据中的表示或方差与原始的 784 个特征相似(> 95%)。这是任何无监督特征降维分析的关键第一步。
-
即使是两个维度而不是之前描述的 100 个维度,PCA 也能在散点图可视化中显示出一些真正有价值的见解。显然,数字 2、8 和 4 彼此之间非常清晰地分开,这很合理,因为它们彼此之间写得很清晰。在低维空间中,如{1,7}、{3,0,5}和{1,9}这样的数字要么重叠,要么紧密聚集。这表明仅用两个特征是无法有效区分的。这也表明在这些类别之间存在着特征或属性的重叠。
-
下一个图表比较了主成分分析(PCA)与随机投影在低维 2 维空间下的结果,显示两者输出之间有很多共同之处。它们在区分不同类别方面与之前在 PCA 中描述的相似。值得注意的是,PCA 在区分数字{8,9,4}等方面比随机投影做得更好。
-
Isomap 的下一个图表显示了良好的区分度,类似于 PCA。主观上,它似乎比随机投影更好地分离数据。例如,在 Isomap 中,{3,0,5}比在 PCA 中分离得更好。
聚类模型、结果和评估
使用 MNIST-6000 数据集进行了两组实验。该数据集包含 6,000 个示例,每个示例代表一个手写数字,以 28 x 28 像素方格的灰度值表示。
首先,我们运行了一些聚类技术来识别数字的 10 个聚类。在本案例研究的这部分实验中,我们使用软件 Elki。
在第一组实验中,没有涉及特征降维。所有 28x28 像素都被使用。使用了包括 k-Means、EM(对角高斯模型工厂)、DBSCAN、层次结构(HDBSCAN 层次提取)以及亲和传播在内的聚类技术。在每种情况下,我们使用两个内部评估器的指标:戴维斯-博尔丁和影子系数,以及几个外部评估器:精确度、召回率、F1 度量以及兰德指数。
图 12:K-Means – 使用平方和误差(SSE)找到最优k,即聚类数量。曲线中的肘部,通常用于选择最优 k 值,在图表中并不特别明显。
在 k-Means 的情况下,我们使用一系列 k 值进行了多次运行。图表显示,随着 k 值的增加,平方和误差(SSE)指标逐渐降低。
表格显示了k=10的结果,每个结果对应的排名在括号中:
算法 | 影子系数 | 戴维斯-博尔丁指数 | 精确度 | 召回率 | F1 | 兰德指数 |
---|---|---|---|---|---|---|
K-Means Lloyd | +-0.09 0.0737 (1) | 2.8489 (3) | 0.4463 (3) | 0.47843 (3) | 0.4618 (1) | 0.8881 (3) |
EM(对角高斯模型工厂) | NaN | 0 (1) | 0.1002 (6) | 1 (1) | 0.1822 (4) | 0.1003 (5) |
DBSCAN | 0 (4) | 0 (1) | 0.1003 (5) | 1 (1) | 0.1823 (3) | 0.1003 (5) |
层次结构(HDBSCAN 层次提取) | +-0.05 0.0435 (3) | 2.7294 | 0.1632 (4) | 0.9151 (2) | 0.2770 (2) | 0.5211 (4) |
层次结构(简化层次提取) | NaN | 0 (1) | 1 (1) | 0.0017 (5) | 0.0033 (6) | 0.8999 (2) |
亲和传播 | +-0.07 0.04690 (2) | 1.7872 (2) | 0.8279 (2) | 0.0281 (4) | 0.0543 (5) | 0.9019 (1) |
表 3. MNIST 数据的聚类算法评估
在第二个聚类实验中,首先使用 PCA 对数据集进行了预处理,然后使用每个示例 273 个特征的所得数据,与第一个实验中相同的算法一起使用。结果如表所示:
算法 | 影子系数 | 戴维斯-博尔丁指数 | 精确度 | 召回率 | F1 | Rand |
---|---|---|---|---|---|---|
K-Means Lloyd | +-0.14 0.0119 | 3.1830 | 0.3456 | 0.4418 | 0.3878 (1) | 0.8601 |
EM(对角高斯模型工厂) | +-0.16 -0.0402 | 3.5429 | 0.1808 | 0.3670 | 0.2422 | 0.7697 |
DBSCAN | +-0.13 -0.0351 | 1.3236 | 0.1078 | 0.9395 (1) | 0.1934 | 0.2143 |
层次(HDBSCAN 层次提取) | +-0.05 0.7920 (1) | 0.0968 | 0.1003 | 0.9996 | 0.1823 | 0.1005 |
相似传播 | +-0.09 0.0575 | 1.6296 | 0.6130 (1) | 0.0311 | 0.0592 | 0.9009 (1) |
子空间(DOC) | +-0.00 0.0 | 0 (1) | 0.1003 | 1 | 0.1823 | 0.1003 |
表 4. PCA 后 MNIST 数据聚类算法的评估
观察和聚类分析
如表 2.1 和表 2.2 所示,在聚类章节中讨论的不同算法使用不同的评估度量进行比较。
通常,根据技术、领域和业务需求比较不同的内部和外部度量标准非常重要。当数据集中有标签或结果时,使用外部度量标准成为一个更容易的选择。当没有标记数据时,通常使用内部度量标准,并对每个度量进行一些排名,然后查看所有度量之间的比较排名。在这个阶段,会做出一些重要且通常有趣的观察:
-
使用如平方和误差等度量评估 k-Means 的 k 值(如图所示),是查看“最优性”的聚类数量的基本步骤。图清楚地表明,随着 k 的增加,分数提高,聚类分离度提高。
-
当我们分析表 2.1 时,其中使用了所有 784 个特征,并显示了不同算法的所有评估度量,一些关键点脱颖而出:
-
k-Means 和相似传播在标准差和平均值方面在影子系数指标上都有很大的重叠(k-Means +-0.09 0.0737;相似传播 +-0.07 0.04690)。因此,很难在这个指标上分析它们。
-
在 DB Index(最小值越好)、Rand Index(越接近 1 越好)等度量中,我们可以看到相似传播和层次聚类显示出非常好的结果。
-
在考虑标签的度量中,层次聚类、DBSCAN 和 EM 要么具有高精确度,要么具有高召回率,因此 F1 度量较低。当考虑精确度和召回率时,k-Means 给出了最高的 F1 度量。
-
-
在表 2.2 中,使用 PCA 保留 95%方差减少的 273 个特征的数据集通过相同的算法运行并通过相同的度量进行评估,我们得出以下有趣的观察:
减少特征会对某些算法的每个度量指标产生负面影响;例如,k-Means 的所有度量指标都会降低。例如,亲和传播算法在减少特征时影响非常小,在某些情况下甚至有积极的影响。与使用所有特征的结果相比,AP 显示出相似的 Rand 指数和 F1,更好的召回率、DB 索引和轮廓度量,以及精度的小幅变化,显示出明显的鲁棒性。
层次聚类在更好的 DB 索引和 Rand 指数方面显示出与之前相似的结果,并且在 Rand 指数上的得分接近 AP。
异常值模型、结果和评估
对于异常值检测技术,我们使用了包含所有数字 1 示例和数字 7 示例的子集,以及数字 7 示例的欠采样子集。其想法是这两个数字的形状相似性会导致数字 7 示例被识别为异常值。
使用的模型来自 Angular、基于距离的聚类、LOF 和单类 SVM。
评估中使用的异常值度量指标包括 ROC AUC、平均精度、R-精度和最大 F1 度量。
下表显示了获得的结果,括号内为排名:
算法 | ROC AUC | 平均精度 | R-精度 | 最大 F1 |
---|---|---|---|---|
角度(ABOD) | 0.9515 (3) | 0.1908 (4) | 0.24 (4) | 0.3298 (4) |
基于距离(KNN 异常值) | 0.9863 (1) | 0.4312 (3) | 0.4533 (3) | 0.4545 (3) |
基于距离(局部孤立系数) | 0.9863 (1) | 0.4312 (3) | 0.4533 (3) | 0.4545 (3) |
聚类(EM 异常值) | 0.5 (5) | 0.97823827 (1) | 0.989 (1) | 0.9945 (1) |
LOF | 0.4577 (6) | 0.0499 (6) | 0.08 (6) | 0.0934 (6) |
LOF(ALOKI) | 0.5 (5) | 0.0110 (7) | 0.0110 (7) | 0.0218 (7) |
LOF(COF) | 0.4577 (6) | 0.0499 (6) | 0.08 (6) | 0.0934 (6) |
单类 SVM(RBF) | 0.9820 (2) | 0.5637 (2) | 0.5333 (2) | 0.5697 (2) |
单类 SVM(线性) | 0.8298 (4) | 0.1137 (5) | 0.16 (5) | 0.1770 (5) |
表 5 异常值分析算法评估度量
观察和分析
与我们评估不同的聚类方法一样,我们使用了一些观察结果来比较多个异常值算法。再次强调,正确的方法是根据所有指标对算法进行排名,然后了解它在所有指标上的表现与其他算法相比如何。这里使用的异常值度量指标都是用于比较异常值算法的标准外部度量:
-
有趣的是,当使用正确的参数,即k=2时,EM 可以找到正确的分布,并且比大多数算法更有效地找到异常值。它在包括最大 F1、R-精度和平均精度等重要指标中排名很高,位居第一。
-
1-Class SVM 使用非线性 RBF 核在大多数指标上表现一致良好,即在 ROC 面积、R-Precision、平均精度和最大 F1 上排名第二。线性 SVM(在大多数排名中大约排名第五)和 1-Class SVM(排名第二)之间的差异表明,问题在本质上确实是非线性的。一般来说,当维度较高(784)且异常值非线性且稀有时,带有核的 1-Class SVM 表现确实很好。
-
基于局部异常值(LOF)及其变体的技术几乎在所有指标中排名都较低。这表明异常值问题可能不是局部的,而是全局的。基于距离的算法(KNN 和局部隔离)在 ROC 曲线下的面积和局部异常值算法相比表现更好,尽管使用基于距离的度量可以得出问题确实是全局性的,适合使用基于距离的度量。
表 1:预处理前原始数据集特征摘要
摘要
监督学习和无监督学习方法在处理噪声数据、高维度以及随着数据规模增长对内存和时间的需求方面存在共同关注的问题。由于缺乏真实情况,无监督学习特有的其他问题是关于模型评估的主观性、模型的可解释性、聚类边界的影响等问题。
特征降维是一个重要的预处理步骤,它减轻了可扩展性问题,同时还具有其他优势。线性方法,如 PCA、随机投影和 MDS,各自具有特定的优点和局限性,我们必须意识到每个方法中固有的假设。非线性特征降维方法包括 KPCA 和流形学习。
在聚类算法中,k-Means 是一种基于质心的技术,通过选择聚类数量进行初始化,它对质心的初始选择敏感。DBSCAN 是密度基于算法之一,不需要初始化聚类数量,对噪声和异常值具有鲁棒性。在基于概率的技术中包括均值漂移,它是确定性的且对噪声鲁棒,以及 EM/GMM,它在所有类型的特征上表现良好。均值漂移和 EM/GMM 都倾向于存在可扩展性问题。
层次聚类是一种强大的方法,涉及构建二叉树,迭代地将数据点分组,直到达到相似性阈值。对噪声的容忍度取决于使用的相似性度量。SOM 是一个双层神经网络,允许在二维网格中可视化聚类。谱聚类将数据集视为一个连通图,通过图划分来识别聚类。亲和传播是另一种基于图的技巧,它使用数据点之间的消息传递作为亲和力来检测聚类。
使用各种验证和评估度量来证明聚类算法的有效性和实用性。内部度量无法访问真实标签;当标签可用时,可以使用外部度量。内部度量的例子有轮廓指数和 Davies-Bouldin 指数。Rand 指数和 F 度量是外部评估度量。
异常检测和异常检测是无监督学习的一个重要领域。技术被分为基于统计、基于距离、基于密度、基于聚类、高维和单类 SVM。异常评估技术包括有监督评估,其中已知真实标签,和无监督评估,当真实标签未知时。
使用 SMILE Java API 和 Elki 工具包进行的实验说明了在 MNIST6000 手写数字数据集上使用各种聚类和异常检测技术。不同评估技术的结果被展示和比较。
参考文献
-
K. Pearson (1901). 关于空间中点系统的最接近拟合的线和面. 哲学杂志,第 2 卷:559–572。
-
A. D. Back (1997). "独立成分分析在从股票回报中提取结构中的应用",神经系统,第 8 卷,第 4 期,第 473–484 页。
-
Tipping ME,Bishop CM (1999). 概率主成分分析. 英国皇家统计学会会刊,系列 B,第 61 卷,第 3 期:611–622. 10.1111/1467-9868.00196
-
Sanjoy Dasgupta (2000). 随机投影实验. 在第十六届不确定人工智能会议(UAI'00)论文集中,由 Craig Boutilier 和 Moisés Goldszmidt(编者). Morgan Kaufmann Publishers Inc.,旧金山,加利福尼亚州,美国,第 143-151 页。
-
T. Cox 和 M. Cox (2001). 多维尺度. Chapman Hall,博卡拉顿,第 2 版。
-
Bernhard Schoelkopf,Alexander J. Smola 和 Klaus-Robert Mueller (1999). 核主成分分析. 在核方法进展,麻省理工学院出版社,剑桥,马萨诸塞州,美国 327-352。
-
Tenenbaum, J.B.; De Silva, V.; & Langford, J.C (2000).全局非线性降维的几何框架. 科学. 第 290 卷,第 5500 期,第 2319-2323 页
-
M. Belkin and P. Niyogi (2003). 拉普拉斯特征映射用于降维和数据表示. 神经计算,第 15 卷,第 6 期:1373–1396。
-
S. Roweis and L. Saul (2000). 局部线性嵌入进行非线性降维. 科学,第 290 期:2323–2326。
-
Hartigan, J. and Wong, M (1979). 算法 AS136:k 均值聚类算法. 应用统计学,第 28 卷,第 100-108 页。
-
Dorin Comaniciu 和 Peter Meer (2002). 均值漂移:一种稳健的特征空间分析方法. IEEE Transactions on Pattern Analysis and Machine Intelligence,第 24 卷,第 603-619 页。
-
层次聚类 Jain, A. and Dubes, R (1988). 数据聚类算法. Prentice-Hall,恩格尔伍德克利夫斯,新泽西州。
-
Mclachlan, G. and Basford, K (1988). 混合模型:推理及其在聚类中的应用. Marcel Dekker,纽约,纽约州
-
Ester, M., Kriegel, H-P., Sander, J. 和 Xu, X (1996). 在大型空间数据库中带有噪声的发现聚类的一个基于密度的算法. 在第 2 届 ACM SIGKDD 会议的论文集中,第 226-231 页,俄勒冈州波特兰.
-
Y. Ng, M. I. Jordan, 和 Y. Weiss (2001). 关于谱聚类:分析和算法, 在神经信息处理系统进展中。麻省理工学院出版社,第 849–856 页.
-
Delbert Dueck 和 Brendan J. Frey (2007). 非度量亲和传播用于无监督图像分类. 在 IEEE 国际计算机视觉会议(ICCV)中,第 1–8 页.
-
Teuvo Kohonen (2001). 自组织映射. Springer, Berlin, Heidelberg. 1995. 第三版,扩展版.
-
M. Halkidi, Y. Batistakis, 和 M. Vazirgiannis (2001). 关于聚类验证技术, 智能信息系统杂志,第 17 卷,第 107–145 页.
-
M. Markou, S. Singh (2003). 新颖性检测:综述 – 第一部分:统计方法, 信号处理 83 (12) 2481–2497
-
Byers, S. D. 和 Raftery, A. E (1998). 空间点过程特征估计中的最近邻杂波去除. 美国统计学会杂志 93, 577–584.
-
Breunig, M. M., Kriegel, H.-P., Ng, R. T., 和 Sander, J (1999). Optics-of: 识别局部异常值. 在第三届欧洲数据挖掘和知识发现原则会议的论文集中,Springer-Verlag,第 262–270 页.
-
Brito, M. R., Chavez, E. L., Quiroz, A. J., 和 yukich, J. E (1997). 聚类和异常值检测中互为 k 近邻图的连通性. 统计概率信函 35, 1, 33–42.
-
Aggarwal C 和 Yu P S (2000). 高维数据中的异常值检测. 在 ACM SIGMOD 国际数据管理会议(SIGMOD)的论文集中,德克萨斯州达拉斯.
-
Ghoting, A., Parthasarathy, S., 和 Otey, M (2006). 基于距离的高维空间中快速挖掘异常值 在 SIAM 国际数据挖掘会议(SDM)的论文集中,Bethesda, ML. 在 SIAM 国际数据挖掘会议(SDM)的论文集中,Bethesda, ML.
-
Kriegel, H.-P., Schubert, M., 和 Zimek, A (2008). 基于角度的异常值检测, 在 ACM SIGKDD 国际知识发现和数据挖掘会议(SIGKDD)的论文集中,内华达州拉斯维加斯. 在 ACM SIGKDD 国际知识发现和数据挖掘会议(SIGKDD)的论文集中,内华达州拉斯维加斯.
-
Schoelkopf, B., Platt, J. C., Shawe-Taylor, J. C., Smola, A. J., 和 Williamson, R. C (2001). 估计高维分布的支持. 神经计算 13, 7, 1443–1471.
-
F Pedregosa, 等人. Scikit-learn: Python 中的机器学习. 机器学习研究杂志,第 2825-2830 页.
第四章. 半监督学习和主动学习
在第二章《实际应用中的监督学习》和第三章《无监督机器学习技术》中,我们讨论了两组主要的机器学习技术,这些技术适用于不同情况下标签数据的可用性——一种情况是所有目标值都是已知的,另一种情况是没有任何目标值。相比之下,本章中的技术处理的是我们必须分析并从包含一小部分带标签数据和大量未标记实例的数据中学习的情况。
在语音和图像识别中,有大量的数据可用,并且以各种形式存在。然而,对所有这些数据进行标记或分类的成本很高,因此,在实践中,被分类的语音或图像的比例与未被分类的比例非常小。同样,在网页文本或文档分类中,互联网上有大量的文档,但根据主题或上下文进行分类需要领域专家——这使得过程复杂且昂贵。在本章中,我们将讨论两个广泛的主题,涵盖“从未标记数据中学习”的领域,即半监督学习(SSL)和主动学习。我们将介绍每个主题,并像前几章一样讨论与每个主题相关的分类法和算法。由于本书强调实用方法,我们将讨论每种学习类型可用的工具和库。然后,我们将考虑现实世界的案例研究,并展示在实际情况中应用工具时有用的技术。
这里是本章涵盖的主题列表:
-
半监督学习:
-
表示法、符号和假设
-
半监督学习技术:
-
自训练 SSL
-
Co-training SSL
-
聚类和标签 SSL
-
传递式图标签传播
-
传递式 SVM
-
-
半监督学习案例研究
-
-
主动学习:
-
表示法和符号
-
主动学习场景
-
主动学习方法:
-
不确定性采样
-
最不自信采样
-
最小边缘采样
-
标签熵采样
-
-
版本空间采样:
-
意见分歧查询
-
委员会查询
-
-
数据分布采样:
-
预期模型变化
-
预期误差减少
-
方差减少
-
密度加权方法
-
-
-
主动学习案例研究
-
半监督学习
半监督学习背后的思想是从标记和无标签数据中学习,以提高模型的预测能力。这一概念通过一个简单的插图,图 1,进行了说明,它显示当有大量无标签数据可用时,例如网络上的 HTML 文档,专家可以将其中一些分类到已知的类别,如体育、新闻、娱乐等。这个小的标记数据集与大量的无标签数据集一起,可以用于半监督学习技术来学习模型。因此,利用标记和无标签数据的知识,模型可以分类未来未见过的文档。相比之下,监督学习仅使用标记数据:
图 1. 使用网络文档分类作为示例,展示了半监督学习过程(底部)与监督学习(顶部)的对比。主要区别在于可用于学习的标记数据量,在半监督学习中通过“少量”这一限定词进行了强调。
表示法、符号和假设
与之前一样,我们将介绍本章中使用的符号。数据集 D 由单个数据实例组成,表示为 x,它也以集合 {x[1], x[2],…x[n]} 的形式表示,这是没有标签的数据实例集合。与这些数据实例相关联的标签是 {y[1], y[2], … y[n]}。整个标记数据集可以表示为集合中的配对元素,如 D = {(x[1], y[1]), (x2,y[2]), … (x[n], y[n])},其中 x[i] ∈ ℝ^d。在半监督学习中,我们将数据集 D 进一步分为两个集合 U 和 L,分别用于无标签数据和标记数据。
标记数据 由所有已知结果 {y[1], y[2], .. y[l]} 的标记数据组成。无标签数据
是结果未知的数据集。|U| > |L|。
归纳半监督学习包括一系列技术,这些技术给定带有标记数据 和无标签数据
的训练集 D,学习一个表示为
的模型,使得模型 f 可以在训练无标签数据 U 之外的未见数据上成为一个好的预测器。它“归纳”出一个模型,可以像监督学习算法一样用于预测未见实例。
传导式半监督学习由一系列技术组成,给定训练集 D,它学习一个模型 ,该模型仅对未标记数据进行预测。它不需要在未见未来的实例上执行,因此是比基于归纳学习更简单的 SSL 形式。
在半监督学习算法中,以下列出的某些假设对于这些类型的学习成功至关重要。为了使 SSL(半监督学习)工作,以下假设中必须有一个或多个是真实的:
-
半监督平滑性:简单来说,如果两个点在密度或距离方面“接近”,则它们的标签是一致的。相反,如果两个点分离且位于不同的密度区域,则它们的标签不需要一致。
-
聚类共存性:如果类别的数据实例倾向于形成簇,那么未标记数据可以帮助聚类算法找到更好的簇。
-
流形共存性:在许多现实世界的数据集中,高维数据位于低维流形中,这使得学习算法能够克服维度灾难。如果给定数据集中存在这种情况,未标记的数据也会映射到流形上,从而可以改善学习。
半监督学习技术
在本节中,我们将描述不同的 SSL(半监督学习)技术以及一些伴随的算法。我们将使用与之前章节相同的结构,并在三个子节中描述每种方法:输入和输出、如何工作和优势和局限性。
自训练 SSL
自训练是 SSL(半监督学习)最简单的一种形式,其中我们通过应用从标记集学习到的模型对未标记集的数据进行简单迭代填充过程(参考文献 [1]):
图 2. 使用一些用蓝色矩形和黄色圆圈表示的标记数据在二元分类中进行自训练 SSL。经过多次迭代后,未标记数据被映射到相应的类别。
输入和输出
输入是带有少量标记和大量未标记数据的训练数据。提供一个基分类器,无论是线性的还是非线性的,例如朴素贝叶斯、KNN、决策树或其他,以及每个算法所需的超参数。数据类型上的约束将与基学习器相似。还需要做出停止条件的选择,例如“达到最大迭代次数”或“未标记数据耗尽”。通常,我们使用基学习器,这些学习器会对输出给出概率或排名。作为输出,这种技术生成可以用于对未标记数据集以外的未见数据集进行预测的模型。
它是如何工作的?
整个算法可以总结如下:
-
在停止标准未达到的情况下:
-
使用标记数据 L 训练分类器模型
-
在未标记数据 U 上应用分类器模型 f
-
从 U 中选择 k 个最自信的预测作为集合 L[u]
-
使用 k 个数据点 L = L ∪ L[u] 增强标记数据
-
-
在 2 下的所有步骤重复。
在概述中,自训练可以看作是将期望最大化过程应用于半监督设置。训练分类器模型的过程是使用最大似然估计(MLE)或最大后验概率估计(MAP)找到参数 θ。使用学习到的模型计算标签类似于 期望 步骤,其中 是根据参数 θ 从 U 中估计标签。学习带有增强标签的模型的迭代下一步类似于 最大化 步骤,其中新参数被调整到 θ'。
优点和局限性
优点和局限性如下:
-
简单,与大多数监督学习技术兼容。
-
异常值和噪声可能导致预测错误被强化,技术退化。
协同训练 SSL 或多视图 SSL
基于协同训练的 SSL 涉及从相同数据的不同“视图”中进行学习。它是多视图 SS(参考文献 [2])的一个特例。每个视图都可以被认为是一个捕获某些领域知识的点特征集,并且与其他视图正交。例如,一个网页文档数据集可以被认为有两个视图:一个视图是代表文本的特征,另一个视图是代表指向其他文档的超链接的特征。假设每个视图都有足够的数据,并且从每个视图中进行学习可以提高整体标记过程。在无法进行此类特征划分的数据集中,将特征随机分割成不相交的集合形成视图。
输入和输出
输入是带有少量标记和大量未标记数据的训练数据。除了提供数据点外,还有对应于每个视图的特征集,并且假设这些特征集不重叠且解决不同的分类问题。选择一个基分类器,如朴素贝叶斯、KNN、决策树或任何其他,以及每个算法所需的超参数。作为输出,此方法生成可用于对未标记数据以外的未见数据集进行预测的模型。
如何工作?
我们将使用数据的两个视图来演示该算法:
-
将数据初始化为
标记和
未标记。每个数据点有两个视图 x = [x¹,x²] 和 L = [L¹,L2]。
-
当未达到停止标准时:
-
使用标记数据 L1 和 L2 分别训练分类器模型
和
。
-
使用它们自己的特征在未标记数据 U 上应用分类器模型 f¹ 和 f²。
-
从 U 中选择 k 个最自信的预测,应用 f¹ 和 f² 作为集合 L[u]¹ 和 L[u]² 分别。
-
使用 k 个数据点 L¹ = L¹ ∪ L[u]¹ 和 L² = L² ∪ L[u]² 增强标记数据。
-
-
在 2. 下重复所有步骤。
优点和局限性
优点和局限性如下:
-
当特征具有不同的方面或不同领域的混合时,协同训练比简单的自训练更有利。
-
拥有正交视图并从中学习的能力的必要和充分条件对技术的通用性提出了挑战。
聚类和标签 SSL
这种技术与自训练类似,相当通用,适用于假设部分中提到的聚类假设成立(参考文献 [3])的领域和数据集。
输入和输出
输入是带有少量标记实例和大量未标记实例的训练数据。聚类算法及其参数以及分类算法及其参数是额外的输入。该技术生成一个分类模型,可以帮助预测未见数据的类别。
如何工作?
抽象算法可以表示为:
-
将数据初始化为
标记的和
未标记的。
-
使用聚类算法对整个数据集进行聚类,包括标记的和未标记的数据。
-
对于每个簇,让 S 是从集合 L 中抽取的标记实例的集合。
-
从 S 中学习一个监督模型,f[s] = L[s]。
-
应用模型 f[s] 并使用前面的模型对每个簇中的未标记实例进行分类。
-
-
由于所有未标记的实例
都通过前面的过程分配了标签,因此在整个集合上运行监督分类模型。![如何工作?]
图 3. 聚类和标签 SSL – 聚类后进行分类
优点和局限性
优点和局限性如下:
-
当聚类假设成立且聚类算法和参数选择正确时,效果非常好。
-
大量的参数和选择使得这在许多现实世界问题中成为一个难以驾驭的技术。
传递性图标签传播
基于图的方法背后的关键思想是将数据集中的每个实例(标记的和未标记的)表示为一个节点,并计算它们之间的“相似性”作为某种形式的“相似性”。使用假设部分中讨论的基本概念(即,相似的数据点在图形上会“靠近”)的已知标签来传播未标记数据中的标签(参考文献 [4])。
图 4 展示了当手写数字模式变化时,从第一个数据点到最后一个数据点的箭头粗细所表示的相似性如何变化。知道第一个标签后,由于特征相似性,标签传播可以有效地标记接下来的三个数字,而最后一个数字,尽管被标记为相同,但与前面三个相比,相似性较低。
图 4. 传输图标签传播 – 手写数字的分类。最左端和最右端的图像已标记,其他图像未标记。箭头粗细是相对于左侧标记数字 "2" 的相似性的视觉度量。
输入和输出
输入是带有少量标记和大量未标记数据的训练数据。选择图加权或相似性计算方法,如 k-最近邻加权、高斯衰减距离或 ϵ-半径方法。输出是整个数据的标记集;它通常不构建如先前算法中看到的归纳模型。
如何工作?
通用标签传播方法如下:
-
构建一个图 g = (V,E),其中:
-
顶点 V = {1, 2…n} 对应于既属于标记集 L 又属于未标记集 U 的数据。
-
边 E 是权重矩阵 W,其中 W[i,j] 表示两个数据点 x[i],x[j] 之间的某种形式的相似性。
-
-
通过
计算对角度矩阵 D。
-
假设标记集是二元的,并且有
。将所有未标记数据的标签初始化为 0.
-
在 t = 0 时迭代:
-
-
(将标记实例的标签重置为原始值)
-
返回步骤 4,直到收敛
-
-
使用收敛标签
标记未标记的点
。
基于相似性、迭代中选择的优化等有许多变体。
优点和局限性
优点和局限性如下:
-
基于图的半监督学习方法在计算上代价高昂——通常为 O(n³),其中 n 是实例的数量。尽管加速和缓存技术有所帮助,但在大量数据上的计算成本使得在许多实际数据情况下不可行。
-
传输性质使得它在需要为未见数据诱导模型的实际应用中难以使用。有如谐波混合等扩展,可以解决这些问题。
传输支持向量机(TSVM)
Transductive SVM 是其中最古老且最受欢迎的归纳半监督学习方法之一,由 Vapnik 提出(参考文献 [5])。其关键原则是,未标记数据与标记数据一起可以帮助使用大间隔的概念找到决策边界。其基本原理是,决策边界通常不位于高密度区域!
输入和输出
输入是带有少量标记和大量未标记数据的训练数据。对于 TSVM 计算,输入必须是数值特征。核的选择、核参数和成本因子,这些都是基于 SVM 的参数,也是输入变量。输出是对未标记数据集的标签。
它是如何工作的?
通常,SVM 作为权重向量w和偏置b的优化问题,在标记的硬边界 SVM 中用这些术语表述,受
约束。
-
将数据初始化为
标记的和
未标记的。
-
在 TSVM 中,方程被修改如下:
这取决于以下条件:
这与归纳 SVM 非常相似,但仅使用标记数据。当我们约束未标记数据以符合标记数据的超平面一侧,以最大化间隔时,它会导致未标记数据以最大间隔分离被标记!通过向约束中添加惩罚因子或用核替换输入空间中的点积,就像归纳 SVM 中那样,可以从未标记数据中标记复杂的非线性噪声数据集。
图 5说明了 TSVM 的概念,与仅对标记数据进行归纳 SVM 运行的概念进行比较,以及为什么 TSVM 可以使用未标记数据集找到更好的决策边界。超平面两侧的未标记数据集更接近其各自的类别,从而有助于找到更好的间隔分离器。
图 5. Transductive SVM
优点和局限性
优点和局限性:
-
在给定无噪声标记数据的情况下,TSVM 可以在线性或非线性数据集上非常有效地工作。
-
TSVM 在寻找超参数并调整它们以获得最佳结果方面与归纳 SVM 有相同的问题。
半监督学习案例研究
对于这个案例研究,我们使用 UCI 存储库中另一个经过充分研究的数据集,即威斯康星州乳腺癌数据集。在实验的第一部分,我们展示了如何使用开源库JKernelMachines
应用半监督学习的 Transductive SVM 技术。我们选择 SVMLight 算法和 Gaussian 核来使用这项技术。
在第二部分,我们使用基于 GUI 的框架 KEEL,并使用 UCI 乳腺癌数据集比较了基于进化学习算法的结果。工具、方法和评估措施将在以下子节中描述。
工具和软件
在半监督学习案例研究中使用的两个开源 Java 工具是 JKernelMachines
,一个 Transductive SVM,以及 KEEL,一个基于 GUI 的工具,它使用进化算法进行学习。
注意
JKernelMachines (Transductive SVM)
JKernelMachines
是一个纯 Java 库,它提供了一个高效的平台用于使用和快速开发专门的核函数。核函数是 SVM 中使用的相似性函数。JKernelMachines
除了提供标准核函数(如线性核和高斯核)外,还提供了在结构化数据上定义的核函数实现。特别地,它提供了一系列核函数的组合,列表上的核函数,以及具有各种缓存策略的核函数。该库还包含了 SVM 优化算法的实现,包括 LaSVM 和 One-Class SVM 使用 SMO。库的制作者报告称,JKernelMachines 在一些常见的 UCI 仓库数据集上的结果与 Weka 库相当或更好。
这里给出了使用 JKernelMachines
加载数据和运行 Transductive SVM 的示例:
try {
//load the labeled training data
List<TrainingSample<double[]>> labeledTraining = ArffImporter.importFromFile("resources/breast-labeled.arff");
//load the unlabeled data
List<TrainingSample<double[]>> unlabeledData =ArffImporter.importFromFile("resources/breast-unlabeled.arff");
//create a kernel with Gaussian and gamma set to 1.0
DoubleGaussL2 k = new DoubleGaussL2(1.0);
//create transductive SVM with SVM light
S3VMLight<double[]> svm = new S3VMLight<double[]>(k);
//send the training labeled and unlabeled data
svm.train(labeledTraining, unlabeledData);
} catch (IOException e) {
e.printStackTrace();
}
在第二种方法中,我们使用与相同数据集的 KEEL。
注意
KEEL
KEEL (基于进化学习进行知识提取)是一个非商业(GPLv3)的 Java 工具,具有 GUI,它使用户能够分析各种数据挖掘问题的进化学习行为,包括回归、分类和无监督学习。它减轻了用户编写复杂的进化算法的负担,并允许他们专注于使用工具包创建的新学习模型。KEEL 旨在满足研究人员和学生的需求。
KEEL 包含数据预处理和后处理的算法,以及统计库,还有一个知识提取算法库,该库结合了多种进化学习算法和经典学习技术。
工具中包含的 GUI 向导为管道的每个阶段提供不同的功能组件,包括:
-
数据管理:数据的导入、导出、数据转换、可视化等
-
实验设计:选择分类器、估计器、无监督技术、验证方法等
-
SSL 实验:归纳和演绎分类(参见本节中 SSL 实验设计离线方法的图像)
-
统计分析:这提供了成对和多重比较的测试,参数和非参数程序。
想要了解更多信息,请访问 sci2s.ugr.es/keel/
和 sci2s.ugr.es/keel/pdf/keel/articulo/Alcalaetal-SoftComputing-Keel1.0.pdf
。
图 6:KEEL – 基于向导的图形界面
商业问题
乳腺癌是全球女性最常见的癌症,尤其是在发展中国家,病例诊断往往在晚期。使用非手术程序检查肿瘤质量是早期发现疾病的一种经济且预防性的措施。
在这个案例研究中,使用了一个从该过程明显标记的数据集,目标是使用多种 SSL 技术将乳腺癌数据分类为 Malignant 和 Benign。
机器学习映射
为了说明本章迄今为止学到的技术,我们将使用半监督学习(SSL)进行分类。虽然数据集包含所有示例的标签,但为了将其视为可以应用 SSL 的问题,我们将考虑数据的一部分为未标记。实际上,我们进行了多次实验,使用不同比例的未标记数据进行比较。所使用的不同基学习器是我们从先前章节中熟悉的分类算法。
数据收集
该数据集由威斯康星大学麦迪逊分校收集。数据集以 Weka AARF 格式提供。数据未划分为训练、验证和测试集。
数据质量分析
数据中的示例不包含唯一标识符。有 16 个示例的“裸核”属性有缺失值。目标类别是唯一的分类属性,有两个值。所有其他属性都是连续的,范围在[1, 10]之间。
数据采样和转换
在实验中,我们展示了 10 折交叉验证的结果。为了比较,每个运行都使用了不同比例的标记数据——10%、20%、30%和 40%。
为每个示例添加了一个数字样本代码作为唯一标识符。对于类别属性,将 Malignant 和 Benign 的类别值分别替换为数字 4 和 2。
数据集和分析
威斯康星大学乳腺癌数据集(原始)可在 UCI 机器学习仓库中找到:archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Original)
。
该数据库最初是从威斯康星大学麦迪逊分校的威廉·H·沃尔伯格博士那里获得的。该数据集是由沃尔伯格博士为乳腺癌的诊断和预后而创建的。数据仅基于涉及细针穿刺吸液(FNA)测试的测量。在这个测试中,使用小号针从乳腺肿块中提取液体,然后在显微镜下进行视觉检查。
数据集由 699 个实例组成,包含九个数值属性和一个二进制类别(恶性/良性)。缺失值的百分比为 0.2%。数据集中有 65.5%的恶性和 34.5%的良性病例。特征名称和有效值范围列在下表中:
Num. | 特征名称 | 范围 |
---|---|---|
1 | 样本代码编号 | id 编号 |
2 | 聚块厚度 | 1 - 10 |
3 | 细胞大小均匀性 | 1 - 10 |
4 | 细胞形状均匀性 | 1 - 10 |
5 | 边缘粘附 | 1 - 10 |
6 | 单个上皮细胞大小 | 1 - 10 |
7 | 裸核 | 1 - 10 |
8 | 平滑染色质 | 1 - 10 |
9 | 正常核仁 | 1 - 10 |
10 | 有丝分裂 | 1 - 10 |
11 | 类别 | 良性为 2,恶性为 4 |
特征分析结果
总结统计按特征出现在表 1 中。
聚块厚度 | 细胞大小均匀性 | 细胞形状均匀性 | 边缘粘附 | 单个上皮细胞大小 | 裸核 | 平滑染色质 | 正常核仁 | 有丝分裂 | |
---|---|---|---|---|---|---|---|---|---|
mean | 4.418 | 3.134 | 3.207 | 2.807 | 3.216 | 3.545 | 3.438 | 2.867 | 1.589 |
std | 2.816 | 3.051 | 2.972 | 2.855 | 2.214 | 3.644 | 2.438 | 3.054 | 1.715 |
min | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
25% | 2 | 1 | 1 | 1 | 2 | 2 | 1 | 1 | |
50% | 4 | 1 | 1 | 1 | 2 | 3 | 1 | 1 | |
75% | 6 | 5 | 5 | 4 | 4 | 5 | 4 | 1 | |
max | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 10 |
表 1. 特征摘要
实验和结果
实验中选择了两种 SSL 算法——自训练和协同训练。此外,还选择了四种分类方法作为基学习器——朴素贝叶斯、C4.5、K-NN 和 SMO。进一步,每个实验使用四个不同的标签和无标签数据分区(10%、20%、30%和 40%标签)进行运行。
算法和基本分类器的超参数在表 2 中给出。您可以看到两个 SSL 算法对应于标签和无标签数据四个分区(10%、20%、30%和 40%标签)的运行准确率。
最后,我们给出了 40%标签情况下的每个实验的性能结果。提供的性能指标是准确率和 Kappa 统计量,以及标准偏差。
方法 | 参数 |
---|---|
自训练 | MAX_ITER = 40 |
协同训练 | MAX_ITER = 40,初始无标签池=75 |
KNN | K = 3,欧几里得距离 |
C4.5 | 剪枝树,置信度 = 0.25,每个叶节点 2 个示例 |
NB | 未指定参数 |
SMO | C = 1.0,容差参数 = 0.001,Epsilon= 1.0E-12,核类型 = 多项式,多项式度 = 1,拟合逻辑模型 = true |
表 2. 自训练和协同训练的基本分类器超参数
SSL 算法 | 10% | 20% | 30% | 40% |
---|---|---|---|---|
自训练 C 4.5 | 0.9 | 0.93 | 0.94 | 0.947 |
协同训练 SMO | 0.959 | 0.949 | 0.962 | 0.959 |
表 3. 标签示例比例变化时的模型准确率
算法 | 准确率(无标签) |
---|---|
C4.5 10 折交叉验证 | 0.947 |
SMO 10 折交叉验证 | 0.967 |
自训练(kNN) | 准确率 |
标准差 | |
自训练(C45) | 准确率 |
标准差 | |
自训练(NB) | 准确率 |
标准差 | |
自训练(SMO) | 准确率 |
标准差 | |
协同训练(NN) | 准确率 |
标准差 | |
协同训练(C45) | 准确率 |
标准差 | |
协同训练(NB) | 准确率 |
标准差 | |
协同训练(SMO) | 准确率 |
标准差 |
表 4. 使用 40%标记示例的模型性能比较。每个类别的顶级表现者用括号表示。
半监督学习分析
在 40%的标记数据下,使用 C4.5 的半监督自训练达到了与 100%标记数据相同的成果。这显示了半监督学习在数据稀疏标记时的强大能力。
使用多项式核的 SMO,在 30-40%的数据下接近 100%的数据,但不如 C4.5 好。
在 40%标记的训练数据上,使用四个分类器的自训练和协同训练显示
-
以 KNN 作为基分类器和自训练具有最高的准确率(0.9623),这表明数据的非线性边界。与朴素贝叶斯协同训练非常接近。
-
使用如线性朴素贝叶斯、非线性 C4.5 和高度非线性的 KNN 等分类器的自训练显示了准确率的稳步提升:0.9547、0.9606、0.9623,这再次表明使用自训练但选择正确的底层分类器对于问题非常重要。
-
与朴素贝叶斯协同训练具有最高的 Kappa 统计量(0.9193)和与 KNN 自训练几乎相同的准确率。特征之间的独立性关系——因此将特征集分解为正交特征集并用于分类器——提高了学习效果。
主动学习
尽管主动学习与半监督学习有许多相似之处,但它对包含标记和无标记数据的集合进行建模的方法具有自己独特的途径。它源于基本的人类心理学,即提出更多问题通常有助于解决问题。
主动学习背后的主要思想是,如果学习者可以自己选择要学习的实例,而不是被动地获得标记数据,那么它可以用更少的数据更有效地学习(参考文献 [6])。在非常少量的标记数据的情况下,它可以仔细地从未标记数据中挑选实例以获取标签信息,并使用这些信息迭代地改进学习。这种从所谓的专家(领域专家)那里查询未标记数据以获取标签的基本方法,将主动学习与半监督学习或被动学习区分开来。以下图示说明了差异和涉及的迭代过程:
图 7. 与监督学习和半监督学习过程相比的主动机器学习过程。
表示和符号
数据集 D,它表示所有数据实例及其标签,由 D = {(x[1],y[2]),(x[2],y[2]),… (x[n],y[n])} 给出,其中 是数据个体的实例,而 {y[1],y[2],… y[n]} 是相关标签的集合。D 由两个集合 U(标记数据)和 L(未标记数据)组成。x 是无标签数据实例的集合 {x[1],x[2],… x[n]}。
数据集包含所有已知结果的有标签数据 {y[1],y[2],… y[l]},而
是结果未知的数据集。与之前一样,|U|>> |L|。
主动学习场景
主动学习场景可以广泛地分为:
-
基于流的主动学习:在此方法中,实例或示例仅从未标记数据集中选择,并决定是否忽略数据或将数据传递给专家以获取其标签(参考文献[10,11])。
-
基于池的主动学习:在此方法中,从未标记数据集中查询实例,然后根据信息性进行排序,并从这些实例中选取一组发送给 Oracle 以获取标签(参考文献[12])。
-
查询合成:在此方法中,学习者只有关于输入空间(特征)的信息,并从未标记集中合成查询以确定成员资格。这种方法在实用应用中很少使用,因为它通常不考虑数据生成分布,因此查询往往是任意或无意义的。
主动学习方法
无论涉及何种场景,每个主动学习方法都包括选择查询策略或采样方法,这为每个迭代中查询的选择建立了机制。每种方法都揭示了一种寻找具有最佳信息内容的未标记示例的独特方式,以改善学习过程。在以下小节中,我们描述了主要的查询策略框架,它们的工作原理,优点和局限性,以及每个框架中的不同策略。
不确定性采样
这种采样形式背后的关键思想是从未标记池中选择当前模型最不确定的实例。学习者可以避免模型更有信心或自信地分类的实例(参考文献 [8])。
基于概率的模型(如朴素贝叶斯、逻辑回归等)是此类方法的最自然选择,因为它们给出了对给定模型(例如,对于数据 x 的 θ,对于类别 y[i] i ϵ classes,以及作为后验概率的 )的置信度度量。
如何工作?
所有基于不确定性的算法的一般过程概述如下:
-
将数据初始化为已标记的,
和未标记的,
。
-
当仍有未标记数据时:
-
使用标签数据 L 训练分类器模型
。
-
将分类器模型 f 应用于未标记数据 U,使用采样机制(见下一节)之一来评估信息性 J。
-
从 U 中选择 k 个最有信息性的数据作为集合 L[u],从先知那里获取标签。
-
在上一步中获取的 k 个新标签数据点来增强标签数据:L = L ∪ L[u]。
-
-
重复步骤 2 下的所有步骤。
下面给出了一些最常用的查询合成算法,用于从数据中采样信息实例。
最不自信采样
在这项技术中,数据实例根据它们的置信度按逆序排序,最有可能被查询或选择的实例是模型最不自信的实例。背后的想法是最不自信的实例靠近边缘或分离超平面,获取它们的标签将是有效学习边界的最佳方式。
这可以表示为 。
这种方法的缺点在于它实际上只考虑了最佳信息;后验分布其余部分的信息没有被使用。
最小边界采样
这是基于边界的采样,其中具有较小边界的实例比具有较大边界的实例具有更多的歧义。
这可以表示为 ,其中
和
是实例 x 的两个标签。
标签熵采样
熵,它是数据平均信息内容的度量,也是杂质度量,可以用来采样实例。这可以表示为:
优点和局限性
优点和局限性:
-
标签熵采样是最简单的方法,可以与任何概率分类器一起工作——这是最大的优势
-
异常值或错误反馈的存在可能被忽视,模型可能会退化
版本空间采样
假设 H 是所有特定模型集合,这些模型可以泛化或解释训练数据;例如,所有可能的权重集合,可以分离两个线性可分类别。版本空间 V 是假设 H 的子集,根据汤姆·米切尔(参考文献 [15])的定义与训练数据一致,如下所示 。
这种采样的背后思想是从未标记的数据集中查询实例,以减少版本空间的大小或最小化 |V|。
通过不一致性查询(QBD)
QBD 是最早维护版本空间 V 的算法之一——当两个假设对新到达数据的标签不一致时,该实例被选中以从预言者或专家那里获取标签。
如何工作?
整个算法可以总结如下:
-
将
初始化为所有合法假设的集合。
-
将数据初始化为
标记和
未标记。
-
当数据 x['] 在 U 中时:
-
如果
对于任何 h[2] ∈ V:
-
查询 x['] 的标签并获取 y[']。
-
V = {h: h(x[']) = y['] 对于所有点。
-
-
否则:
- 忽略 x[']。
-
委员会查询(QBC)
通过委员会查询克服了与维护所有可能的版本空间相关的查询不一致性的限制,通过创建一个分类器委员会并使用它们的投票作为捕捉不一致性的机制(参考文献 [7])。
如何工作?
对于此算法:
-
将数据初始化为
标记和
未标记。
-
在标记数据 w 上训练模型委员会 C = {θ¹θ², ... θ^c}(见下文)。
-
对于所有数据 x^' 在 U 中:
-
对 x' 的预测进行投票,作为 {
}。
-
根据最大不一致性对实例进行排序(见下文)。
-
从 U 中选择 k 个最有信息量的数据作为集合 L[u],以从预言者那里获取标签。
-
将 k 个新的标记数据点 L = L ∪ L[u] 添加到标记数据中。
-
使用新的 L 重新训练模型 {θ[1], θ[2], ... θ[c]}。
-
在训练学习者的委员会和选择不一致方法这两个任务中,每个都有各种选择。
训练不同的模型可以通过从 L 中选择不同的样本来完成,或者可以使用提升和袋装等集成方法进行训练。
投票熵是作为不一致性度量方法之一选择的。其数学表示方式如下:
在这里,V(y[i]) 是从所有可能的标签中给出的标签 y[i] 的投票数,而 |C| 是委员会的大小。
库尔巴克-莱布勒(KL)散度是两个概率分布之间差异的信息论度量。不一致性被量化为每个委员会预测与委员会 C 中共识的平均差异:
优点和局限性
优点和局限性如下:
-
简单性以及它可以与任何监督算法一起工作的事实给它带来了巨大的优势。
-
在某些条件下,有理论保证可以最小化误差和泛化。
-
通过不一致性查询(Query by Disagreement)受到维护大量有效假设的困扰。
-
这些方法仍然存在错误反馈被忽视和模型可能退化的问题。
数据分布采样
前面的方法基于样本对模型的不确定性或通过减少假设空间大小来选择未标记集中的最佳实例。这些方法都没有针对模型本身的最佳选择。数据分布采样的想法是,添加有助于减少模型误差的样本,有助于通过预期值(参考文献 [13 和 14])提高对未见实例的预测。
它是如何工作的?
有不同的方法来找到给定模型的最佳样本,我们将详细描述每一种方法。
预期模型变化
这种想法的背后的目的是选择未标记集中将带来模型最大变化的示例:
在这里,P[θ] (y|x) = x 标签的期望, 是在重新训练 x 后,包括 x ' 的熵在未标记实例上的总和。
预期误差减少
在这里,方法是选择未标记集中最能减少模型泛化误差的示例。泛化误差使用带有预期标签的未标记集进行衡量:
在这里,Pθ (y|x) = x 标签的期望, 是在重新训练 x 后,包括 x^' 的熵在未标记实例上的总和。
方差减少
以噪声-偏差-方差为参数,对样本外误差的估计的一般方程如下:
在这里,G(x) 是给定标签 y 的模型预测。在方差减少中,我们选择未标记集中最能减少模型方差的示例:
在这里,θ + 表示使用新点 x ^' 和其标签 y^' 重新训练后的模型。
密度加权方法
在这种方法中,我们从未标记集中选择与标记集平均相似度较高的示例。
这可以表示如下:
在这里,sim(x, x ^')是密度项或相似度项,其中 Hθ是基本效用度量。
优点和局限性
优点和局限性如下:
-
最大的优势是它们直接在模型上作为优化目标工作,而不是之前描述的隐式或间接方法。
-
这些方法可以在基于池或流的场景中工作
-
这些方法在界限和泛化方面有一些理论保证。
-
这些方法的最大缺点是计算成本高,实现困难。
主动学习案例研究
本案例研究使用另一个众所周知的公开数据集来展示使用开源 Java 库的主动学习技术。和之前一样,我们首先定义商业问题,使用的工具和框架,如何在解决方案中实现机器学习原理,以及数据分析步骤揭示了什么。接下来,我们描述了进行的实验,评估了各种模型的表现,并提供了结果分析。
工具和软件
在主动学习实验中,我们使用了 JCLAL 工具。JCLAL 是一个 Java 框架,用于主动学习,支持单标签和多标签学习。
注意
JCLAL 是开源的,并遵循 GNU 通用公共许可证分发:sourceforge.net/p/jclal/git/ci/master/tree/
。
商业问题
在这些实验中使用的鲍鱼数据集包含了鲍鱼的各种物理和解剖特征数据——通常被称为海蜗牛。目标是预测壳中的环数,这可以指示样本的年龄。
机器学习映射
正如我们所见,主动学习的特点是从小数据集开始,该数据集包含标签数据,并伴随查询未标记数据的技巧,以便我们逐步向标签集添加实例。这是分批进行的,每次迭代一批。迭代的次数和批量大小是这些技术的超参数。查询策略和用于在不断增加的标签实例上训练的监督学习方法的选择是额外的输入。
数据收集
如前所述,我们将使用来自 UCI 存储库的现有数据集(archive.ics.uci.edu/ml/datasets/Abalone
)。数据库的原始所有者是澳大利亚塔斯马尼亚州初级工业和渔业部。
数据类型和属性描述与数据一起提供,并在表 5中重现。类别属性“环数”有 29 个不同的类别:
名称 | 数据类型 | 测量单位 | 描述 |
---|---|---|---|
性别 | 名义 | M, F, 和 I (婴儿) | 样本的性别 |
长度 | 连续 | 毫米 | 最长壳的测量值 |
直径 | 连续 | 毫米 | 垂直于长度的 |
高度 | 连续 | 毫米 | 壳中有肉时 |
总重量 | 连续 | 克 | 整个鲍鱼 |
去壳重量 | 连续 | 克 | 肉的重量 |
内脏重量 | 连续 | 克 | 放血后的内脏重量 |
壳重量 | 连续 | 克 | 干燥后 |
环数 | 整数 | 计数 | +1.5 给出年龄(年) |
表 5. 鲍鱼数据集特征
数据采样和转换
对于这个实验,我们将随机选择的 4,155 条记录作为未标记的,保留了剩余的 17 条作为标记的。数据没有进行任何转换。
特征分析和降维
仅使用八个特征,没有必要进行降维。数据集附带了一些关于特征的统计数据,在表 6中重现:
长度 | 直径 | 高度 | 整体 | 去壳 | 内脏 | 壳 | 环 | |
---|---|---|---|---|---|---|---|---|
最小值 | 0.075 | 0.055 | 0 | 0.002 | 0.001 | 0.001 | 0.002 | 1 |
最大值 | 0.815 | 0.65 | 1.13 | 2.826 | 1.488 | 0.76 | 1.005 | 29 |
平均值 | 0.524 | 0.408 | 0.14 | 0.829 | 0.359 | 0.181 | 0.239 | 9.934 |
标准差 | 0.12 | 0.099 | 0.042 | 0.49 | 0.222 | 0.11 | 0.139 | 3.224 |
相关系数 | 0.557 | 0.575 | 0.557 | 0.54 | 0.421 | 0.504 | 0.628 | 1 |
表 6. 特征的汇总统计
模型、结果和评估
我们进行了两组实验。第一组使用基于池的场景,第二组使用基于流的场景。在每组中,我们使用了熵采样、最不自信采样、边缘采样和投票熵采样。使用的分类器是朴素贝叶斯、逻辑回归和 J48(C4.5 的实现)。每个实验运行了 100 次迭代,批大小为 1 和 10。在表 7中,我们展示了这些结果的一个子集,具体是使用朴素贝叶斯、简单逻辑和 C4.5 分类器,批大小为 10 的基于池和基于流的场景。
备注
完整的结果集可以在github.com/mjmlbook/mastering-java-machine-learning/tree/master/Chapter4
查看。
JCLAL 库需要一个 XML 配置文件来指定要使用哪种场景、选择的查询策略、批大小、最大迭代次数和基本分类器。以下是一个示例配置:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<experiment>
<process evaluation-method-type="net.sf.jclal.evaluation.method.RealScenario">
<file-labeled>datasets/abalone-labeled.arff</file-labeled>
<file-unlabeled>datasets/abalone-unlabeled.arff</file-unlabeled>
<algorithm type="net.sf.jclal.activelearning.algorithm.ClassicalALAlgorithm">
<stop-criterion type="net.sf.jclal.activelearning.stopcriteria.MaxIteration">
<max-iteration>10</max-iteration>
</stop-criterion>
<stop-criterion type="net.sf.jclal.activelearning.stopcriteria.UnlabeledSetEmpty"/>
<listener type="net.sf.jclal.listener.RealScenarioListener">
<informative-instances>reports/real-scenario-informative-data.txt</informative-instances>
</listener>
<scenario type="net.sf.jclal.activelearning.scenario.PoolBasedSamplingScenario">
<batch-mode type="net.sf.jclal.activelearning.batchmode.QBestBatchMode">
<batch-size>1</batch-size>
</batch-mode>
<oracle type="net.sf.jclal.activelearning.oracle.ConsoleHumanOracle"/>
<query-strategy type="net.sf.jclal.activelearning.singlelabel.querystrategy.EntropySamplingQueryStrategy">
<wrapper-classifier type="net.sf.jclal.classifier.WekaClassifier">
<classifier type="weka.classifiers.bayes.NaiveBayes"/>
</wrapper-classifier>
</query-strategy>
</scenario>
</algorithm>
</process>
</experiment>
工具本身是通过以下方式调用的:
java -jar jclal-<version>.jar -cfg <config-file>
基于池的场景
在以下三个表中,我们比较了使用基于池的场景时,使用朴素贝叶斯、简单逻辑和 C4.5 分类器的结果。
朴素贝叶斯:
实验 | ROC 曲线下面积 | F 度量 | 假正率 | 精确率 | 召回率 |
---|---|---|---|---|---|
PoolBased-EntropySampling-NaiveBayes-b10 | 0.6021 | 0.1032 | 0.0556(1) | 0.1805 | 0.1304 |
PoolBased-KLDivergence-NaiveBayes-b10 | 0.6639(1) | 0.1441(1) | 0.0563 | 0.1765 | 0.1504 |
PoolBased-LeastConfidentSampling-NaiveBayes-b10 | 0.6406 | 0.1300 | 0.0827 | 0.1835(1) | 0.1810(1) |
PoolBased-VoteEntropy-NaiveBayes-b10 | 0.6639(1) | 0.1441(1) | 0.0563 | 0.1765 | 0.1504 |
表 7. 使用朴素贝叶斯分类器的基于池的场景性能
逻辑回归:
实验 | ROC 曲线下面积 | F 度量 | 假正率 | 精确率 | 召回率 |
---|---|---|---|---|---|
PoolBased-EntropySampling-SimpleLogistic-b10 | 0.6831 | 0.1571 | 0.1157 | 0.1651 | 0.2185(1) |
PoolBased-KLDivergence-SimpleLogistic-b10 | 0.7175(1) | 0.1616 | 0.1049 | 0.2117(1) | 0.2065 |
PoolBased-LeastConfidentSampling-SimpleLogistic-b10 | 0.6629 | 0.1392 | 0.1181(1) | 0.1751 | 0.1961 |
PoolBased-VoteEntropy-SimpleLogistic-b10 | 0.6959 | 0.1634(1) | 0.0895 | 0.2307 | 0.1880 |
表 8. 使用逻辑回归分类器的基于池的场景性能
C4.5:
实验 | ROC 曲线下面积 | F 度量 | 假正率 | 精确率 | 召回率 |
---|---|---|---|---|---|
PoolBased-EntropySampling-J48-b10 | 0.6730(1) | 0.3286(1) | 0.0737 | 0.3432(1) | 0.32780(1) |
PoolBased-KLDivergence-J48-b10 | 0.6686 | 0.2979 | 0.0705(1) | 0.3153 | 0.2955 |
PoolBased-LeastConfidentSampling-J48-b10 | 0.6591 | 0.3094 | 0.0843 | 0.3124 | 0.3227 |
PoolBased-VoteEntropy-J48-b10 | 0.6686 | 0.2979 | 0.0706 | 0.3153 | 0.2955 |
表 9. 使用 C4.5 分类器的基于池的场景性能
基于流的场景
在以下三个表中,我们展示了使用朴素贝叶斯、逻辑回归和 C4.5 分类器以及四种不同采样方法在基于流的场景下的实验结果。
朴素贝叶斯:
实验 | ROC 曲线下面积 | F 度量 | 假正率 | 精确率 | 召回率 |
---|---|---|---|---|---|
StreamBased-EntropySampling-NaiveBayes-b10 | 0.6673(1) | 0.1432(1) | 0.0563 | 0.1842(1) | 0.1480 |
StreamBased-LeastConfidentSampling-NaiveBayes-b10 | 0.5585 | 0.0923 | 0.1415 | 0.1610 | 0.1807(1) |
StreamBased-MarginSampling-NaiveBayes-b10 | 0.6736(1) | 0.1282 | 0.0548(1) | 0.1806 | 0.1475 |
StreamBased-VoteEntropyQuery-NaiveBayes-b10 | 0.5585 | 0.0923 | 0.1415 | 0.1610 | 0.1807(1) |
表 10. 使用朴素贝叶斯分类器的基于流的场景性能
逻辑回归:
实验 | ROC 曲线下面积 | F 度量 | 假正率 | 精确率 | 召回率 |
---|---|---|---|---|---|
StreamBased-EntropySampling-SimpleLogistic-b10 | 0.7343(1) | 0.1994(1) | 0.0871 | 0.2154 | 0.2185(1) |
StreamBased-LeastConfidentSampling-SimpleLogistic-b10 | 0.7068 | 0.1750 | 0.0906 | 0.2324(1) | 0.2019 |
StreamBased-MarginSampling-SimpleLogistic-b10 | 0.7311 | 0.1994(1) | 0.0861 | 0.2177 | 0.214 |
StreamBased-VoteEntropy-SimpleLogistic-b10 | 0.5506 | 0.0963 | 0.0667(1) | 0.1093 | 0.1117 |
表 11. 使用逻辑回归分类器的基于流的场景性能
C4.5:
实验 | ROC 曲线下面积 | F 度量 | 假正率 | 精确率 | 召回率 |
---|---|---|---|---|---|
StreamBased-EntropySampling-J48-b10 | 0.6648 | 0.3053 | 0.0756 | 0.3189(1) | 0.3032 |
StreamBased-LeastConfidentSampling-J48-b10 | 0.6748(1) | 0.3064(1) | 0.0832 | 0.3128 | 0.3189(1) |
StreamBased-MarginSampling-J48-b10 | 0.6660 | 0.2998 | 0.0728(1) | 0.3163 | 0.2967 |
StreamBased-VoteEntropy-J48-b10 | 0.4966 | 0.0627 | 0.0742 | 0.1096 | 0.0758 |
表 12. 使用 C4.5 分类器的基于流的场景性能
主动学习结果分析
看到基于池的、基于委员会的查询——一种集成方法——使用 KL 散度采样在大多数分类器上表现良好,这确实很有趣。正如章节中讨论的,这些方法已经被证明通过保持一个大的假设空间来减少错误,并且这个实验结果从实证上支持了这一点。
基于池的、基于熵的采样使用 C4.5 作为分类器具有最高的精确率、召回率、假正率和 F 度量。此外,在基于流的熵采样中使用 C4.5,指标也相似地很高。使用不同的采样技术和基于池的 C4.5,如 KL 散度、最不自信或投票熵,指标显著更高。因此,这可以更强烈地归因于底层分类器 C4.5 在寻找非线性模式方面的能力。
考虑到 AUC,逻辑回归算法在基于流和基于池的情况下都表现非常好。这可能完全是因为 LR 在置信映射方面有一个很好的概率方法,这是获得良好 AUC 分数的重要因素。
摘要
在前几章中,我们游览了监督学习和无监督学习技术及其在现实世界数据集上的应用,本章介绍了半监督学习(SSL)和主动学习(AL)的概念、技术和工具。
在 SSL 中,我们被给予一些标记的示例和许多未标记的示例——目标是要么简单地训练标记的示例以对未标记的示例进行分类(归纳 SSL),要么使用未标记和标记的示例来训练模型以正确分类新的、未见过的数据(归纳 SSL)。SSL 中的所有技术都基于与半监督平滑性、聚类一致性和流形一致性相关的假设之一或多个。
不同的半监督学习(SSL)技术适用于不同的场景。简单的自训练 SSL 方法直接且与大多数监督学习算法兼容;当数据来自多个领域时,协同训练 SSL 是一个合适的方法。当簇内聚假设成立时,可以使用簇和标签 SSL 技术;通过传递图标签传播利用“接近度”度量,这可能计算成本较高。传递 SVM 在线性或非线性数据上表现良好,我们通过使用JKernelMachines
库在 UCI 乳腺癌数据集上训练具有高斯核的 TSVM 的例子来展示。在章节 SSL 部分的结尾部分,我们展示了使用图形 Java 工具 KEEL 比较 SSL 模型的实验。
我们在章节的后半部分介绍了主动学习(AL)。在这种学习中,使用各种策略查询数据集的无标签部分,以便向专家展示将证明从整个数据集中学习最有效的示例。作为专家或先知,为所选实例提供标签后,学习者稳步提高其泛化能力。AL 技术以分类器或分类器委员会的选择以及重要的查询策略选择为特征。这些策略包括不确定性采样,其中查询最没有信心的实例,版本采样,其中选择解释训练数据的假设子集,以及数据分布采样,这涉及通过选择会减少泛化错误的选项来改进模型。我们通过使用 UCI 鲍鱼数据集的案例研究来展示主动学习的实际应用。这里使用的工具是用于主动学习的 JCLAL Java 框架。
参考文献
-
Yarowsky, D (1995). 无监督词义消歧与监督方法相媲美。第 33 届计算语言学协会年会论文集(第 189–196 页)
-
Blum, A.,and Mitchell, T (1998). 结合有标签和无标签数据与协同训练。COLT:计算学习理论研讨会论文集。
-
Demiriz, A.,Bennett, K.,and Embrechts, M (1999). 使用遗传算法进行半监督聚类。人工神经网络在工程中的应用研讨会论文集。
-
Yoshua Bengio, Olivier Delalleau, Nicolas Le Roux (2006). 标签传播和二次准则。在半监督学习,第 193-216 页
-
T. Joachims (1998). 基于支持向量机的文本分类的归纳推理,ICML.
-
B. Settles (2008). 好奇的机器:具有结构实例的主动学习。威斯康星大学麦迪逊分校博士论文。
-
D. Angluin (1988). 查询和概念学习。机器学习,2:319–342.
-
D. Lewis 和 W. Gale (1994). 训练文本分类器的顺序算法. 见《ACM SIGIR 信息检索研究与发展会议论文集》(ACM SIGIR Conference on Research and Development in Information Retrieval),第 3–12 页。ACM/Springer。
-
H.S. Seung, M. Opper, 和 H. Sompolinsky (1992). 委员会查询. 见《计算学习理论研讨会论文集》(ACM Workshop on Computational Learning Theory),第 287–294 页。
-
D. Cohn, L. Atlas, R. Ladner, M. El-Sharkawi, R. Marks II, M. Aggoune, and D. Park (1992). 使用查询和选择性采样训练连接主义网络. 见《神经网络信息处理系统进展》(NIPS),摩根考夫曼出版社。
-
D. Cohn, L. Atlas, 和 R. Ladner (1994). 通过主动学习提高泛化能力. 机器学习,15(2):201–221。
-
D. Lewis 和 J. Catlett (1994). 用于监督学习的异质不确定性采样. 见《国际机器学习会议论文集》(ICML),第 148–156 页。摩根考夫曼出版社。
-
S. Dasgupta, A. Kalai, 和 C. Monteleoni (2005). 基于感知器的主动学习分析. 见《学习理论会议论文集》(COLT),第 249–263 页。斯普林格出版社。
-
S. Dasgupta, D. Hsu, 和 C. Monteleoni (2008). 一个通用的无监督主动学习算法. 见《神经网络信息处理系统进展》(NIPS),第 20 卷,第 353–360 页。麻省理工学院出版社。
-
T. Mitchell (1982). 泛化作为搜索. 人工智能,18:203–226。
第五章。实时流机器学习
在第二章《现实世界监督学习的实用方法》、第三章《无监督机器学习技术》和第四章《半监督和主动学习》中,我们讨论了分类、聚类、异常检测、半监督和主动学习的各种技术。从现有或历史数据中进行的学习的形式传统上被称为批量学习。
所有这些算法或技术都假设三个条件,即:
-
可用有限训练数据来构建不同的模型。
-
学习到的模型将是静态的;也就是说,模式不会改变。
-
数据分布也将保持不变。
在许多现实世界的数据场景中,要么事先没有可用的训练数据,要么数据本质上是动态的;也就是说,随着时间的推移而持续变化。许多现实世界应用也可能有具有短暂性质的数据,以高速或大量出现,例如物联网传感器信息、网络监控和 Twitter 动态。这里的要求是立即从实例中学习,然后更新学习。
动态数据的性质和可能变化的分布使得现有的基于批量的算法和技术通常不适用于此类任务。这导致了机器学习中的自适应或可更新或增量学习算法的出现。这些技术可以应用于从数据流中持续学习。在许多情况下,由于大数据的规模和需要将整个数据拟合到内存中的需要,学习大数据的缺点也可以通过将大数据学习问题转化为增量学习问题并逐个检查示例来克服。
在本章中,我们将讨论假设,并讨论监督学习和无监督学习中的不同技术,这些技术有助于实时或流机器学习。我们将使用开源库大规模在线分析(MOA)来进行现实世界案例研究。
本章的主要部分包括:
-
假设和数学符号。
-
基本流处理和计算技术。讨论流计算、滑动窗口包括 ADWIN 算法和采样。
-
概念漂移和漂移检测:介绍了学习演化的系统、数据管理、检测方法以及隐式和显式适应。
-
增量监督学习:讨论从标记流数据中学习,包括线性、非线性以及集成算法的建模技术。随后是验证、评估和模型比较方法。
-
增量无监督学习:与第三章中讨论的聚类技术类似,包括验证和评估技术。
-
使用异常检测进行无监督学习:基于分区和基于距离的方法,以及所使用的验证和评估技术。
-
基于流的案例研究:介绍了 MOA 框架,提出了业务问题,进行了特征分析,将其映射到机器学习蓝图;描述了实验,并以结果展示和分析结束。
假设和数学符号
许多流机器学习技术都做出了某些关键假设,我们将在下面明确陈述:
-
数据中的特征数量是固定的。
-
数据具有小到中等维度,或特征数量,通常在数百个左右。
-
样本数量或训练数据可以是无限的或非常庞大,通常在数百万或数十亿。
-
在监督学习或聚类中,类标签的数量很小且有限,通常少于 10。
-
通常,内存有一个上限;也就是说,我们无法将所有数据放入内存,因此从数据中学习必须考虑这一点,特别是像 K-Nearest-Neighbors 这样的懒惰学习器。
-
通常,处理事件或数据所需的时间有一个上限,通常是几毫秒。
-
数据中的模式或分布可能随时间演变。
-
学习算法必须在有限时间内收敛到解决方案。
设 D[t] = {x[i], y[i] : y = f(x)} 为在时间 t ∈ {1, 2, … i} 可用的给定数据。
增量学习算法为数据序列 {.., D[j-1], D[j], D[j+1]..} 生成一系列模型/假设 {.., G[j-1], G[j], G[j+1]..},其中模型/假设 G[i] 仅依赖于前一个假设 G[i-1] 和当前数据 D[i]。
基本流处理和计算技术
现在,我们将描述一些可以在数据流上执行的基本计算。如果我们必须在内存和速度有限的情况下运行汇总操作,如聚合或直方图,我们可以确信需要某种形式的权衡。在这些情况下,两种众所周知的近似类型是:
-
ϵ 近似:计算结果在误差的 ϵ 分数内接近精确值。
-
(ϵ**, δ) 近似:计算结果在 1 ± ϵ 范围内,以 1 – δ 的概率接近精确值。
流计算
当我们必须在内存和整个数据上考虑基本操作时,我们将展示一些基本的计算和聚合,以突出批处理和基于流的计算之间的差异:
-
频率计数或点查询:Count-Min Sketch 的通用技术已被成功应用于对数据流进行各种汇总。主要技术是创建一个大小为 w x d 的窗口。然后,给定一个期望的概率(δ)和可接受的误差(ϵ),可以使用 w = 2/ ϵ 和
来创建内存中的数据大小。与每一行相关联的是一个哈希函数:h(.). 这个函数将值 x 均匀地转换到区间 [1, 2 … w] 内。这种方法可以用于执行值或点积或频率计数的点查询。
-
不同计数:Hash-Sketch 的通用技术可用于执行“不同值”查询或计数。给定进入流值的域 x ∈ [0,1,2….N-1],哈希函数 h(x)将值均匀映射到 [0,1,….2L-1],其中 L=O(log N)。
-
均值:在不存储所有值的情况下计算均值非常有用,通常使用递归方法实现,只需要观察数(n)和迄今为止看到的值的总和(∑x[n]):
-
标准差:与均值一样,标准差可以使用无记忆选项仅使用观察数(n)、迄今为止看到的值的总和(∑x[n])和值的平方总和(∑x[n]²)来计算:
-
相关系数:给定两个不同值的流,许多算法需要计算这两个值之间的相关系数,可以通过维护每个流的运行总和(∑x[n] 和 ∑y[n])、值的平方总和(∑x[n]² 和 ∑y[n]²)和交叉乘积(∑x[n]x y[n])来实现。相关系数由以下公式给出:
滑动窗口
通常,在计算统计数据或汇总时,你不需要整个数据,只需要“最近过去”的数据。在这种情况下,使用滑动窗口技术通过保持窗口大小固定或可调整并移动它来计算汇总统计。
ADaptable sliding WINdow(ADWIN)是一种用于检测变化以及估计计算所需值的知名技术。ADWIN 背后的想法是保持一个具有可变长度的最近看到值的窗口,其特征是窗口的最大长度与窗口内平均值的平均值没有变化这一事实在统计上是一致的。换句话说,如果新的进入值会改变平均值,则仅当删除旧值时,才会删除旧值。这有两个优点:记录变化并维护最近流中的动态值,如聚合值。确定删除项的主观概念“足够大”可以使用已知的 Hoeffding 界来确定:
这里 是两个窗口 W[0] 和 W[1] 之间的调和平均值,其中 W[0] 和 W[1] 的尺寸分别为 |W[0]| 和 |W[1]|,W[1] 包含更近期的元素。此外,
和
分别是相应的计算平均值。
该算法可以概括为:
-
ADWIN (x: 输入流, δ: 置信度)
-
init (W) //初始化窗口 W
-
while (x){
W ← W ∪ {x[t]} //将新实例 x[t] 添加到窗口 W 的头部
-
repeat W ← W – xold //从窗口尾部删除元素
-
<
对 W 的每个分割都成立
-
output
-
}
ADWIN 还表明,它提供了对假阳性和假阴性的理论界限,这使得它成为一种非常有前途的技术。
采样
在许多基于流的算法中,需要减少数据或选择数据的一个子集进行分析。对于基于流的算法,必须增强对整个数据集的采样方法。
在采样中必须解决的关键问题是样本的无偏性和它们如何代表生成流的总体。在非流式环境中,这完全取决于样本大小和采样方法。均匀随机采样(第二章, 实际应用中的监督学习)是在批量数据世界中用于减少数据的最知名技术之一。考虑到内存限制,水库采样技术被认为是一种非常有效的减少数据的方法。
水库采样的基本思想是保持一个固定大小的水库或样本,比如说 k,并且每个进入流量的元素都有 k/n 的概率替换水库中的较老元素。详细的算法如下所示:
ReservoirSampling(x:inputstream, k:sizeOfReservoir)
//add first k elements to reservoir
for(i = 0; i < k; i++)
addToReservoir(x)
while (x){
for(i = 0; i < k; i++)
//flip a coin to get random integer
r = randomInteger[1..n]
if(r ≤ k){
//move it inside the reservoir
addToReservoir(x)
//delete an instance randomly from reservoir
position = randomInteger[1..k]
removeInstance(position)
}
}
这些方法有扩展,如 Min-wise 采样和负载卸载,可以克服与基本方法相关的一些问题。
概念漂移和漂移检测
如本章引言中所述,无限流量的动态性质与静态学习的基本原则直接对立;也就是说,数据的分布或模式保持不变。尽管可能会有快速或突然的变化,但这里的讨论是关于缓慢、渐进的变化。这些缓慢、渐进的变化相当难以检测,将变化与噪声分离变得更加困难:
图 1 通过底部面板中颜色从黄色渐变到蓝色的方式展示了概念漂移。采样数据反映了数据分布的潜在变化,这必须被检测到,并学习一个新的模型。
在过去二十年里,各种研究中描述了几种技术,可以按照以下图示进行分类:
图 2 漂移检测技术分类
数据管理
主要思想是在内存中管理一个与数据的动态特性一致的模型。
部分内存
这些技术使用内存缓冲区中最最近使用的数据来学习或推导摘要信息。正如之前讨论的那样,关键问题是:检测变化和学习有效性的正确窗口大小是什么?在基于固定窗口大小的技术中,我们使用队列的概念,其中带有最近时间戳的新实例进入,而最旧的实例被移除。因此,窗口包含所有足够近的示例,其大小通常基于内存的物理可用性和队列中数据元素的大小。在自适应窗口大小中,队列与检测算法结合使用。当检测算法根据性能评估表明存在漂移迹象时,窗口大小可以减小,以有效地移除不再帮助模型的旧示例。
全内存
思想是在所有示例或数据上存储足够的统计信息。一种方法是对数据进行加权,权重随时间衰减。使用由 λ 给出的速率因子的指数加权可以非常有效:
w[λ] (x) = exp(– λ * i)
检测方法
给定观察到的给定数据的概率 P(X),模式/类 P(C) 的概率,以及给定类的数据概率 P(X|C)——即模型——检测方法可以大致分为两类:
-
监控模型、分类器或 P(C|X) 的演变或性能
-
监控环境中的分布或观察 P(X),P(C) 和 P(X|C)
监控模型演变
尽管这种方法基于所有模型的 学习都是平稳的,数据来自 独立、同分布(i.i.d.)的假设,这在许多应用中并不成立,但它已被证明是有效的。以下将描述一些知名技术。
维德默和库巴特
这是最早的方法之一,它观察了错误率或误分类率以及由于新分支等原因对模型(如树结构)的变化。使用这些和已知的阈值,学习窗口的大小会增加或减少。
漂移检测方法或 DDM
此方法假设正在观察的参数,例如分类器正确或错误地标记事物,是一个二元随机变量,遵循二项分布。它假设在概率 pi 处的误分类概率,标准差为 ,其中值在序列的第 i^(th) 点计算。然后,该方法使用两个水平:
-
警告水平:当 p[i] + s[i] ≥ p[min]+ 2 * s[min]
-
检测水平:当 p[i] + s[i] ≥ p[min]+ 3 * s[min]
在“警告”和“检测”水平之间的所有示例都用于训练一个新的分类器,当达到“检测”水平时,将替换“表现不佳”的分类器。
早期漂移检测方法或 EDDM
EDDM 使用与 DDM 相同的技巧,但略有修改。它使用分类率(即召回率)而不是错误率(1 – 准确率),并使用正确预测数和两个错误预测数之间的距离来改变水平。
EDDM 计算两个误差 p[i]^' 之间的平均距离和两个 s[i]'. 标准差之间的距离。水平如下:
-
警告水平:(p[i]^' + 2 * s[i]^') ⁄ (p^'[max] + 2 * s^'[max]) < α
-
检测水平:(p[i]^' + 2 * s[i]') ⁄ (p^'[max] + 2 * s^'[max]) < β
参数 α 和 β 通常由用户调整到大约 90% 和 95%。
监控分布变化
当没有模型或分类器来检测变化时,我们应用使用某种形式的统计检验来监控分布变化的技巧。这些检验用于识别分布变化。由于假设,无论是参数还是非参数,以及不同的偏差,很难具体地说哪个效果最好。在这里,我们提供一些著名的统计检验。
威尔奇 t 检验
这是 Student t 检验的两个样本的改编。检验被改编为采用大小为 N[1] 和 N[2] 的两个窗口,均值 和
,方差
和
来计算 p 值,并使用该值来拒绝或接受零假设:
科尔莫哥洛夫-斯米尔诺夫检验
这种统计检验通常用于比较两个分布之间的距离,并验证它们是否低于某些阈值。这可以通过使用两个不同样本大小的窗口,N[1] 和 N[2],具有不同的累积分布函数,F1 和 F2,KS 距离来适应变化检测:
当(通过 Kolmogorov-Smirnov 表查找获得)的置信度为 α 时,拒绝零假设,该假设认为两个分布是相似的。
CUSUM 和 Page-Hinckley 测试
累积和(CUSUM)旨在指示输入的平均值与零显著不同:
g[0] = 0 , g[t] = max(0, g[t–1]) + ϵ[t] – v)
当 g[t] > h 时,我们提高变化检测,其中 (h, v) 是用户定义的参数。请注意,CUSUM 测试是无记忆的,是一侧或非对称的,仅检测增加。
Page Hinckley 测试与 CUSUM 类似,但有微小差异,如下所示:
g0 = 0 , g[t] = g[t–1] + ϵ[t] – v)
对于增加和减少值,我们使用 G[t] = min(g[t], G[t–1]) 或 G[t] = max(g[t], G[t–1]),并且 Gt – gt > h 用于变化检测。
适应方法
显式和隐式适应是两种在检测到变化时适应环境变化的知名技术。
显式适应
在显式适应中,使用以下技术之一:
-
使用新数据从头开始重新训练模型,以确保以前的模型或数据不会影响新模型
-
使用变化或新数据更新模型,以确保过渡平滑——假设变化是渐进的,而不是剧烈的
-
创建一个随时间学习的模型序列或集成——当协作方法比任何单个模型更好时
隐式适应
在隐式适应中,我们通常使用集成算法/模型来适应概念变化。这可能意味着使用从单个分类器到集成预测,再到使用 ADWIN 进行基于自适应窗口的适应的不同组合——所有这些都属于隐式适应的选择。
增量监督学习
本节介绍了在实例的真实标签可用时,从流数据中学习所使用的几种技术。特别是,我们展示了适用于增量学习的线性、非线性以及基于集成算法,以及这些模型评估和验证所需的方法,同时考虑到学习受限于内存和 CPU 时间的限制。
建模技术
建模技术分为线性算法、非线性算法和集成方法。
线性算法
这里描述的线性方法需要很少或不需要适应来处理流数据。
带损失函数的在线线性模型
可以使用不同的损失函数,如铰链、逻辑和平方误差,在此算法中使用。
输入和输出
这些方法仅使用数值特征。损失函数 l 和应用权重更新的学习率 λ 的选择被视为输入参数。输出通常是可更新的模型,这些模型提供带有置信值的预测。
它是如何工作的?
基本算法假设线性权重组合,类似于第二章中解释的线性/逻辑回归,《面向现实世界监督学习的实用方法》。流或在线学习算法可以总结如下:
-
for(t=1,2,…T) do
-
x[t] = receive(); //接收数据
-
; //预测标签
-
y[t] = obtainTrueLabel(); //获取真实标签
-
loss = l(w[t], (x[t], w[t])); //计算损失
-
if(l(wt,(xt, wt )) > 0 then
-
; //更新权重
-
end
-
-
end
可以根据问题类型插入不同的损失函数;这里展示了其中一些知名类型:
-
分类:
-
切比雪夫损失:l(w[t], (x[t], w[t])) = max(0, 1 – yf(x[t], w[t]))
-
逻辑损失:
-
-
回归:
- 平方损失:
- 平方损失:
随机梯度下降 (SGD)可以被视为改变权重以最小化平方损失,如前面的损失函数,但以每个示例的梯度方向前进。权重的更新可以描述为:
优点和局限性
在线线性模型与第二章中描述的线性模型具有类似的优缺点,《面向现实世界监督学习的实用方法》:
-
在一定程度上可解释,因为每个特征的权重可以提供对每个特征影响的见解
-
假设线性关系,加性和不相关特征,因此不模拟复杂的非线性现实世界数据
-
非常容易受到数据中异常值的影响
-
非常快,通常也是尝试或基线算法之一
在线朴素贝叶斯
贝叶斯定理应用于获取预测值,即后验概率,给定一个m维输入:
输入和输出
在线朴素贝叶斯可以接受分类和连续输入。对于分类特征来说更容易,因为算法必须维护每个类别的计数,同时计算给定类别的每个特征的P(X[j]|Y)概率。对于连续特征,我们必须假设一个分布,例如高斯分布,或者以增量方式计算在线核密度估计,或者以增量方式对数值特征进行离散化。输出是可更新的模型,可以预测类别并附带置信值。作为概率模型,它们具有更好的置信度分数,分布在 0 到 1 之间。
如何工作?
-
for(t = 1,2,…T) do
-
x[t] = receive(); //接收数据
-
incrementCounters(x[t]); //更新P(Xj|Y)
-
//后验概率
-
-
end
优点和局限性
-
这是最快的算法,同时具有低内存占用和计算成本。它在在线或快速学习者中非常受欢迎。
-
假设分布或某些影响预测质量的数值特征的偏差。
非线性算法
目前使用最流行的非线性流学习分类器之一是 Hoeffding 树。在以下小节中,介绍了 Hoeffding 界限的概念,然后是算法本身。
Hoeffding 树或非常快速决策树(VFDT)
Hoeffding 树(HT)背后的关键思想是 Hoeffding 界限的概念。给定一个具有值范围大小R的实值随机变量x,假设我们有n个独立的x观察值,并计算其均值。
Hoeffding 界限表明,以 1 – δ的概率,变量x的实际均值至少是其中
Hoeffding 界限与生成样本的概率分布无关,并且仅使用n个示例就能给出良好的近似。
Hoeffding 界限的思想在叶扩展中使用。如果x[1]是最具信息量的特征,而x[2]排名第二,那么使用用户定义的分割函数G(.)进行分割,以便:
输入和输出
分类数据和连续数据都可以是数据输入的一部分。在许多实现中,连续特征被离散化。所需的概率参数 1 – δ和与决策树共同的分割函数G(.)成为输入的一部分。输出是可解释的决策树模型,并且可以用类别和置信度值进行预测/学习。
它是如何工作的?
HoeffdingTree(x:输入流,G(.):分割函数,δ:概率界限)
-
让 HT 成为一个具有单个叶(根)的树
-
初始化计数(n[ijk], root)
-
for(t=1,2,…T) do //来自流的全部数据
-
x[t] = receive(); //接收数据
-
y[t] = obtainTrueLabel(); //获取真实标签
-
HTGrow((x[t], y[t]), HT, δ)
-
end
-
HTGrow((x[t], y[t]), HT, G(.), δ)
-
l = sort((x[t], y[t]), HT); //使用 HT 对数据进行排序到叶 l
-
updateCounts(n[ijk], l); //更新叶 l 的计数
-
if(examplesSoFarNotOfSameClass();//检查是否存在多个类别
-
computeForEachFeature(,G(.))
Hoeffding 树具有有趣的特性,例如:
-
它们是一个稳健的低方差模型
-
它们表现出较低的过拟合
-
由于 Hoeffding 界限,存在高概率上的误差率的理论保证
Hoeffding Trees 有适应概念漂移的变体,称为概念适应 VFDT。它们在流上使用滑动窗口概念。决策树中的每个节点都保留足够的统计信息;基于 Hoeffding 测试,当准确性更好时,会生长一个替代子树并将其交换。
优点和局限性
优点和局限性如下:
-
基本 HT 在属性接近所选ϵ时存在问题,并打破了平局。在任何节点上决定属性的数量又是一个问题。其中一些问题在 VFDT 中得到解决。
-
随着树的变化,树扩展的内存限制以及在一个实例上花费的时间成为问题。
-
VFDT 在模式变化方面存在问题,CVFDT 试图克服这些问题,如前所述。它是实时和大数据中最优雅、快速、可解释的算法之一。
集成算法
集成学习的思想与批量监督学习类似,其中多个算法以某种形式训练和组合来预测未见数据。即使在在线设置中,不同的集成方法也能带来相同的益处;例如,使用不同类型的多个算法,使用具有不同参数或样本数据的类似类型的模型,所有这些都可以找到不同的搜索空间或模式,从而降低总误差。
加权多数算法
加权多数算法(WMA)训练一组基础分类器,并按某种方式加权它们的投票,然后基于多数进行预测。
输入和输出
输入类型的约束(仅分类,仅连续,或混合)取决于所选的基础分类器。模型的可解释性取决于所选的基础模型(s),但很难解释模型组合的输出。当预测不正确时,每个模型的权重通过每个示例/实例的因子(β)更新。权重和模型的组合可以给出一些可解释性的线索。
它是如何工作的?
WeightedMajorityAlgorithm(x: inputstream, hm: m learner models)
-
initializeWeights(w[i])
-
for(t=1, 2,…T) do
-
x[t] = receive();
-
foreach model hk ∈ h
-
y[i] ← hk;
-
-
-
else
-
if y is known then
-
for i = 1 to m do
-
if yi ≠ y then
-
wi ← wi ** β*
end if
end for
-
-
end
优点和局限性
优点和局限性如下:
-
WMA 具有简单的实现和理论上的集成误差界限
-
困难之处在于选择正确的基算法,因为模型和池中模型的数量。
在线 Bagging 算法
正如在监督学习章节中看到的,袋装算法从训练集中创建不同的样本,并使用多个算法进行学习和预测,减少了方差,在学习和预测中非常有效。
输入和输出
对输入类型的限制(仅分类,仅连续,或混合)取决于所选的基本分类器。与算法对应的参数选择的基本分类器算法也是输入。输出是学习模型,可以根据所选分类器预测类别/置信度。
它是如何工作的?
基本的批量袋装算法需要整个数据可用以创建不同的样本,并将这些样本提供给不同的分类器。Oza 的在线袋装算法改变了这一限制,使得从无界数据流中学习成为可能。基于采样,原始算法中的每个训练实例被复制多次,每个基本模型使用原始实例的 k 份副本进行训练,其中:
P(k) = exp(–1)/k!
这相当于取一个训练示例,并为每个分类器选择 k~Poisson(1),然后更新基本分类器 k 次。因此,消除了对示例数量的依赖,算法可以在无限流上运行:
OnlineBagging(x: inputstream, h[m]: m learner models)
-
为所有 m ∈ {1,2,..M} 初始化基本模型 h[m]*
-
for(t=1,2,…T) do
-
x[t]=receive();
-
foreach model m = {1,2,..M}
w = Poisson(1)
updateModel(h[m], w, x[t])
-
end
-
-
return
-
优点和局限性
优点和局限性如下:
-
实验表明,它是最成功的在线或流算法之一。
-
权重必须分配给数据实例,而不考虑其他实例;这减少了在批量中可用且对模型性能良好的不同加权方案的选择。
性能完全取决于 M 学习者的选择——用于问题域的学习者类型。我们只能通过采用模型验证技术部分中描述的不同验证技术来决定这个选择。
在线提升算法
监督提升算法采用许多 弱学习器,其准确率略高于随机,通过迭代采样错误分类的示例来组合它们以产生强学习器。这个概念在 Oza 的在线提升算法中是相同的,但为了连续数据流进行了修改。
输入和输出
对输入类型(仅分类,仅连续,或混合)的限制取决于所选的基本分类器。基本分类器算法及其相应的参数是输入。输出是学习模型,可以根据所选分类器预测类别/置信度。
它是如何工作的?
将批量提升修改为在线提升的方法如下:
-
为 M 个基本模型保留两套权重,λ^c 是一个维度为 M 的向量,它携带正确分类实例的权重总和,而 λ^w 是一个维度为 M 的向量,它携带错误分类实例的权重总和。
-
权重初始化为 1。
-
给定一个新的实例(x[t],y[t]),算法通过更新基本模型的迭代过程。
-
对于每个基本模型,重复以下步骤:
-
对于第一次迭代,k = Poisson(λ) 被设置,学习分类器使用(在此表示为 h[1])k 次更新算法(使用(x[t],y[t])):
-
如果 h[1] 错误地分类了实例,则 λ^(w1) 增加,ϵ[1],由 h[1] 错误分类的加权分数,被计算,并且示例的权重乘以 1/2 ϵ[1]。
-
优点和局限性
优点和局限性如下:
-
再次,性能取决于多个学习者的选择、它们的类型以及特定问题的领域。在模型验证技术部分描述的不同方法帮助我们选择学习者。
-
Oza 的在线提升已被理论和实证证明不是“无损”;也就是说,与它的批量版本相比,模型是不同的。因此,它存在性能问题,近年来已经研究了不同的扩展来提高性能。
在在线设置中的验证、评估和比较
与我们在前几章中看到的机器学习模式不同,流学习在执行验证和评估的核心步骤时提出了独特的挑战。我们不再处理批量数据的事实意味着,用于验证评估和模型比较的标准技术必须适应增量学习。
模型验证技术
在离线或批量设置中,我们讨论了调整算法参数或测试算法泛化能力作为防止过拟合的对策的各种方法。批标签数据中的一些技术,如交叉验证,在在线或流设置中不直接适用。在线或流设置中最常用的技术将在下面给出。
预序评估
预序评估方法是一种将实例提供给算法的方法,然后使用损失函数将算法的输出预测与实际标签进行比较。因此,算法始终在未见数据上测试,无需“保留”数据来估计泛化。预序误差是根据实际值和预测值之间累积损失函数的总和计算的,给出如下:
为了更好地估计变化数据,进行了三种基本预序评估的变体,它们是:
-
使用地标窗口(基本)
-
使用滑动窗口
-
使用遗忘机制
最后两种方法是之前描述的技术扩展,其中你在预测上放置权重或衰减因子,这些权重或因子会随着时间的推移而减少。
保留集评估
这是保留机制或“独立测试集”方法在批量学习中的扩展。在这里,总标记集或流数据被分为训练集和测试集,要么基于某些固定间隔,要么基于算法看到的示例/实例数量。想象一下连续的数据流,我们在 和
处放置已知的间隔,以比较评估指标,如下一节所述,以评估性能。
控制排列
上述机制的问题在于,它们提供了随时间变化的“平均”行为,可能会掩盖一些基本问题,例如算法由于漂移而在开始时表现良好,而在结束时表现非常糟糕。前述方法的优点是,它们可以应用于实际的输入流以获得估计。克服这种缺点的一种方法是在数据的不同随机集中创建不同的随机集,同时保持时间上的邻近性,并在这些随机集上进行评估。
评估标准
大多数评估标准与监督学习章节中描述的相同,应根据业务问题、业务问题到机器学习技术的映射以及从中获得的收益来选择。在本节中,总结了读者最常用的在线监督学习评估标准:
-
准确率:衡量学习算法正确分类真实正例和真实负例的度量:
-
平衡准确率:当类别不平衡时,通常使用平衡准确率作为度量。平衡准确率是特异性和敏感性的算术平均值。也可以将其视为在二元分类问题中,从相同的概率中抽取正例和负例时的准确率。
-
ROC 曲线下面积 (AUC): ROC 曲线下面积提供了算法泛化能力的良好度量。接近 1.0 表示算法具有良好的泛化能力,而接近 0.5 则表示它更接近随机猜测。
-
Kappa 统计量 (K): Kappa 统计量用于衡量分类中观察到的准确度与随机猜测的预期准确度。在在线学习中,Kappa 统计量通过计算先验准确度 (po) 和随机分类器准确度 (pc) 来使用,其表达式为:
-
Kappa Plus 统计量: Kappa Plus 统计量是对 Kappa 统计量的一种修改,通过用持久分类器替换随机分类器来获得。持久分类器是一种基于先前实例的标签或结果预测下一个实例的分类器。
当考虑“漂移”或概念变化,如前所述,除了这些标准措施外,还使用一些已知的措施来给出定量度量:
-
真实变化检测的概率: 通常使用合成数据或已知变化的数据进行测量。它提供了学习算法检测变化的能力。
-
误报概率: 与离线设置中使用假阳性率不同,在线设置使用检测时间的倒数或平均运行长度,该长度使用预期假阳性检测时间来计算。
-
检测延迟: 这是指识别漂移所需的时间,以实例为单位的术语。
比较算法和指标
当在线设置中比较两个分类器或学习者时,通常的机制是采用性能指标,例如错误率,并使用适用于在线学习的统计检验。以下描述两种广泛使用的方法:
-
McNemar 检验: McNemar 检验是一种非参数统计检验,通常用于比较两个分类器的评估指标,例如“错误率”,通过存储两个分类器的简单统计信息。通过计算统计量 a,即一个算法正确分类的点数而另一个算法错误分类的数量,以及统计量 b,即其逆,我们得到 McNemar 检验如下:
该检验遵循 χ2 分布,p 值可用于检查统计显著性。
-
Nemenyi 检验: 当存在多个算法和多个数据集时,我们使用基于所有平均排名的 Nemenyi 检验进行统计显著性检验。如果排名差异超过由以下给出的关键差异,则认为两个算法在统计上以显著不同的方式表现:
在这里,K=算法数量,N=数据集数量。
假设关键差异值遵循 Student-T 分布。
使用聚类进行增量无监督学习
数据流中聚类的概念与批量或离线模式中的概念相同;也就是说,在保持对有限内存和处理所需时间的限制作为约束的同时,寻找有趣的数据簇或模式,这些模式在数据中聚集在一起。对现有算法进行单次修改或保持一个小内存缓冲区以执行现有算法的迷你批处理版本,构成了所有算法的基本变化,使它们适合流或实时无监督学习。
建模技术
在线学习的聚类建模技术分为基于分区、基于层次、基于密度和基于网格,类似于批量聚类的情况。
基于分区
基于分区算法的概念类似于批量聚类,其中形成k个聚类以优化某些目标函数,如最小化簇间距离,最大化簇内距离等。
在线 k-Means
k-Means 是最受欢迎的聚类算法,它将数据划分为用户指定的k个聚类,通常是为了最小化质心与分配给聚类的点之间的平方误差或距离。我们将说明 k-Means 的一个非常基本的在线自适应版本,其中存在几种变体。
输入和输出
主要,数值特征被视为输入;一些工具将分类特征转换为某种形式的数值表示。算法本身将聚类数量参数k和最大迭代次数n作为输入。
它是如何工作的?
-
输入数据流被认为是无限的,但块大小是恒定的。
-
保留一个块大小的内存缓冲区以存储数据或数据的压缩表示。
-
初始时,使用块大小的第一个数据流来找到聚类的k个质心,质心信息被存储,缓冲区被清除。
-
对于达到块大小后的下一个数据:
-
对于最大迭代次数或直到质心没有变化:
-
使用缓冲数据和当前质心执行 k-Means。
-
最小化质心与分配给聚类的数据之间的平方和误差。
-
迭代后,缓冲区被清除,并获得了新的质心。
-
-
重复步骤 4,直到数据不再可用。
优点和局限性
优点和局限性如下:
-
与批量基础类似,检测到的聚类形状取决于距离度量,在形状不规则的领域问题中不合适。
-
参数k的选择,如在批量基础上,可能会限制在具有许多不同模式或聚类的数据集上的性能。
-
异常值和缺失数据可能会在线 k-Means 的聚类行为中引起许多不规则性。
-
如果选择的缓冲区大小或迭代 k-Means 运行的流块大小较小,则无法找到正确的聚类。如果选择的块大小较大,可能会导致速度减慢或错过数据的变化。例如,非常快速 k-Means 算法(VFKM),它使用 Hoeffding 界限来确定缓冲区大小,在很大程度上克服了这一限制。
基于层次和微聚类的
层次方法通常基于聚类特征(CF)和聚类树(CT)。我们将描述层次聚类和BIRCH算法的基本内容和元素,CluStream 算法就是基于这个扩展的。
聚类特征是一种以压缩方式计算和保存关于簇的汇总统计量,而不是保留簇所属的全部数据。在一个d维数据集中,有N个点的簇中,计算两个总和,即每个维度的总和LS和每个维度的数据总平方和SS,这个三元组的表示向量形成聚类特征:
CF[j]* = < N, LS[j], SS[j] >*
这些统计数据有助于总结整个簇信息。簇的重心可以通过以下方式轻松计算:
质心[j]* = LS[j] / N*
可以使用以下方法估计簇的半径:
可以使用以下方法估计簇的直径:
CF 向量具有很好的增量性和累加性,这在流或增量更新中非常有用。
对于增量更新,当我们必须更新 CF 向量时,以下条件成立:
当两个 CF 需要合并时,以下条件成立:
聚类特征树(CF 树)表示一个层次树结构。CF 树的构建需要两个用户定义的参数:
-
分支因子b,即任何节点可以拥有的最大子簇或非叶节点数
-
最大直径(或半径)T,CF 父节点可以吸收的示例数量
CF 树操作,如插入,是通过递归遍历 CF 树并使用 CF 向量根据距离度量找到最近节点来完成的。如果一个叶节点已经吸收了由参数T给出的最大元素,则节点被分割。操作结束时,CF 向量会适当地更新其统计量:
图 3:一个展示层次结构的聚类特征树示例。
我们将根据这一概念讨论BIRCH(平衡迭代减少和聚类层次结构)。
输入和输出
BIRCH 只接受数值特征。CF 和 CF 树参数,如分支因子b和叶节点的最大直径(或半径)T是用户定义的输入。
它是如何工作的?
BIRCH 是为非常大的数据库设计的,原本是一个两遍算法;也就是说,扫描整个数据一次,然后再次扫描,因此是一个O(N)算法。它可以很容易地修改为单遍算法,以在线方式保留相同的属性:
-
在第一阶段或扫描中,它遍历数据,通过顺序访问点并执行之前讨论的 CF 树操作,创建一个内存中的 CF 树结构。
-
在第二阶段,这是一个可选阶段,我们去除异常值并合并子簇。
-
第三阶段是为了克服第一阶段数据顺序的问题。我们使用层次聚类对 CF 树进行重构。
-
第四阶段是最后一个阶段,这是一个可选阶段,用于计算统计信息,如计算质心、将数据分配给最近的质心等,以提高效率。
优点和局限性
优点和局限性如下:
-
它是最受欢迎的线性扩展算法之一,在大数据库或数据流上具有线性扩展能力。
-
它以 CF 和 CF 树的形式具有紧凑的内存表示,用于对传入数据的统计和操作。
-
它比大多数算法更好地处理异常值。
-
一个主要的局限性是,当簇的形状不是球形时,它已被证明表现不佳。
-
BIRCH 中的 CF 向量聚类概念被 Aggarwal 等人扩展,以适应高效的流挖掘需求,并命名为微簇和 CluStream。
输入和输出
CluStream 只接受数值特征。用户定义的参数包括内存中微簇的数量(q)和阈值(δ),在时间之后它们可以被删除。此外,输入还包括时间敏感的参数,用于存储微簇信息,由α和l给出。
它是如何工作的?
-
微簇扩展了 CF 向量,并保留了两个额外的度量。它们是时间戳的总和以及时间戳平方的总和:
微簇[j] = < N, LS[j], SS[j], ST, SST>
-
算法在内存中存储q个微簇,每个微簇都有一个最大边界,可以根据质心和簇实例之间的距离的均值和标准差来计算。这些度量乘以一个随时间指数递减的因子。
-
对于每个新的实例,我们根据欧几里得距离选择最近的微簇,并决定它是否应该被吸收:
-
如果新实例与最近微簇质心之间的距离在最大边界内,则它将被吸收,并且微簇统计信息将得到更新。
-
如果没有微簇可以吸收,则创建一个新的微簇,包含实例,并根据时间戳和阈值(δ),删除最旧的微簇。
-
假设时间戳服从正态分布,如果 CluStream 找到的实例的相关时间——实例到达的时间——低于用户指定的阈值,则被视为异常并删除。否则,将合并两个最近的微簇。
-
-
微簇信息通过使用金字塔时间窗口概念,时不时地存储在二级存储中。每个微簇使用 αl 指数递减的时间间隔来创建快照。这些快照有助于在时间和空间上高效搜索。
优点和局限性
优点和局限性如下:
-
CluStream 已被证明在实时寻找簇方面非常有效
-
CluStream 算法通过使用金字塔时间戳进行有效存储,具有高效的时间和空间使用。CluStream,就像 BIRCH 一样,只能找到球形形状的簇
基于密度
与批处理聚类类似,基于密度的技术克服了基于距离的算法面临的“形状”问题。在这里,我们将介绍一个著名的基于密度的算法,即 DenStream,它基于之前讨论的 CF 和 CF Trees 概念。
输入和输出
核心微簇的邻域范围是用户定义的半径 ϵ。第二个输入值是微簇的最小总权重 µ,它是每个实例到达时间加权函数的总和,其中权重随时间常数衰减,与另一个用户定义的参数 λ 成正比。最后,使用输入因子 β ∈ (0,1) 来区分潜在的核微簇和异常微簇。
它是如何工作的?
-
基于 CluStream 的微簇概念,DenStream 包含两个数据结构:p-微簇用于潜在簇和o-微簇用于异常检测。
-
每个 p-微簇 结构具有:
-
与它相关联的权重,该权重随时间戳的更新指数递减。如果微簇中有 j 个对象:
其中 f(t) = 2^(-λt)
-
加权线性求和(WLS)和加权线性平方和(WSS)与线性求和和平方和类似存储在微簇中:
-
使用之前定义的加权度量计算簇的均值、半径和直径,这与 CF 中的做法完全一样。例如,半径可以表示为:
-
-
每个 o-微簇 与 p-微簇 具有相同的结构,并与其相关联时间戳。
-
当一个新的实例到达时:
-
如果新半径在用户定义的边界 ϵ 内,则找到最近的 p-微簇 并将实例插入其中。如果插入,则相应更新 p-微簇 统计数据。
-
否则,如果新的半径再次在边界内,就会找到一个o-微簇,并将实例插入其中。边界由用户定义参数的乘积β × μ定义,如果半径超过这个值,o-微簇将被移动到p-微簇。
-
如果实例不能被一个o-微簇吸收,那么就会向o-微簇中添加一个新的微簇。
-
-
在基于权重的间隔时间t,o-微簇可以变成p-微簇,反之亦然。时间间隔以λ、β和µ来定义:
优点和局限性
优点和局限性如下:
-
基于参数,DenStream 可以找到实时数据的有效聚类和异常值。
-
它的优点是能够找到任何形状或大小的聚类和异常值。
-
如果没有正确选择,更新o-微簇和p-微簇的维护工作可能会计算成本高昂。
基于网格
这种技术基于将多维连续空间离散化为多维离散版本,并使用网格。将传入的实例映射到在线网格并维护离线网格的结果是一种高效且有效的方法,可以在实时中找到聚类。
在这里,我们介绍了 D-Stream,这是一个基于网格的在线流聚类算法。
输入和输出
与基于密度的算法一样,D-Stream 使用了实例衰减权重的想法。此外,如以下所述,从输入空间形成的网格中的单元格可能被认为是稀疏的、密集的或偶然的,这些区别是算法的计算和空间效率的核心。因此,基于网格的算法的输入如下:
-
λ: 衰减因子
-
0 < C[l] < 1 和 C[m] > 1:控制网格中密集和稀疏单元格之间边界的参数
-
β > 0:一个常数,用于控制当稀疏单元格被视为偶然单元格时的一个条件。
它是如何工作的?
-
在时间t到达的每个实例都有一个随时间指数衰减的密度系数:
-
在任何给定时间t,网格单元格g的密度由D(g, t)给出,它是映射到网格单元格g的所有实例的调整密度的总和E(g, t):
-
网格中的每个单元格都捕获了以下作为特征向量的统计数据:
-
CV(g) = <t[g], t>[m], D, label, status> 其中:
-
t[g] = 网格单元格上次更新的时间
-
t[m]= 网格单元格上次由于稀疏性而被移除的时间
-
D = 上次更新时网格单元格的密度
-
label = 网格单元格的类别标签
-
status =
-
-
当新的实例到达时,它会被映射到一个单元格g,并且特征向量被更新。如果g不可用,它将被创建,并且网格列表被更新。
-
具有空实例的网格单元将被移除。此外,长时间未更新的单元可能会变得稀疏,相反,当映射许多实例时,它们会变得密集。
-
在一个称为间隔的常规时间间隔内,检查网格单元的状态,那些实例数量少于由密度阈值函数确定的数字的单元被视为异常值并被移除。
优点和局限性
优点和局限性如下:
-
D-Streams 在理论和实证上已被证明能够在空间和时间上以非常高的效率找到偶然和正常的聚类。
-
它可以有效地找到任何形状或大小的聚类。
验证和评估技术
许多在第三章无监督机器学习技术中讨论的静态聚类评估度量都假设存在静态和非演化的模式。其中一些内部和外部度量甚至在基于流的聚类检测中使用。本节的目标是首先强调流学习聚类评估中固有的问题,然后描述解决这些问题的不同内部和外部度量,最后介绍一些现有的度量——包括内部和外部度量——它们仍然有效。
流聚类评估的关键问题
理解一些特定于流和聚类的关键问题很重要,因为这些度量需要解决这些问题:
-
老化: 点在给定时间后不再与聚类度量相关的属性。
-
遗漏的点: 点不仅被遗漏为属于聚类,而且遗漏的量在聚类中。
-
放置错误: 由新聚类的演变引起的聚类变化。合并现有或删除聚类会导致随着时间的推移出现不断放置错误。必须考虑这些变化随时间的影响。
-
聚类噪声: 选择不应属于聚类的数据或围绕噪声形成聚类及其随时间的影响必须被考虑。
评估度量
在流数据上下文中进行聚类的评估度量必须提供聚类质量的有用指标,同时考虑演化和噪声数据流的影响、重叠和合并的聚类等问题。在此,我们介绍了一些在流聚类中使用的外部度量。在第三章无监督机器学习技术中遇到的许多内部度量,如轮廓系数、Dunn 指数和 R 平方,也被使用,此处不再重复。
聚类映射度量(CMM)
CMM 背后的思想是在给定真实情况下量化点到聚类的连通性。它分为三个阶段:
映射阶段:在这个阶段,流学习算法分配的聚类映射到真实聚类。基于这些,使用 k-最近邻的概念测量距离和点连通性的各种统计量。
点p在聚类Ci 中到其最近的k个邻居的平均距离由以下公式给出:
聚类C[i]的平均距离由以下公式给出:
聚类C[i]中点p的点连通性由以下公式给出:
对每个聚类计算类别频率,并通过计算直方图和聚类中的相似性来执行聚类到真实聚类的映射。
具体来说,聚类C[i]映射到真实类别,而Cl[j]映射到覆盖C[i]中类别频率大多数的真实聚类。剩余定义为类Cl[i]中未被真实聚类
覆盖的实例数量,以及与
相比,在聚类C[i]中类Cl[1],Cl[2],Cl[3] … Cl[1]中的实例的总剩余量给出如下:
使用以下方法映射聚类C[i]:
惩罚阶段:在这个步骤中,使用错误对象的计算来计算映射错误的每个实例的惩罚;即不是噪声但放置错误的对象,使用以下方法:
点o相对于所有找到的聚类的总体惩罚由以下公式给出:
CMM 计算:使用所有惩罚在生命周期内加权给出如下:
这里,C是找到的聚类,Cl是真实聚类,F是错误对象,w(o)是实例的权重。
V 度量
验证度或 V 度量是一个外部度量,它是基于流聚类中两个感兴趣的属性计算的,即同质性和完整性。如果有n个类别,设C = {c[1], c[2] …, c[n]},和k个聚类K = {k[1], k[2..]k[m]},则创建列联表,其中A = {a[ij]}对应于类别c[i]和聚类k[j]中的实例数量。
同质性:同质性定义为聚类的一个属性,反映了聚类中所有数据属于同一类别的程度。
条件熵和类别熵:
同质性定义为:
同质性值越高越理想。
完整性:完整性定义为同质性的镜像属性,即所有单个类别的实例都属于同一个聚类。
与同质性类似,条件熵和聚类熵定义为:
完整性定义为:
V-Measure 定义为使用权重因子β的同质性和完整性的调和平均值:
完整性或 V-measure 的值越高越好。
其他外部度量
接下来给出一些外部度量,这些度量在比较聚类算法或测量已知类别的聚类有效性时相当流行:
纯度和熵:它们与之前定义的同质性和完整性相似。
纯度定义为:
熵定义为:
这里,q = 类别数量,k = 聚类数量,nr = 聚类r的大小,。
精度、召回率和F-Measure:针对聚类算法修改的信息检索度量如下:
给定,和
。
精度定义为:
召回率定义为:
F-measures 定义为:
使用离群值检测进行无监督学习
在数据流中寻找离群值或异常值是机器学习中的一个新兴领域。这个领域的研究并没有像基于分类和聚类的问题那样受到研究者的广泛关注。然而,已经有一些非常有趣的想法将聚类的概念扩展到从数据流中寻找离群值。我们将提供一些在流离群值检测中已被证明非常有效的科研。
基于分区聚类进行离群值检测
这里的核心思想是使用基于在线分区聚类算法,并根据聚类大小排序或簇间距离排序,将簇标记为离群值。
这里我们介绍由 Koupaie 等人提出的一种算法,使用增量 k-Means。
输入和输出
仅使用数值特征,正如大多数 k-Means 算法一样。聚类数量k和离群值窗口数量n,在离线聚类中使用的输入参数。输出是恒定的离群值(局部和全局)以及一个可更新的模型,用于检测这些离群值。
它是如何工作的?
-
该算法通过 k-Means 算法在两种模式下工作,离线模式和在线模式,两者并行运行。
-
对于在线模式:
-
在给定的窗口 w 上应用 k-Means,并找到具有簇的数据的簇和分区。
-
根据簇距离和簇大小对簇进行排序。距离最远且尺寸较小的簇被认为是异常值。
-
将窗口作为集合 O[w] = {x[1], x[2..]x[n]} 存储异常值,并将它们视为局部异常值。
-
窗口被清除,过程重复。
-
-
对于离线模式:
-
从 n 个先前窗口中获取异常值,并创建一个集合:
-
使用 k-Means 对窗口 S 进行聚类,并找到距离最远且尺寸较小的簇。
-
这些簇是全局异常值。
-
窗口被清除,过程重复。
-
优点和局限性
优点和局限性如下:
-
它对参数 k 和 n 非常敏感,可以生成大量噪声。
-
只找到了球形簇/异常值,而不同形状的异常值被遗漏了。
基于距离的异常值检测聚类
基于距离的异常值检测是流学习领域中研究、实施最广泛的方法。基于滑动窗口、最近邻数量、半径和阈值以及其他考虑数据中异常值的措施,有许多基于距离的方法的变体。我们将尝试在本节中给出最重要的算法的抽样。
输入和输出
大多数算法将以下参数作为输入:
-
窗口大小 w,对应算法查找异常值模式时的固定大小
-
滑动大小 s,对应于将被添加到窗口中的新实例数量,以及将被移除的旧实例数量
-
使用最近邻计算时实例的计数阈值 k
-
用于定义距离中异常值阈值的距离阈值 R
异常值作为标签或分数(基于邻居和距离)输出。
如何工作?
我们展示了基于距离的流异常值算法的不同变体,揭示了它们的不同之处或独特之处。每个算法的独特元素定义了滑动窗口过期时会发生什么,如何处理新的滑动窗口,以及如何报告异常值。
精确风暴
精确风暴将数据存储在当前窗口 w 中的已知索引结构中,以便对给定点的范围查询搜索或查询在距离 R 内的邻居进行高效处理。它还存储所有数据点的 k 个前驱和后继邻居:
-
过期滑动窗口:过期滑动窗口中的实例从影响范围查询的索引结构中删除,但保留在邻居的前驱列表中。
-
新滑动窗口:对于新滑动窗口中的每个数据点,执行范围查询 R,使用结果更新实例的前驱和后继列表,并将实例存储在索引结构中。
-
异常值报告:在任何窗口中,在处理过期和新幻灯片元素完成后,任何至少有 k 个元素来自后继列表和非过期前驱列表的实例都被报告为异常值。
抽象-C
Abstract-C 保持索引结构与 Exact Storm 相似,但不是为每个对象维护前驱和后继列表,而是仅维护实例参与窗口的邻居计数列表:
-
过期幻灯片:在过期幻灯片中的实例将从影响范围查询的索引结构中移除,并且与最后一个窗口对应的计数列表中的第一个元素也被移除。
-
新幻灯片:对于新幻灯片中的每个数据点,执行范围查询 R,并使用结果更新计数列表。对于现有实例,计数会根据新的邻居更新,并将实例添加到索引结构中。
-
异常值报告:在任何窗口中,在处理过期和新幻灯片元素完成后,当前窗口中邻居计数少于 k 的所有实例都被视为异常值。
直接更新事件(DUE)
DUE 保持索引结构以进行高效的范围查询,与其它算法完全相同,但有一个不同的假设,即当发生过期幻灯片时,并非每个实例都会以相同的方式受到影响。它维护两个优先队列:不安全内点队列和异常值列表。不安全内点队列根据前驱邻居的最小过期时间的递增顺序排序实例。异常值列表包含当前窗口中的所有异常值:
-
过期幻灯片:过期幻灯片中的实例将从影响范围查询的索引结构中移除,并且不安全内点队列将更新过期邻居。那些成为异常值的不安全内点将从优先队列中移除,并移动到异常值列表中。
-
新幻灯片:对于新幻灯片中的每个数据点,执行范围查询 R,使用结果更新点的后继邻居,并且仅更新实例的最近前驱点。基于这些更新,点被添加到不安全内点优先队列或从队列中移除并添加到异常值列表中。
-
异常值报告:在任何窗口中,在处理过期和新幻灯片元素完成后,所有异常值列表中的实例都被报告为异常值。
基于微聚类的算法(MCOD)
基于微聚类的异常值检测克服了为每个数据点执行范围查询的计算问题。在这些算法中,使用微聚类数据结构而不是范围查询。微聚类以实例为中心,半径为 R。所有属于微聚类的点成为内点。位于微聚类之外的点可以是异常值或内点,并存储在单独的列表中。它还拥有与 DUE 类似的数据结构,以保持不安全内点的优先队列:
-
过期的滑动窗口:过期的滑动窗口中的实例从微簇和包含异常值和内点的数据结构中删除。与 DUE 算法一样,更新过期的邻居的不安全内点队列。微簇也针对非过期数据点进行更新。
-
新滑动窗口:对于新滑动窗口中的每个数据点,实例要么成为微簇的中心,要么成为微簇的一部分,或者被添加到事件队列和异常值的数据结构中。如果点在距离R内,它被分配给现有的微簇;否则,如果有k个点在R内,它成为新微簇的中心;如果没有,它进入事件队列和可能的异常值的两个结构中。
-
异常值报告:在任何窗口中,在处理过期的和新滑动窗口元素完成后,任何在异常结构中具有少于k个邻近实例的实例被报告为异常值。
Approx Storm
如其名所示,Approx Storm 是 Exact Storm 的近似。这两种近似方法如下:
-
通过添加一个因子ρ并将窗口更改为ρW来减少窗口中数据点的数量。
-
通过使用前一个列表中安全的内点数与当前窗口中数字的比例来存储数字而不是前一个邻居的数据结构。
处理过期的和新滑动窗口以及如何根据这些步骤确定异常值如下:
-
过期的滑动窗口:与 Exact Storm 相同——过期的滑动窗口中的实例从影响范围查询的索引结构中删除,但保留在邻居的前一个列表中。
-
新滑动窗口:对于新滑动窗口中的每个数据点,执行范围查询R,使用结果来计算之前讨论过的分数,并更新索引结构。如果大小超过该值,则通过移除随机内点来将安全内点的数量限制为ρW。假设大多数安全内点都是安全的。
-
异常值报告:在任何窗口中,在处理过期的和新滑动窗口元素之后,当基于分数、窗口大小和前一个列表的实例的邻居数量的近似值小于k时,它被视为异常值。
优点和局限性
优点和局限性如下:
-
Exact Storm 在存储和 CPU 方面对存储列表和检索邻居有较高要求。尽管它们被实现为高效的数据结构,但范围查询可能会引入延迟。
-
Abstract-C 相对于 Exact Storm 有轻微的优势,因为它不需要在每个窗口实例上花费时间来查找活跃的邻居。存储和时间消耗仍然很大程度上取决于窗口和滑动选择。
-
DUE 相对于 Exact Storm 和 Abstract-C 有一些优势,因为它可以有效地重新评估点的“内含性”(即,是否不安全的内点仍然保持内点或变为异常点),但排序结构会影响 CPU 和内存。
-
MCOD 由于使用了微簇结构并去除了成对距离计算,在内存和 CPU 方面具有独特的优势。在微簇中存储邻域信息也有助于节省内存。
-
Approx Storm 与其他方法相比,在时间上具有优势,因为它不会处理上一个窗口中的过期数据点。
验证和评估技术
基于流的异常的验证和评估仍然是一个开放的研究领域。在许多研究比较中,我们看到使用了各种指标,例如:
-
以每个对象的 CPU 时间来衡量评估时间
-
流中检测到的异常数量
-
与现有标签相关的异常数量,TP/精确率/召回率/PRC 曲线下的面积等
通过改变窗口大小、半径内的邻居等参数,我们确定了对之前提到的性能指标的敏感性,并确定其鲁棒性。
流学习案例研究
本章中的案例研究包括几个实验,展示了基于流的机器学习的不同方法。选择了一个经过充分研究的数据集作为流数据源,并使用了基于监督的树方法,如朴素贝叶斯、Hoeffding 树,以及集成方法。在无监督方法中,使用的聚类算法包括 k-Means、DBSCAN、CluStream 和 CluTree。异常检测技术包括 MCOD 和 SimpleCOD 等。我们还展示了分类实验的结果,这些结果展示了处理概念漂移的能力。本章前面描述的用于在滑动窗口中计算统计的 ADWIN 算法被用于几个分类实验中。
工具和软件
最受欢迎且可能是最全面的基于 Java 的数据流挖掘框架之一是瓦卡托大学创建的开源大规模在线分析(MOA)软件。该框架是一系列流分类、聚类和异常检测算法的集合,并支持变化检测和概念漂移。它还包括数据生成器和几个评估工具。该框架可以通过新的流数据生成器、算法和评估器进行扩展。在本案例研究中,我们使用基于文件的数据流,采用了几种流数据学习方法。
注意
GitHub:github.com/Waikato/moa
如图 4和图 5所示的 MOA 工具的一系列截图所示,顶层菜单允许你选择要执行的学习类型。例如,对于分类实验,工具的配置包括选择要运行的任务(此处选择为预 quential 评估),然后配置我们想要使用的学习器和评估器,最后是数据流的来源。配置任务对话框中显示的窗口宽度参数可以影响所选模型的准确性,正如我们将在实验结果中看到的那样。除了选择窗口宽度的不同值之外,所有基学习器参数都保留为默认值。一旦配置了任务,就可以通过点击运行按钮来运行:
图 4. MOA 配置预 quential 评估分类的图形界面,包括设置窗口宽度
图 5. MOA 预 quential 分类任务的图形界面。在配置任务中,你必须选择一个学习器,定位数据流(细节未显示),并选择一个评估器
任务完成后,可以将模型评估结果导出为 CSV 文件。
商业问题
本案例研究的问题是从电力市场数据流中持续学习并预测市场价格变动方向。我们比较了包括概念漂移在内的不同分类方法的准确性和平均成本,以及聚类和异常检测的性能。
机器学习映射
本案例研究中使用的数据集可以用来说明经典的基于批次的监督学习和无监督学习技术。然而,在这里我们将其视为基于流的 数据源,以展示我们如何使用本章中描述的技术在 MOA 框架下执行分类、聚类和异常检测任务。在此背景下,我们展示了在假设数据流是平稳的以及表现出概念漂移的演变数据流的情况下,如何实现增量学习。
数据收集
该数据集被称为电力或 ELEC 数据集,由新南威尔士电力市场收集。该市场的价格是可变的,并且根据供需情况每 5 分钟调整一次。该数据集包括从 1996 年 5 月到 1998 年 12 月每半小时获得 45,312 个这样的数据点。目标是表示价格相对于 24 小时移动平均值的上升或下降趋势。
注意
数据文件是位于downloads.sourceforge.net/project/moa-datastream/Datasets/Classification/elecNormNew.arff.zip?r=http%3A%2F%2Fmoa.cms.waikato.ac.nz%2Fdatasets%2F&ts=1483128450&use_mirror=cytranet
的 ARFF 格式的公开文件。
数据采样和转换
在这里进行的实验中,没有进行数据采样;数据集中的每个示例都是单独处理的,没有示例被排除。所有数值数据元素都已归一化到 0 到 1 之间。
特征分析和降维
ELEC 数据集包含 45,312 条记录,有九个特征,包括目标类别。特征 class 和 day 是名义的(分类的),其余都是数值的(连续的)。特征列在表 1和表 2中,并给出了 ELEC 数据集的描述性统计:
名称 | 数据类型 | 描述 |
---|---|---|
class | nominal | UP, DOWN—相对于 24 小时移动平均的价格变动方向 |
date | continuous | 记录价格日期 |
day | nominal | 星期几(1-7) |
period | continuous | |
nswprice | continuous | 新南威尔士州的电力价格 |
nswdemand | continuous | 新南威尔士州的电力需求 |
vicprice | continuous | 维多利亚的电力价格 |
vicdemand | continuous | 维多利亚的电力需求 |
transfer | integer |
表 1. ELEC 数据集特征
count | mean | std | 25% | 50% | 75% | |
---|---|---|---|---|---|---|
date | 45312 | 0.49908 | 0.340308 | 0.031934 | 0.456329 | 0.880547 |
period | 45312 | 0.5 | 0.294756 | 0.25 | 0.5 | 0.75 |
nswprice | 45312 | 0.057868 | 0.039991 | 0.035127 | 0.048652 | 0.074336 |
nswdemand | 45312 | 0.425418 | 0.163323 | 0.309134 | 0.443693 | 0.536001 |
vicprice | 45312 | 0.003467 | 0.010213 | 0.002277 | 0.003467 | 0.003467 |
vicdemand | 45312 | 0.422915 | 0.120965 | 0.372346 | 0.422915 | 0.469252 |
transfer | 45312 | 0.500526 | 0.153373 | 0.414912 | 0.414912 | 0.605702 |
表 2. ELEC 数据集特征的描述性统计
特征降维步骤在此省略,因为它在大多数基于流的机器学习中是常见的。
模型、结果和评估
实验被分为分类、概念漂移、聚类和异常检测。每个实验集的学习过程细节和实验结果在此给出。
监督学习实验
在这组实验中,选择线性、非线性以及集成学习器,以展示各种分类器的行为。随机梯度下降(SGD),使用线性 SVM,以及朴素贝叶斯是线性分类器,而懒惰 k-NN 是非线性分类器。对于集成学习,我们使用两个元学习器,利用袋装(LB)和 OxaBag,以及不同的线性和非线性基学习器,如 SGD、朴素贝叶斯和 Hoeffding 树。OxaBag 中使用的算法在集成算法部分进行了描述。在 LB 中,用于重采样的权重因子是可变的(这里使用默认值 6),而 OxaBag 中的权重是固定的,为 1。
预先评估被选用于所有分类方法,因此每个示例首先与现有模型的预测进行测试,然后用于训练模型。这需要选择窗口宽度,不同窗口宽度值下各种模型的性能列于表 3。使用了 100、500、1000 和 5000 个元素的宽度:
| 算法 | 窗口宽度 | 评估时间(CPU 秒) | 模型成本(RAM 小时) | 分类正确率(百分比) | Kappa 统计量(百分比) |
| --- | --- | --- | --- | --- |
| SGD | 100 | 0.5781 | 3.76E-10 | 67 | 0 |
| SGD | 500 | 0.5781 | 3.76E-10 | 55.6 | 0 |
| SGD | 1000 | 0.5469 | 3.55E-10 | 53.3 | 0 |
| SGD | 5000 | 0.5469 | 3.55E-10 | 53.78 | 0 |
| NaiveBayes | 100 | 0.7656 | 8.78E-10 | 86 | 65.7030 |
| NaiveBayes | 500 | 0.6094 | 8.00E-10 | 82.2 | 62.6778 |
| NaiveBayes | 1000 | 0.6719 | 7.77E-10 | 75.3 | 48.8583 |
| NaiveBayes | 5000 | 0.6406 | 7.35E-10 | 77.84 | 54.1966 |
| kNN | 100 | 34.6406 | 4.66E-06 | 74 | 36.3057 |
| kNN | 500 | 34.5469 | 4.65E-06 | 79.8 | 59.1424 |
| kNN | 1000 | 35.8750 | 4.83E-06 | 82.5 | 64.8049 |
| kNN | 5000 | 35.0312 | 4.71E-06 | 80.32 | 60.4594 |
| LB-kNN | 100 | 637.8125 | 2.88E-04 | 74 | 36.3057 |
| LB-kNN | 500 | 638.9687 | 2.89E-04 | 79.8 | 59.1424 |
| LB-kNN | 1000 | 655.8125 | 2.96E-04 | 82.4 | 64.5802 |
| LB-kNN | 5000 | 667.6094 | 3.02E-04 | 80.66 | 61.0965 |
| LB-HoeffdingTree | 100 | 13.6875 | 2.98E-06 | 91 | 79.1667 |
| LB-HoeffdingTree | 500 | 13.5781 | 2.96E-06 | 93 | 85.8925 |
| LB-HoeffdingTree | 1000 | 12.5625 | 2.74E-06 | 92.1 | 84.1665 |
| LB-HoeffdingTree | 5000 | 12.7656 | 2.78E-06 | 90.74 | 81.3184 |
表 3. 不同窗口大小的分类器性能
对于表 4 中的算法,使用不同窗口宽度值时的性能相同:
算法 | 评估时间(CPU 秒) | 模型成本(RAM 小时) | 分类正确率(百分比) | Kappa 统计量(百分比) |
---|---|---|---|---|
HoeffdingTree | 1.1562 | 3.85E-08 | 79.1953 | 57.2266 |
HoeffdingAdaptiveTree | 2.0469 | 2.84E-09 | 83.3863 | 65.5569 |
OzaBag-NaiveBayes | 2.01562 | 1.57E-08 | 73.4794 | 42.7636 |
OzaBagAdwin-HoeffdingTree | 5.7812 | 2.26E-07 | 84.3485 | 67.5221 |
LB-SGD | 2 | 1.67E-08 | 57.6977 | 3.0887 |
LB-NaiveBayes | 3.5937 | 3.99E-08 | 78.8753 | 55.7639 |
表 4. 分类器性能(所有窗口宽度相同)
概念漂移实验
在这个实验中,我们继续使用 EvaluatePrequential 来配置分类任务。这次我们选择 DriftDetectionMethodClassifier
作为学习器,DDM 作为漂移检测方法。这展示了适应不断变化的数据流。使用的基学习器和获得的结果显示在 表 5 中:
算法 | 评估时间(CPU 秒) | 模型成本(RAM 小时) | 分类正确率(百分比) | Kappa 统计量(百分比) | 变化检测 |
---|---|---|---|---|---|
SGD | 0.307368829 | 1.61E-09 | 53.3 | 0 | 132 |
Naïve-Bayes | 0.298290727 | 1.58E-09 | 86.6 | 73.03986 | 143 |
Lazy-kNN | 10.34161893 | 1.74E-06 | 87.4 | 74.8498 | 12 |
HoeffdingTree | 0.472981754 | 5.49E-09 | 86.2 | 72.19816 | 169 |
HoeffdingAdaptiveTree | 0.598665043 | 7.19E-09 | 84 | 67.80878 | 155 |
LB-SGD | 0.912737325 | 2.33E-08 | 53.3 | 0 | 132 |
LB-NaiveBayes | 1.990137758 | 3.61E-08 | 85.7 | 71.24056 | 205 |
OzaBag-NaiveBayes | 1.342189725 | 2.29E-08 | 77.4 | 54.017 | 211 |
LB-kNN | 173.3624715 | 1.14E-04 | 87.5 | 75.03296 | 4 |
LB-HoeffdingTree | 5.660440101 | 1.61E-06 | 91.3 | 82.56317 | 59 |
OzaBag-HoeffdingTree | 4.306455545 | 3.48E-07 | 85.4 | 70.60209 | 125 |
表 5. 具有概念漂移检测的分类器性能
聚类实验
几乎所有在 MOA 工具中实现的聚类算法都用于这次实验。收集了外部和内部评估结果,并已在 表 6 中列出。CMM、同质性和完整性在本章前面已定义。我们之前在 第三章 的讨论中遇到过纯度和轮廓系数,无监督机器学习技术。SSQ 是实例与其各自簇中心距离平方和;SSQ 的值越低,越好。表中 m = 1 表示使用微聚类。宏簇计算的频率由所选的时间跨度 h 决定,例如:
算法 | CMM | 同质性 | 完整性 | 纯度 | SSQ | 轮廓系数 |
---|---|---|---|---|---|---|
Clustream With k-Means (h = 5000; k = 2; m = 1) | 0.7168 | -1.0000 | 0.1737 | 0.9504 | 9.1975 | 0.5687 |
Clustream With k-Means(h = 1000; k = 5) | 0.5391 | -1.0000 | 0.8377 | 0.7238 | 283.6543 | 0.8264 |
Clustream (h = 1000; m = 1) | 0.6241 | -1.0000 | 0.4363 | 0.9932 | 7.2734 | 0.4936 |
Denstream With DBSCAN (h = 1000) | 0.4455 | -1.0000 | 0.7586 | 0.9167 | 428.7604 | 0.6682 |
ClusTree (h = 5000; m = 1) | 0.7984 | 0.4874 | -0.4815 | 0.9489 | 11.7789 | 0.6879 |
ClusTree (h = 1000; m = 1) | 0.7090 | -1.0000 | 0.3979 | 0.9072 | 13.4190 | 0.5385 |
AbstractC | 1.0000 | 1.0000 | -8.1354 | 1.0000 | 0.0000 | 0.0000 |
MCOD (w = 1000) | 1.0000 | 1.0000 | -8.1354 | 1.0000 | 0.0000 | 0.0000 |
异常检测实验
在最终的实验集中,使用了五种异常检测算法来处理 ELEC 数据集。结果见 表 7:
算法 | 始终内节点的节点 | 始终异常节点的节点 | 同时内节点和异常节点的节点 |
---|---|---|---|
MCOD | 42449 (93.7%) | 302 (0.7%) | 2561 (5.7%) |
ApproxSTORM | 41080 (90.7%) | 358 (0.8%) | 3874 (8.5%) |
SimpleCOD | 42449 (93.7%) | 302 (0.7%) | 2561 (5.7%) |
AbstractC | 42449 (93.7%) | 302 (0.7%) | 2561 (5.7%) |
ExactSTORM | 42449 (93.7%) | 302 (0.7%) | 2561 (5.7%) |
表 7. 异常检测评估
以下图表 (图 6) 展示了在运行算法 Abstract-C 对整个数据集进行处理后,三个特征对的实验结果。在每一个图表中,都很容易看到围绕数据点的圆圈所标识的异常值。尽管在多个维度上同时可视化异常值是困难的,但双变量散点图给出了一些在基于流的设置中应用异常检测方法的检测结果:
图 6. 使用 Abstract-C 对 45,300 个实例进行处理后,对三个特征对进行异常检测
图 7 中的图像显示了 MOA 的一个截图,其中同时运行了两个算法,Angiulli.ExactSTORM
和 Angiulli.ApproxSTORM
;每个算法的双变量散点图并排显示,并附有每个对象的处理时间比较:
图 7. MOA 中异常检测的可视化
流学习结果分析
基于分类、聚类和异常检测实验中学习到的模型的评估,分析揭示了几个有趣的观察结果。
分类实验:
-
如表 3 所示,性能从线性算法到非线性算法有相当显著的提升。线性 SGD 使用准确率指标达到 67% 的最佳性能,而 KNN 和 Hoeffding Tree 显示 82.4 到 93%。这清楚地表明,问题是非线性的,使用非线性算法将提供更好的性能。
-
K-NNs 提供了良好的性能,但代价是评估时间,如表 3 所示。评估时间和内存都显著更高——大约高两个数量级——比线性方法。当模型需要在更紧的评估周期中运行时,必须非常谨慎地选择算法,如 KNNs。
-
霍夫丁树提供了最佳的分类率和 Kappa 统计量。评估时间也不如 KNNs 高,但仍然在秒的量级,这在许多基于实时流的应用中可能或可能不是可接受的。
-
朴素贝叶斯的评估时间最低——尽管与 SGD 没有太大区别——并且通过选择合适的窗口宽度,可以提供仅次于霍夫丁树的性能。例如,在宽度 100 时,朴素贝叶斯有 86%的分类率,仅次于霍夫丁树的 93%,但与超过 13 秒的评估时间相比,朴素贝叶斯只需 0.76 秒,如表 3 所示。
-
保持窗口宽度不变,从线性(SGD,朴素贝叶斯)到非线性(霍夫丁树)再到基于集成(OzaBag,Adwin,霍夫丁树)的改进模式在表 4 中清晰展示。这清楚地表明,理论上,集成选择可以帮助减少错误,但代价是模型的可解释性降低。
-
与表 3 和表 4 相比,表 5显示了为什么具有漂移保护和使用自动漂移检测进行学习可以增加鲁棒性。基于集成的 OzaBag-NaiveBayes、OzaBag-HoeffdingTrees 和 OzaBag-HoeffdingAdaptiveTree 的学习都显示出比非漂移保护运行更好的改进。
聚类实验:
-
从表 6 的前两个模型中,我们可以看到,k-Means 在 5,000 个实例的视域和 k 值为 2 的情况下,与视域较小且 k 值为 5 的模型相比,具有更高的纯度、更高的 CMM 和更低的 SSQ。在完整的结果集中(可在本书网站上找到,见下文链接),可以看到较大视域的影响是导致差异的主要因素。
-
在使用微聚类的聚类模型中,SSQ 通常比不使用微聚类时显著更小。这是可以理解的,因为存在更多的簇和每个簇的实例更少,SSQ 是相对于簇中心来衡量的。
-
DBSCAN 被发现对微聚类和视域大小不敏感。与其他所有模型相比,它在内在度量(轮廓系数)以及外在度量(完整性,纯度)方面都排名很高。
-
两个 ClusTree 模型在 CMM 和纯度分数方面表现最佳,由于微聚类导致低 SSQ。
-
最后两个基于异常值聚类的算法具有完美的 CMM 和纯度分数。这些指标不受窗口大小(尽管这会影响评估时间)或 k 值(邻居计数阈值)的影响。
异常值检测实验:
-
在本组实验中,所有技术表现相当,唯一的例外是 ApproxSTORM,考虑到与精确版本相比,该方法使用的窗口减少,这是可以预料的。
-
实例之间的比例,总是内点与总是外点之间的比例,对于大多数模型来说接近 140。这是否意味着对于给定的数据集具有足够的判别能力取决于实时学习问题的目标。
注意
所有 MOA 配置文件和实验结果均可在以下网址获取:github.com/mjmlbook/mastering-java-machine-learning/Chapter5
。
摘要
基于流的学习的假设与基于批次的学习的假设不同,其中最重要的是操作内存和计算时间上的上界。必须计算滑动窗口或采样的运行统计量,以便扩展到可能无限的数据流。我们区分了从静态数据学习的情况,其中假设生成数据分布是恒定的,以及动态或演变数据的情况,其中必须考虑概念漂移。这是通过涉及监控模型性能变化或监控数据分布变化的技巧来实现的。显式和隐式自适应方法是调整概念变化的方式。
已经有几种监督学习和无监督学习方法被改编用于增量在线学习。监督方法包括线性、非线性以及集成技术,介绍了 HoeffdingTree,它特别有趣,很大程度上是因为它对错误率上界提供了保证。模型验证技术,如预 quential 评估,是增量学习特有的改编。对于静态监督学习,评估指标与基于批次的学习方法中使用的相似。在演变数据流的情况下,使用其他指标。
在固定内存和时间约束下运行的聚类算法通常使用小内存缓冲区,并使用标准技术在单次遍历中使用。在评估聚类时必须考虑特定于流的问题,如老化、噪声、丢失或放置错误的数据点。数据流中的异常检测是一个相对较新且正在增长的领域。将聚类中的思想扩展到异常检测已被证明非常有效。
本章案例研究中的实验使用 Java 框架 MOA,展示了各种基于流的监督学习、聚类和异常检测技术。
在下一章中,我们将开始探索在各个领域中用于表示、获取知识和学习的概率图建模技术。
参考文献
-
G. Cormode 和 S. Muthukrishnan (2010). 改进的数据流摘要:Count-Min sketch 及其应用。算法杂志,55(1):58–75,2005。
-
João Gama (2010). 从数据流中进行知识发现,Chapman and Hall / CRC 数据挖掘与知识发现系列,CRC Press 2010,ISBN 978-1-4398-2611-9,第 I-XIX 页,1-237 页。
-
B. Babcock,M. Datar,R. Motwani (2002)。在流数据移动窗口上的抽样,在第 13 届年度 ACM-SIAM 离散算法研讨会论文集,第 633–634 页,2002 年。
-
Bifet,A. 和 Gavalda,R. (2007). 使用自适应窗口从时间变化数据中学习. 在 SIAM 国际数据挖掘会议论文集。SDM。443–448 页。
-
Vitter,J. (1985)。带有水库的随机抽样. ACM 数学软件交易. 11,1,37–57 页。
-
Gama,J.,Medas,P.,Castillo,G.,和 Rodrigues,P. (2004). 具有漂移检测的学习. 在第 17 届巴西人工智能研讨会论文集,SBIA。286–295 页。
-
Gama,J.,Sebastiao,R.,和 Rodrigues,P. (2013)。评估流学习算法. 机器学习 90,3,317–346 页。
-
Domingos,P. 和 Hulten,G. (2000). 挖掘高速数据流. 在第 6 届 ACM SIGKDD 国际知识发现和数据挖掘会议论文集,KDD。71–80 页。
-
Oza,N. (2001). 在线集成学习. 博士学位论文,加州大学伯克利分校。
-
Gama,J.,Žliobaitė,I.,Bifet,A.,Pechenizkiy,M.,Bouchachia,A. (2014). 概念漂移适应综述. ACM 计算调查* 46(4),文章编号 44。
-
Farnstrom,F.,Lewis,J.,和 Elkan,C. (2000). 聚类算法的可扩展性回顾. SIGKDD 探索,51–57 页。
-
Zhang,T.,Ramakrishnan,R.,和 Livny,M. (1996). BIRCH:用于非常大数据库的高效数据聚类方法. 在 ACM SIGMOD 国际数据管理会议论文集。ACM 出版社,103–114 页。
-
Aggarwal,C. (2003). 诊断演变数据流中的变化框架. 在 ACM SIGMOD 会议论文集。575–586 页。
-
陈,Y. 和 Tu,L. (2007). 基于密度的实时流数据聚类. 在 KDD '07: 第 13 届 ACM SIGKDD 国际知识发现和数据挖掘会议论文集。ACM 出版社,133–142 页。
-
Kremer,H.,Kranen,P.,Jansen,T.,Seidl,T.,Bifet,A.,Holmes,G.,和 Pfahringer,B. (2011)。用于演变数据流聚类的有效评估度量. 在第 17 届 ACM SIGKDD 国际知识发现和数据挖掘会议论文集,KDD '11。ACM,纽约,纽约,美国,868–876 页。
-
Mahdiraji,A. R. (2009). 数据流聚类:算法综述. 国际基于知识和智能工程系统杂志,39–44 页。
-
F. Angiulli 和 F. Fassetti (2007). 在数据流中检测基于距离的异常值. 在第 16 届 ACM 信息与知识管理会议论文集,CIKM '07,第 811–820 页,纽约,纽约,美国,2007 年。ACM。
-
D. Yang,E. A. Rundensteiner,和 M. O. Ward (2009). 在流数据窗口上的基于邻居的模式检测. 在第 12 届国际扩展数据库技术会议论文集,EDBT '09,第 529–540 页,纽约,纽约,美国,2009 年。ACM。
-
M. Kontaki, A. Gounaris, A. Papadopoulos, K. Tsichlas, 和 Y. Manolopoulos (2011). 基于距离的异常值在数据流中的连续监控. 在数据工程(ICDE),2011 年第 27 届国际会议,第 135–146 页,2011 年 4 月。
第六章. 概率图建模
概率图模型(PGMs),也称为图模型,捕捉不同变量之间的关系并表示概率分布。PGMs 捕捉联合概率分布,可用于回答不同查询并做出推断,使我们能够对未见数据做出预测。PGMs 具有捕捉专家领域知识和变量之间的因果关系以建模系统的巨大优势。PGMs 表示结构,并且可以在一个表示框架中捕捉知识,使其更容易共享和理解领域和模型。PGMs 很好地捕捉了不确定性或概率性质,因此在需要评分或基于不确定性的方法的应用中非常有用。PGMs 被广泛应用于各种使用机器学习的应用中,如语言处理、文本挖掘和信息提取、计算机视觉、疾病诊断和 DNA 结构预测等领域。
朱迪亚·佩尔是 PGMs 领域的先驱,也是第一个引入贝叶斯网络主题的人(参考文献 [2] 和 [7])。尽管涵盖 PGMs 的所有知识超出了本章的范围,但我们的目标是详细阐述 PGMs 最重要的方面——贝叶斯网络和有向 PGMs。我们将把主题分为表示、推理和学习三个领域,并将在每个领域讨论具体的算法和子主题。我们将涵盖马尔可夫网络和无向 PGMs,总结与 PGMs 的一些异同,并探讨相关领域,如推理和学习。最后,我们将讨论专门的网络,如树增强网络(TAN)、马尔可夫链和隐马尔可夫模型(HMM)。对于该主题的深入探讨,请参阅 Koller 和 Friedman 的概率图模型(参考文献 [1])。
概率回顾
概率论中的许多基本概念在附录 B 概率中进行了详细阐述。概率论中的某些关键思想构成了概率图模型的基础。对相关理论的良好掌握有助于极大地理解 PGMs 及其如何从数据中做出推断。
概率论中的概念
在本节中,我们将讨论与概率论相关的重要概念,这些概念将在本章后面的讨论中使用。
条件概率
给定两个相关事件 a 和ß的条件概率的本质,在于捕捉当我们知道另一个事件已经发生时,如何为其中一个事件分配一个值。条件概率或条件分布用P(a | ß)表示,即事件ß发生时事件a发生的概率(等价于ß为真时),其形式定义如下:
P(a n ß)捕捉了同时发生 a 和ß的事件。
链式法则和贝叶斯定理
条件概率的定义导致了条件概率的链式法则,该法则指出,当存在多个事件α[1],α[2]….α[n]时:
P(α[1] ∩ α[2] ∩….∩ α[n] ) = P(α[1] )P(α[2] ¦ α[1])P(α[3] | α[1] ∩ α[2])..P(α[∩] |α[1] ∩ α[2] ∩….∩ α[n-1])
几个事件的概率可以表示为第一个事件的概率乘以在第一个事件给定的第二个事件的概率,依此类推。因此,α[n]的概率取决于α[1]到α[n]的所有事件,并且与事件的顺序无关。
贝叶斯法则也遵循条件概率规则,可以正式表示为:
随机变量、联合分布和边缘分布
通过将事件空间和结果视为属性和值,自然地映射事件空间和结果。随机变量被定义为具有不同已知特定值的属性。例如,如果成绩是与学生相关联的属性,并且具有值{A, B, C},那么P(Grade = A)表示一个具有结果的随机变量。
随机变量通常用大写字母表示,如X,Y,和Z,它们所取的值用Val(X) = x表示。在本章中,我们将主要讨论本质上为分类的值,即取固定数量的离散值。在现实世界中,变量也可以有连续的表示。具有类别{x¹, x² …x^n}的变量的分布可以表示为:
这样一个跨越许多类别的分布称为多项分布。在只有两个类别的特殊情况下,该分布被称为伯努利分布。
给定一个随机变量,该变量描述的所有事件的概率分布称为边缘分布。例如,如果成绩是随机变量,边缘分布可以定义为(Grade = A) = 0.25, P(Grade = b) = 0.37 和 P(Grade = C) = 0.38。
在许多现实世界的模型中,存在多个随机变量,考虑所有这些随机变量的分布称为联合分布。例如,如果将学生的智力视为另一个变量,并用P(Intelligence)或P(I)表示,并且具有二进制结果{低,高},那么考虑智力和成绩的分布,表示为P(Intelligence, Grade)或P(I, G),就是联合分布。
一个随机变量的边缘分布可以通过对所有其他变量的值求和从联合分布中计算得出。通过将所有行求和,如 表 1 所示,可以得到成绩的边缘分布,通过将列求和可以得到智力的边缘分布。
表 1. I 和 G 的边缘分布
边缘独立性和条件独立性
边缘独立性定义为以下内容。考虑两个随机变量 X 和 Y;那么 P(X|Y) = P(X) 意味着随机变量 X 与 Y 独立。它形式上表示为 (P 满足 X 与 Y 独立)。
这意味着联合分布可以表示为:
P(X, Y) = P(X)P(Y)
如果考试的难度水平 (D) 和学生的智力 (I) 决定了成绩 (G),我们知道考试的难度水平与学生的智力独立,并且 (D ⊥ I) 也意味着 P(D, I) = P(D)P(I)。
当两个随机变量在第三个变量给定的情况下是独立的,这种独立性称为条件独立性。给定三个随机变量 X,Y 和 Z 的集合,我们可以说 ;也就是说,变量 X 在给定 Z 的情况下与 Y 独立。条件独立的必要条件是
因素
因素是定义高维(大量变量)空间中概率分布的基本构建块。它们提供了基本操作,有助于操作概率分布。
“因素”被定义为一种函数,它接受称为“作用域”的随机变量作为输入,并给出一个实值输出。
形式上,一个因素表示为 其中作用域是 (X[1], X[2], ….X[k] )。
因素类型
不同的因素类型如下:
-
联合分布: 对于变量的每一个组合,你都会得到一个实值输出。
-
未归一化度量: 当在一个联合分布中,其中一个变量是常数时,输出也是实值,但由于它不总和为 1,因此它是未归一化的。然而,它仍然是一个因素。
-
条件概率分布: 形式为 P(G|I) 的概率分布也是一个因素。
在因素上执行各种操作,例如:
-
因素乘积: 如果两个因素 ϕ[1] (X[1], X[2]) 和 ϕ[2] (X[2], X[3]) 相乘,它会产生 ϕ[3] (X[1], X[2], X[3])。实际上,这是将对应于 ϕ[1] 的表与 ϕ[2] 相乘。
-
因素边缘化: 这与边缘化相同,其中 ϕ[1] (X[1], X[2], X[3]) 可以对变量进行边缘化,例如 X[2],以给出 ϕ[2] (X[1], X[3])。
-
因子减少:这只在其他变量中的一个变量为常数时取其他变量的值。
分布查询
给定随机变量的概率,可以执行许多查询来回答某些问题。一些常见的查询类型将在后续章节中解释。
概率查询
这是最常见的查询类型之一,它有两个部分:
-
证据:具有已知结果或类别的变量子集。例如,随机变量 E = e。
-
查询:来自其他变量的随机变量。例如,一个随机变量 X。
P(X|E = e)
概率查询的例子包括后验边缘估计,如 P(I = high|L = bad, S = low) = ? 和证据概率,如 P(L = bad, S = low) = ?。
MAP 查询和边缘 MAP 查询
MAP 查询用于找到最可能变量的子集的概率赋值,因此也被称为最可能解释(MPE)。这些与概率查询的区别在于,我们不是得到概率,而是得到所有变量的最可能值。
从形式上讲,如果我们有变量 W= X – E,其中 E = e 作为证据,并且我们感兴趣于找到 W 中变量的最可能赋值,
MAP(W|e) = argmax[w]P(w,e)
边缘查询的一种更普遍的形式是当我们有一个变量的子集,比如说由 Y 给出,形成我们的查询,并且有证据 E = e,我们感兴趣于找到 Y 中变量的最可能赋值。使用 MAP 定义,我们得到:
MAP(Y|e) = argmax[y]P(y|e)
假设,Z= X – Y – E,那么边缘 MAP 查询是:
图概念
接下来,我们将简要回顾图论中的概念以及我们将在本章中使用的某些定义。
图结构和属性
图被定义为包含节点和连接这些节点的边的数据结构。在本章的上下文中,随机变量被表示为节点,边显示了随机变量之间的连接。
形式上,如果 X = {X[1], X[2],….X[k]} 其中 X[1], X[2],….X[k] 是代表节点的随机变量,那么集合 e 中可以存在一个有向边,例如,在由 给出的节点之间,或者存在一个 无向边
,并且图被定义为一种数据结构
。当集合 e 中节点从集合 X 之间的每一条边都是有向的时,称图为一个 有向图;同样,如果节点之间的每一条边都是无向的,则称该图为 无向图,如图 1 所示。此外,如果一个图既有有向边又有无向边,
的表示法代表一个可能是有向或无向的边。
图 1. 有向、无向和部分有向图
如果图中存在一个有向边 ,则节点 X[i] 被称为 父节点,而节点 X[j] 被称为 子节点。
在无向图的情况下,如果存在边 X[i] – X[j],则节点 X[i] 和 X[j] 被称为相邻节点。
在有向图中,节点 X 的父节点集合被称为节点 X 的边界,同样地,在无向图中,相邻节点形成彼此的边界。节点 X 的度是它参与的边的数量。节点 X 的入度是在有向图中与节点 X 有关系的边的数量,这些边位于节点 Y 和节点 X 之间,且 X → Y。图的度是该图中节点的最大度。
子图和团
子图是表示整个集合中的一些节点的图的一部分。团是无向图中顶点的子集,其中每两个不同的顶点都是相邻的。
路径、迹和环
如果图中 K = (X, E) 存在变量 X[1],X[2],…,X[k],那么当对于每一个 i = 1, 2 ... k – 1,我们都有 或 X[i] –X[j];也就是说,变量之间存在有向边或无向边——记住这可以表示为 X[i] ? X[j]。一个有向路径至少有一个有向边:
。
如果图中 K = (X, E) 存在变量 X[1],X[2],…,X[k],那么当对于每一个 i = 1, 2 ... k – 1,我们都有 。
如果对于图中的每一个 X[i],…,X[j],都存在一条从 X[i] 到 X[j] 的路径,则称该图为 连通图。
在图 K = (X, e) 中,如果节点 X 和 Y 之间存在有向路径,则 X 被称为 Y 的 祖先,而 Y 被称为 X 的 后代。
如果图K有一个有向路径 X[1],X[2],……,X[k],其中 X[1] ? X[k],则该路径称为循环。相反,没有循环的图称为无环图。
贝叶斯网络
通常,所有概率图模型都有三个基本元素,构成了重要的部分:
-
表示:这回答了模型意味着什么或代表什么的问题。想法是如何表示和存储P(X[1],X[2],……,X[n])的概率分布。
-
推理:这回答了以下问题:给定模型,我们如何进行查询并获得答案。这使我们能够从已知证据中推断未知值的值,前提是模型的结构。推动主要讨论点的动机是涉及计算和正确性之间权衡的各种推理形式。
-
学习:这回答了给定数据的情况下哪个模型是正确的问题。学习分为两个主要部分:
-
在给定结构和数据的情况下学习参数
-
在给定数据的情况下学习结构
-
我们将使用众所周知的学生网络作为贝叶斯网络的例子,在我们的讨论中说明概念和理论。学生网络有五个随机变量,捕捉了以下定义的各种属性之间的关系:
-
考试难度(D)
-
学生智力(I)
-
学生获得的分数(G)
-
学生的 SAT 分数(S)
-
基于成绩的学生推荐信(L)
这些属性中的每一个都具有二进制分类值,例如,变量难度(D)有两个类别(d0,d1),分别对应低和高。成绩(G)有三个分类值,对应于成绩(A,B,C)。图中所示箭头表示从领域知识中编码的依赖关系——例如,如果我们知道考试的难度和学生智力,则可以确定成绩;如果我们只知道成绩,则推荐信完全确定(图 2)。可以进一步观察到,变量之间没有显式边表示它们相互独立——例如,考试的难度和学生的智力是独立变量。
图 2. “学生”网络
表示
图形紧凑地表示随机变量之间的复杂关系,允许快速算法进行查询,而完整枚举将是不可行的。在本节定义的概念中,我们展示了如何通过有向无环图结构和条件独立性使涉及大量变量的问题变得可处理。
定义
贝叶斯网络定义为具有以下特征的系统模型:
-
一系列随机变量
-
一个有向的无环图(DAG),节点表示随机变量。
-
每个节点的一个局部条件概率分布(CPD),与父节点相关联 P(X[i] | parent(X[i]))。
-
使用分布的链式规则获得的联合概率分布是一个因素,表示为:
-
对于定义的学生网络,捕获所有节点的联合分布可以表示为:
P(D,I,G,S,L)=P(D)P(I)P(G¦D,I)P(S¦I)P(L¦G)
推理模式
贝叶斯网络有助于回答在给定一些数据和事实的情况下提出的各种查询,这里讨论了这些推理模式。
因果或预测推理
如果证据是例如“低智商”,那么在图 3右上象限中显示的获得“好信”的机会有多大?这是通过因果推理来解决的。如图一象限所示,因果推理是从上到下流动的。
证据或诊断推理
如果给出诸如“坏信”之类的证据,学生获得“好成绩”的机会有多大?这个问题,如图 3 左上象限所示,是通过证据推理来解决的。如图二象限所示,证据推理是从下到上流动的。
互因果推理
从寻找“相关原因”中获取有趣的模式是互因果推理的目标。如果给出“C 级”和“高智商”的证据,那么课程难度为“高”的机会有多大?这种推理也称为“解释”,因为一个原因解释了另一个原因,这在图 3 的第三象限左下角得到了说明。
组合推理
如果一个学生选修了一门“容易”的课程并且有“坏信”,他获得“C 级”成绩的机会有多大?这是通过具有组合推理模式的查询来解释的。请注意,它包含混合信息,并且不像其他推理模式那样在一个固定的方向上流动,如图中右下角的象限 4 所示:
图 3. 推理模式
独立性、影响流、D-分离、I-图
节点之间的条件独立性可以在执行查询时用于减少计算。在本节中,我们将讨论与独立性相关的一些重要概念。
影响流
影响是指一个变量的条件或结果如何改变与另一个变量相关的值或信念的影响。我们从影响从直接关系(父/子)、因果/证据(父和子以及中间变量)以及组合结构中的变量流动的推理模式中看到了这一点。
唯一没有影响流动的情况是存在一个“v-结构”。也就是说,给定三个变量之间的边,存在一个 v-结构,并且X[i - 1]和X[i + 1]之间没有影响流动。例如,课程难度和学生的智力之间没有影响流动。
D-Separation
随机变量X和Y在图G中被说成是 d-separated 的,前提是在G中给定Z的情况下,X和Y之间没有活跃路径。它正式表示为:
dsep[G] (X,Y|Z)
d-separation 的意义在于它完美地映射到点之间的条件独立性。这给出一个有趣的性质,即在贝叶斯网络中,任何变量在给定节点的父节点的情况下与其非后裔变量是独立的。
在学生网络示例中,节点/变量 Letter 在给定成绩的情况下与 Difficulty、Intelligence 和 SAT 是 d-separated 的。
I-Map
从 d-separation 来看,在图G中,我们可以收集所有 d-separation 产生的独立性,这些独立性正式表示为:
如果P满足I(G),那么我们说G是P的一个独立性映射或 I-Map。
I-Map 的主要观点是,可以形式化地证明因式分解关系与独立性之间的关系成立。反之也可以证明。
简而言之,一个人可以读取贝叶斯网络图 G,所有在分布 P 中成立的独立性,无论任何参数!
考虑学生网络——其整个分布可以表示为:
P(D,I,G,S,L) = P(D)P(I|D)P(G¦D,I)P(S¦D,I,G)P(L¦D,I,G,S)
现在,考虑 I-Map 的独立性:
-
变量I和D是非后裔变量,并且不依赖于父节点,所以P(I|D) = P(I)
-
变量S在给定其父节点I的情况下与其非后裔变量D和G是独立的。P(S¦D,I,G)=P(S|I)
-
变量L在给定其父节点G的情况下与其非后裔变量D、I和S是独立的。P(L¦D,I,G,S)=P(L|G)
(D,I,G,S,L)=P(D)P(I)P(G¦D,I)P(S¦I)P(L¦G)
因此,我们已经证明 I-Map 仅通过图网络就能帮助进行因式分解!
推理
概率图模型最大的优点是它们能够以条件或 MAP 或边际 MAP 的形式回答概率查询,给定一些证据。
正式地,证据E = e的概率由以下公式给出:
但这个问题已被证明是 NP-Hard(参考 [3])或更具体地说,#P-complete。这意味着当存在大量树或变量时,它是不可行的。即使对于树宽(最大团中的变量数)为 25,这个问题似乎也是不可行的——大多数现实世界的模型具有比这更大的树宽。
因此,如果之前讨论的精确推理是不可行的,是否可以使用一些近似来使问题在一定的误差范围内可行?已经证明,即使是一个计算推理的近似算法,其误差 ? < 0.5,这样我们找到一个数 p,使得 |P(E = e) – p|< ?,也是 NP-Hard。
但好消息是,这是“最坏情况”结果之一,表明指数时间复杂度。在“一般情况”中,可以应用启发式方法来减少精确和近似算法的计算时间。
一些执行精确和近似推理的知名技术如图 4 所示,它涵盖了除了贝叶斯网络之外的大多数概率图模型。
图 4. 精确和近似推理技术
讨论这些算法的细节超出了本章的范围。我们将详细解释一些算法,并附上参考文献,以便读者更好地理解。
基于消除的推理
在这里,我们将描述两种技术,即变量消除算法和团树或连接树算法。
变量消除算法
变量消除(VE)算法的基本原理在于分配性质,如下所示:
(ab+ac+ad)= a (b+c+d)
换句话说,通过提取一个公共因子 a,五个算术运算(三个乘法和两个加法)可以减少到四个算术运算(一个乘法和三个加法)。
让我们通过在学生网络中举一个简单的例子来理解计算的简化。如果我们必须计算一个概率查询,例如,考试难度给定信件是好的,即 P(D¦L=good)=?。
使用贝叶斯定理:
要计算 P(D¦L=good)=?,我们可以使用链式法则和联合概率:
如果我们重新排列右侧的项:
如果我们现在用 替换,因为该因子与 S 条件下的变量 I 独立,我们得到:
因此,如果我们小心地一次消除一个变量,我们实际上已经将 O(2^n) 个因子转换为 O(nk²) 个因子,其中 n 是变量的数量,k 是每个观察值的数量。
因此,VE 算法的主要思想是对变量施加一个顺序,使得查询变量最后。在有序变量列表上维护一个因子列表,并执行求和。通常,我们在 VE 算法的实现中使用动态规划(参考文献 [4])。
输入和输出
输入:
-
条件概率分布/表 F 列表
-
查询变量 Q 的列表
-
观察变量 E 和观察值 e 的列表
输出:
- P(Q|E = e)
如何工作?
算法在循环中调用 eliminate
函数,如下所示:
VariableElimination:
-
当 ?,贝叶斯网络中所有随机变量的集合不为空时
-
从 ? 中移除第一个变量 Z
-
消除(F, Z)
-
-
结束循环。
-
将 ? 设置为 F 中所有因子的乘积
-
在 ? 中实例化观察变量到它们的观察值。
-
返回
(归一化)
消除 (F, Z)
-
从 F 中移除所有涉及 Z 的函数,例如,X[1],X[2],…,X[k]。
-
计算新函数
-
计算新函数
-
添加新函数 ? 到 F
-
返回 F
考虑具有 P(D, L = good) 作为目标的相同学生网络示例。
-
选择一个变量排序列表:S,I,L,G,和 D
-
初始化活动因子列表并引入证据:
列表:P(S¦I)P(I)P(D)P(G¦I,D)P(L¦G)d(L = good)
-
从列表中消除变量 SAT 或 S
列表:P(I)P(D)P(G¦I,D)P(L¦G)d(L = good) ?1 (I)
-
消除变量 Intelligence 或 I
列表:P(D)P(L¦G)d(L = good) ?2 (G,D)
-
消除变量 Letter 或 L
列表:P(D) ?[3] (G) ?[2] (G,D)
-
消除变量 Grade 或 G
列表:P(D) ?[4] (D)
因此,通过两个值,P(D=high) ?[4] (D=high) 和 P(D=low) ?[4] (D=low),我们得到答案。
优势和局限性
优势和局限性如下:
-
VE 算法的主要优势是其简单性和通用性,可以应用于许多网络。
-
当网络中有许多连接时,VE 的计算减少优势似乎消失了。
-
变量最优排序的选择对计算效益非常重要。
团树或桥接树算法
桥接树或团树是变量消除技术的更有效形式。
输入和输出
输入:
-
条件概率分布/表 F 的列表
-
查询变量 Q 的列表
-
观察变量 E 和观察值 e 的列表
输出:
- P(Q|E = e)
如何工作?
涉及的步骤如下:
-
道德化:这是一个将有向图转换为无向图的过程,以下有两个步骤:
-
用无向边替换节点之间的有向边。
-
如果有两个节点或顶点没有连接但有共同子节点,则添加一个连接它们的边。(注意图 5 中 V[4] 和 V[5] 以及 V[2] 和 V[3] 之间的边):
图 5. DAG 的图道德化,用绿色显示方向边的改变,用红色显示新添加的边。
-
-
三角化:为了理解三角化,必须形成弦。循环的弦是非连续顶点 V[i] 和 V[j] 的一对,它们之间有边。如果一个图称为弦图或三角化图,如果长度 ≥ 4 的每个循环都有弦。注意图 6 中 V[1] 和 V[5] 之间的边形成弦,使道德化图成为弦图/三角化图:
图 6. 图三角化,通过添加蓝色边将道德化图转换为弦图。
-
连接树:通过以下步骤从弦图形成连接树:
- 在图中找到所有完全子图,并将它们作为所有顶点的簇作为节点。完全子图是一个子图,其中每对节点之间都存在边。如果两个节点有一个或多个共同顶点,则创建一个由相交顶点组成的边作为分隔符或 sepset。例如,具有边 V[1]、V[4]、V[5] 和 V[6]、V[4]、V[5] 的循环,其中 V[4]、V[5] 之间存在公共边,可以简化为一个完全子图,如图中所示,公共边作为分隔符。
如果前面的图包含一个循环,循环中的所有分隔符都包含相同的变量。通过创建最小生成树来移除图中的循环,同时包括最大分隔符。整个转换过程如图 7 所示:
图 7. 连接树的形成
-
在连接树上运行消息传递算法:连接树可以用来通过完全子图和分隔符的分解来计算联合分布
-
计算连接树的参数:连接树的参数可以通过使用原始贝叶斯网络中的父节点按节点获得,称为完全子图势,如图所示:
-
(?[1] (V[2],V[3],V[5]) = P(V[5] |V[2],V[3])P(V[3])(注意在原始贝叶斯网络中,边 V[5] 依赖于 V[2]、V[3],而 V[3] 是独立的)
-
-
-
-
-
节点/完全子图在连接树之间的消息传递:连接树中的一个节点,用完全子图 C[i] 表示,将其邻居发送的所有消息与其自己的完全子图势相乘,得到一个因子
,其作用域是连接子图。然后,它对所有变量求和,除了在 C[i] 和 C[j] 之间的分隔符或分隔符 S[i,j] 上的变量,然后将得到的因子作为消息发送到 C[j]。
图 8. 节点/完全子图在连接树之间的消息传递
因此,当消息传递到达树根时,联合概率分布就完成了。
优点和局限性
优点和局限性如下:
-
该算法在树宽相关的计算上有理论上的上限。
-
每个团中每个势的乘积可能导致数值溢出和下溢。
基于传播的技术
在这里,我们讨论信念传播,这是一种常用的消息传递算法,通过引入因子图和在这些图中可以流动的消息来进行推理。
信念传播
信念传播是最实用的推理技术之一,它适用于大多数概率图模型,包括有向、无向、基于链和时序图。为了理解信念传播算法,我们首先需要定义因子图。
因子图
我们从基本的概率论中知道,整个联合分布可以表示为变量子集上的一个因子,如下所示
在 DAG 或贝叶斯网络中,fs 是一个条件分布。因此,在变量子集上表达联合分布相对于因子有很大的优势。
因子图是网络的表示,其中涉及变量的变量和因子都被制成显式节点(参考文献 [11])。在前一节的简化学生网络中,因子图显示在图 9中。
图 9. 简化“学生”网络的因子图
因子图是一个二分图,即它有两种类型的节点,变量和因子。
边在两种相反类型之间流动,即从变量到因子,反之亦然。
将贝叶斯网络转换为因子图是一个简单的步骤,如前所述,其中你开始添加变量节点和条件概率分布作为因子节点。贝叶斯网络和因子图之间的关系是一对多,也就是说,同一个贝叶斯网络可以用多个因子图表示,并且不是唯一的。
因子图中的消息传递
在这些因子图中流动着两种不同的消息,这些消息构成了所有计算的大部分,通过通信实现。
-
从因子节点到变量节点的消息:从因子节点发送到变量节点的消息可以用以下方式数学表示:
其中
因此,
是从因子节点 f[s] 到 x 的消息,以及从 x 的邻居到 x 的所有此类消息的乘积给出了 x 的联合概率:
图 10. 从因子节点到变量节点的消息传递
-
从变量节点到因子节点的消息:与前面的例子类似,变量到因子的消息可以展示为
因此,除了发送给它的因子外,所有到达节点 x[m] 的因子都被相乘。
图 11. 从变量节点到因子节点的消息传递
输入和输出
输入:
-
条件概率分布/表 (CPD/CPT) F 列表
-
查询变量 Q 列表
-
观察变量 E 和观察值 e
输出:
- P(Q|E = e)
它是如何工作的?
-
根据前面讨论的贝叶斯网络创建因子图。
-
将节点 Q 视为图的根。
-
初始化所有叶节点,即:
和
-
以递归方式应用从叶节点到下一个节点的消息传递。
-
移动到下一个节点,直到到达根节点。
-
根节点的边际给出结果。
优点和局限性
优点和局限性如下:
-
如前所述,此算法非常通用,可用于大多数图模型。当没有循环时,此算法在有向树中进行精确推理。
-
这可以很容易地并行实现,有助于可扩展性。根据连通性,内存需求可能非常高。
基于采样的技术
我们将讨论一个使用粒子采样来展示从随机变量生成分布 P(X) 的简单方法。想法是重复从贝叶斯网络中采样,并使用计数样本来近似推理。
带拒绝的前向采样
关键思想是使用拓扑顺序迭代变量生成独立同分布 (i.i.d.) 样本。在存在某些证据的情况下,例如,P(X|E = e) 与生成的样本相矛盾,最简单的方法是拒绝样本并继续。
输入和输出
输入:
-
条件概率分布/表 F 列表
-
查询变量 Q 列表
-
观察变量 E 和观察值 e
输出:
- P(Q|E = e)
它是如何工作的?
-
对于 j = 1 到 m //样本数量
-
创建变量的拓扑顺序,例如 X[1],X[2],… X[n]。
-
对于 i = 1 到 n
-
u[i] ? X(parent(X[i])) //assign parent(X[i]) to variables
-
sample(x[i], P(X[i] | u[i]) //sample X[i] given parent assignments
-
if(x[i] ?, P(X[i] | E = e) reject and go to 1.1.2. //reject sample if it doesn't agree with the evidence.
-
-
将 (X[1],X[2],…X[n]) 作为样本返回。
-
-
使用样本的计数计算 P(Q | E = e)。
为学生网络生成一个样本的例子可以是先采样难度得到低,然后采样智力得到高,接着使用 CPD 表对难度=低和智力=高进行采样得到成绩=A,使用 CPD 对智力=高进行 SAT 采样得到 SAT=好,最后使用成绩=A 从字母中进行采样得到 Letter=好。因此,我们得到第一个样本(难度=低,智力=高,成绩=A,SAT=好,Letter=好)
优点和局限性
优点和局限性如下:
-
这种技术实现和执行起来相当简单。它需要大量的样本来在界限内近似。
-
当证据集很大时,拒绝过程变得成本高昂。
学习
学习背后的思想是在数据和领域专家的指导下生成结构或找到参数或两者兼而有之。
学习的目标如下:
-
为了便于在贝叶斯网络中进行推理。推理的前提是结构和参数已知,这是学习的结果。
-
为了便于使用贝叶斯网络进行预测。给定观察变量X,预测目标变量Y。
-
为了便于使用贝叶斯网络进行知识发现。这意味着从数据中理解因果关系、关系和其他特征。
通常,学习可以通过图 12来表征。假设存在一个已知的概率分布P*,它可能或可能不是由贝叶斯网络*G生成的。观察到的数据样本被假定为从这个已知的概率分布P^中生成或采样。领域专家可能或可能不存在,以包括关于结构的知识或先验信念。贝叶斯网络是少数几种可以直接使用领域专家关于变量关系或先验概率的输入的技术之一,与其他机器学习算法形成对比。在知识获取和学习数据的过程结束时,我们得到一个具有定义结构和参数(CPTs)的贝叶斯网络作为输出。
图 12. 贝叶斯网络学习要素
基于数据质量(缺失数据或完整数据)以及专家对结构的了解(未知和已知),贝叶斯网络中的学习可以分为以下四类,如表 2所示:
数据 | 结构 |
---|---|
已知结构(学习参数) | 未知结构(学习结构和参数) |
完整数据 | 参数估计(最大似然,贝叶斯估计) |
不完整数据 | 非线性参数优化(期望最大化,梯度下降) |
表 2. 贝叶斯网络学习类别
学习参数
在本节中,我们将讨论两种广泛使用的方法来估计给定结构下的参数。我们只讨论完整数据,读者可以参考(参考文献 [8])中关于不完整数据参数估计的讨论。
贝叶斯网络的极大似然估计
最大 似然估计 (MLE) 是一个非常通用的方法,它可以定义为:给定一个数据集 D,选择满足以下条件的参数 :
极大似然是给定训练数据选择贝叶斯网络参数的技术。对于详细讨论,请参阅(参考文献 [6])。
给定图 G 的已知贝叶斯网络结构和训练数据,我们想要学习参数或 CPDs——更准确地说,CPTs。这可以表示为:
现在每个示例或实例可以用变量来表示。如果有 i 个变量由 x[i] 表示,并且每个变量的父节点由 parent[Xi] 给出,那么:
交换变量和实例:
该术语是:
这是给定其父节点 parent[Xi] 的特定变量 x [i] 的条件似然。因此,这些条件似然的参数是给出的参数的子集。因此:
这里,被称为局部似然函数。当总似然分解为局部似然的独立项时,这成为似然函数的全局分解属性。其思想是,这些局部似然函数可以通过简单地使用训练数据中不同结果的数量来进一步分解为表格 CPD。
设 N[ijk] 为在父节点配置 j 下观察到的变量或节点 i 在状态 k[,] 中的次数:
例如,我们可以通过从训练数据中估计似然函数来得到一个简单的条目,对应于 X[i] = a 和 父节点[Xi] = b:
考虑两种情况,例如。在第一种情况下, 由 10 个实例满足,其中 父节点[Xi] = b =100。在第二种情况下,当 父节点[Xi] = b =1000 时,
满足 100。注意,这两个概率值相同,而第二个有 10 倍更多的数据,是“更可能的”估计!同样,对领域或先验知识的熟悉程度,或者由于不确定性而缺乏这种知识,都没有被 MLE 所捕捉。因此,当样本数量有限或领域专家了解先验概率时,这种方法会存在严重问题。
贝叶斯网络参数估计
这种技术通过使用参数 ? 的先验知识编码来克服 MLE 的问题。因此,我们可以将我们对参数空间的信念或先验知识编码为概率分布,然后使用变量和参数的联合分布进行估计。
让我们考虑单变量参数学习的情况,其中我们有一些实例 x[1],x[2] … x[M],它们都具有参数 ?[X]。
图 13. 单变量参数学习
因此,该网络是参数和数据上的联合概率模型。其优点是我们可以用它来表示后验分布:
,P(?) = 先验,
因此,最大似然估计与贝叶斯估计之间的区别在于使用了先验概率。
将其推广到给定数据集 D 的贝叶斯网络 G:
如果我们假设参数的全局独立性
因此,我们得到
再次,就像之前一样,?[Xi] | 父节点[Xi] 的子集是局部的,因此整个后验概率可以用局部术语计算!
使用狄利克雷分布的先验和后验
在实践中,通常使用一种称为狄利克雷分布的连续概率分布来表示参数的先验分布——狄利克雷分布是一种贝塔分布。
概率密度函数:
这里,,
中的 alpha 项被称为超参数,a[ijri] > 0。
是伪计数,也称为等效样本量,它为我们提供了一个先验的度量。
贝塔函数,B(a[ij]) 通常用伽马函数表示如下
使用狄利克雷分布的优点在于它本质上是对偶的,也就是说,无论似然函数如何,如果先验是狄利克雷分布,后验也是狄利克雷分布!
可以证明参数 ?[ijk] 的后验分布是一个具有更新超参数的狄利克雷分布,并且有一个封闭形式的解!
a[ijk] = a[ijk] + N[ijk]
如果我们使用最大后验估计和后验均值,它们可以证明如下:
学习结构
在没有任何领域知识或对结构理解的情况下学习贝叶斯网络包括学习结构和参数。我们首先将讨论用于评估网络结构的某些度量,然后讨论一些用于构建最优结构的著名算法。
评估结构的度量
给定数据集,用于评估贝叶斯网络结构的度量可以大致分为以下几类,许多细节可以在这里找到(参考文献 [14])。
-
偏差阈值度量:在网络上测量两个变量之间偏差的两种常用技术是皮尔逊卡方统计量和库尔巴克-莱布勒距离。
给定包含 M 个样本的数据集 D,考虑两个变量 X[i] 和 X[j],皮尔逊卡方统计量测量发散度是
d[?2](D) 为 0;当变量相互独立时,较大的值表示变量之间存在依赖性。
库尔巴克-莱布勒散度是:
d[I](D) 再次为 0,它表示独立性,较大的值表示依赖性。使用各种统计假设检验,可以使用阈值来确定显著性。
-
结构得分度量:在贝叶斯网络中为结构评分有多种度量方法。在这里,我们将讨论最常用的度量方法。参数学习中讨论的对数似然得分可以用作结构的评分:
-
贝叶斯信息得分(BIC)也是一种相当流行的评分技术,因为它通过考虑复杂结构的惩罚来避免过拟合,如下面的方程所示:
惩罚函数在 M 中是对数形式的,因此,随着其增加,对于复杂结构的惩罚会减轻。
阿卡伊克信息得分(AIC),类似于 BIC,具有类似的惩罚基础评分,并且是:
在参数学习中讨论的贝叶斯得分也被用作评分措施。
学习结构的方法
在本节中,我们将讨论一些用于学习结构的算法;详细信息可以在此处找到(参考文献 [15])。
基于约束的技术
基于约束的算法使用各种变量的独立性检验,试图通过遵循此处讨论的逐步过程找到我们在前几节中讨论的不同结构依赖性,例如 d-separation、v-structure 等。
输入和输出
输入是包含所有变量 {X,Y..} 的数据集 D,对于每个实例 {1,2, ... m} 都已知,并且没有缺失值。输出是一个贝叶斯网络图 G,其中所有边、方向在 E 中已知,以及 CPT 表。
如何工作?
-
创建一个空的无向边集合 E。
-
测试两个变量之间的条件独立性,这些变量独立于方向以具有边。
- 如果对于所有子集 S = U – {X, Y},如果 X 与 Y 独立,则将其添加到无向边集合 E*' 中。
-
一旦确定了所有潜在的未定向边,边的方向性将从集合 E*' 中推断出来。
-
考虑三元组 {X, Y, Z},如果存在边 X – Z 和 Y – Z,但使用集合中的所有变量没有 X – Y 的边,并且进一步,如果 X 在所有边 S = U – {X, Y, Z} 给定的情况下与 Y 不独立,这表明
和
的方向。
-
将边
和
添加到 E 中设置。
-
使用局部计算更新 CPT 表。
-
-
返回贝叶斯网络 G、边 E 和 CPT 表。
优点和局限性
-
缺乏鲁棒性是这种方法最大的缺点之一。由于独立性假设会渗透到个体独立性测试中,数据中的小错误可能会对结构造成重大影响。
-
可扩展性和计算时间是主要关注点,因为每个变量的子集都会被测试,大约是 2^n。当变量的数量增加到 100 多时,由于计算时间,这种方法会失败。
搜索和基于分数的技术
搜索和分数方法可以看作是一种启发式优化方法,其中通过迭代,通过小的扰动改变结构,并使用如 BIC 或 MLE 等度量来对结构进行评分,以找到最优的分数和结构。爬山法、深度优先搜索、遗传算法等都被用来进行搜索和评分。
输入和输出
输入是数据集 D,其中每个实例 {1,2, ... m} 的所有变量 {X,Y..} 都是已知的,并且没有缺失值。输出是一个贝叶斯网络图 G,其中 E 中所有边和方向都是已知的。
它是如何工作的?
图 14. 搜索和评分
-
初始化图 G,基于领域知识或空或满。根据图初始化边集 E,并根据图 G、E 和数据 D 初始化 CPT 表 T。通常还会提到一些终止条件,如 maxIterations:
-
maxScore= -8, score=computeScore(G,E, T)
-
执行
-
maxScore=score
-
对于每个变量对 (X, Y)
-
对于每个
-
新图 G' 基于父节点和变量,并改变边。
-
计算新的 CPT 表 T' ? computeCPT(G',E',D)。
-
currentScore = computeScore(G',E',T')
-
如果 currentScore > score:
-
score = currentScore
-
G' = G, E' = E
-
-
-
-
当
时重复 3 次
优点和局限性
-
卡在局部最优解,这是大多数启发式搜索方法的缺点之一,是最大的缺点之一。
-
在启发式搜索中,没有收敛或理论保证,因此寻找终止条件很大程度上是靠猜测。
马尔可夫网络和条件随机场
到目前为止,我们已经涵盖了概率图模型领域的有向无环图,包括表示、推理和学习的各个方面。当图是无向的,它们被称为 马尔可夫网络(MN)或 马尔可夫随机 场(MRF)。在本节中,我们将讨论马尔可夫网络的一些方面,包括表示、推理和学习,就像之前一样。马尔可夫网络或 MRF 在计算机视觉的各个领域都非常流行,如分割、去噪、立体、识别等。有关进一步阅读,请参阅(参考文献 [10])。
表示
尽管马尔可夫网络,像贝叶斯网络一样,有非有向边,但它仍然具有局部交互和分布。我们首先将讨论参数化的概念,这是一种捕捉这些交互的方法,然后讨论 MN 中的独立性。
参数化
在 MN 中,变量之间的亲和力通过以下章节中讨论的三个替代参数化技术来捕捉。
吉布斯参数化
如果概率分布函数被称为吉布斯分布或由吉布斯分布参数化,那么:
Z被称为划分函数,定义为:
注意,变量之间的交互是通过来捕捉的,而不是边缘概率,但它们对联合概率有贡献。参数化马尔可夫网络的因子被称为团势。通过在图中的最大团上选择因子,参数的数量可以大幅减少。
因素图
马尔可夫网络图的图结构在使用吉布斯参数化时,并不能揭示出因素是否涉及最大团或其子集等性质。在贝叶斯网络推理部分的章节中讨论的因素图有一个识别最大团的步骤,因此可以捕捉这些参数化。请参阅 BN 中的因素图部分。
对数线性模型
另一种参数化形式是使用来自统计物理的能量模型表示。
势可以用一组特征来表示,而势表通常由具有与之相关联的权重的特征表示。
如果D是一组变量,是一个因子,那么:
因此,随着能量的增加,概率会降低,反之亦然。中捕捉的对数细胞频率在统计物理中被称为对数线性。联合概率可以表示为:
是在D[i]中的变量上定义的特征函数。
独立性
与贝叶斯网络一样,马尔可夫网络也编码了一组独立性假设,这些假设控制了无向图中的影响流动。
全局
如果一组节点Z将节点集X和Y分开,那么在给定Z的情况下,X中的任何节点到X和Y之间的Y没有活跃路径。图G中的独立性是:
成对马尔可夫
如果两个节点,X和Y,之间没有直接边,那么在给定所有其他节点的情况下,这两个节点是独立的。这种性质是局部独立性,也是最弱的:
马尔可夫毯
在给定其马尔可夫毯的情况下,节点与图中所有其他节点都是独立的,这是马尔可夫网络中的一个重要概念:
这里 U = X 的马尔可夫毯。
图 15显示了变量X的马尔可夫毯,包括其父节点、子节点及其子节点的父节点:
图 15. 节点 X 的马尔可夫毯 - 其父节点、子节点及其子节点的父节点。
推理
在 MN 中进行推理是一个类似的#P 完全问题,因此应用了类似的近似或启发式方法。大多数精确和近似推理技术,如变量消除法、交联树法、信念传播法等,这些在贝叶斯网络中讨论过,可以直接应用于马尔可夫网络。边缘和条件概率保持相似,并且是在团上的势函数上计算的
马尔可夫毯简化了一些计算。
学习
由于马尔可夫网络中分区函数中所有参数的纠缠,学习马尔可夫网络中的参数复杂且计算成本高。由于分区函数需要网络中所有变量的因子耦合,因此无法将计算分解为局部分布的优势步骤。
在 MN 中进行最大似然估计没有封闭形式的解,因此使用梯度下降等增量技术来在整个参数空间上进行优化。优化函数可以证明是一个凹函数,从而确保全局最优,但梯度下降的每一步迭代都需要在整个网络上进行推理,这使得它计算成本高,有时甚至难以处理。
贝叶斯参数估计需要对参数空间进行积分,这同样没有封闭形式的解,甚至更困难。因此,对于 MN,通常使用近似学习方法,如马尔可夫链蒙特卡洛(MCMC)。
在 MN 中进行结构学习与参数学习相似,甚至更难,并且已被证明是 NP 难问题。在基于约束的方法中,对于给定的数据集,测试变量之间的条件独立性。在 MN 中,使用成对变量之间的互信息来测试每对变量之间的条件独立性。然后,基于一个阈值,可以认为成对之间存在边或者不存在。这种方法的缺点之一是需要极大量的样本来反驳数据中存在的任何噪声。由于成对边的出现导致的网络复杂性是另一个限制。
在基于搜索和评分的学习中,目标与 BNs 相似,其中搜索结构,评分(基于各种技术)被计算以帮助和调整搜索。在 MNs 的情况下,我们使用对数线性模型中描述的特征,而不是势函数。在优化和评分过程中考虑了特征的加权。
条件随机字段
条件 随机字段 (CRFs) 是一种特殊的马尔可夫网络形式,其中隐藏的和可观察的变量主要用于建模标记序列预测问题 (参考文献 [16])。序列预测问题在许多文本挖掘领域都有体现,如下一个词/字母预测、词性(POS) 标注等,以及在生物信息学领域用于 DNA 或蛋白质序列预测。
CRFs 背后的思想是将序列的条件分布建模为特征函数,并使用标记数据通过优化学习经验分布,如图所示。
条件分布如下所示,其中 Z(x) 是归一化常数。对于 ? 的参数估计使用最大似然法,通常是通过梯度下降等迭代优化方法获得的对数线性凸函数。
图 16:条件随机字段映射到词性标注领域的序列预测区域。
专用网络
在本节中,我们将介绍一些在机器学习应用中非常有用的基本专用概率图模型。
树增强网络
在第二章《实际应用中的监督学习》中,我们讨论了朴素贝叶斯网络,它简化地假设所有变量相互独立,并且只依赖于目标或类别变量。这是从数据集中推导或假设的最简单的贝叶斯网络。正如我们在前面的章节中看到的,在贝叶斯网络中学习复杂结构和参数可能很困难,有时甚至是不可能的。树增强网络或TAN (参考文献 [9]) 可以被视为一种折中方案,它引入了对树如何连接的约束。TAN 对特征或变量关系施加约束。一个特征除了目标变量外,只能有一个其他特征作为父节点,如图所示:
图 17:树增强网络与朴素贝叶斯和贝叶斯网络的比较,以及每个节点只有一个父节点的约束。
输入和输出
输入是包含所有特征的变量 {X, Y..} 的训练数据集 D。如果不需要在预处理步骤中将特征离散化,则特征具有离散结果。
输出是作为贝叶斯网络带有 CPTs 的 TAN。
它是如何工作的?
-
计算训练数据集中每对变量之间的互信息。
-
构建一个无向图,每个节点是变量,边是它们之间的互信息。
-
创建一个最大加权生成树。
-
通过选择结果或目标变量作为根,并使所有边向外流动,将生成树转换为有向图。
-
如果类变量与其他特征之间没有有向边,则添加它。
-
根据先前构建的 DAG 或 TAN 计算 CPTs。
优点和局限性
- 它在许多实际模型中比朴素贝叶斯更准确。它比完整的贝叶斯网络更简单,构建和计算速度更快。
马尔可夫链
马尔可夫链是专门的概率图模型,包含有向图和循环。马尔可夫链可以看作是自动机的扩展,其中权重是转移的概率。马尔可夫链用于建模直接可观察的时间或序列变化。参见(参考文献 [12])以获取进一步的研究。
图 17 表示马尔可夫链(一阶)和一般定义可以给出一个随机过程,由
节点作为状态,。
表示状态或节点之间转移概率的边。它通常表示为一个矩阵 ,它是一个 N X N 矩阵,其中 N 是节点或状态的数量。
的值捕捉了给定状态 q[k] 到节点 q[l] 的转移概率。矩阵的行之和为 1,
的值。
初始状态概率,p = {p[1],p[2],… p[N]}。
因此,它可以写成三元组 M= (Q, A, p),任何状态的概率只取决于最后的状态(一阶):
联合概率:
图 18. 一阶马尔可夫链
隐马尔可夫模型
在许多现实世界的情况中,我们感兴趣的事件并不是直接可观察的。例如,句子中的单词是可观察的,但生成句子的词性却不是。隐马尔可夫 模型(HMM)帮助我们建模这样的状态,其中存在可观察的事件和隐藏的状态(参考文献 [13])。HMM 在语音识别、语言建模、时间序列分析和生物信息学应用(如 DNA/蛋白质序列预测)等建模应用中被广泛使用,仅举几例。
图 19. 显示隐藏变量和可观察变量的隐马尔可夫模型。
隐马尔可夫模型可以再次定义为三元组 ,其中:
-
是一组观察到的有限状态或符号
。
-
Q 是一组未观察到的有限状态
。
-
T 是参数。
状态转移矩阵,给出为 ,捕捉从状态 q[k] 到 q[l] 的转移概率。
发射概率捕捉隐藏状态和观察状态之间的关系,给出为 和 b ? ?.
。
初始状态分布 p = {p[1], p[2], … p[N]}。
因此,HMM 中由一系列隐藏状态 Q = {q[1], q[2], … q[L]} 组成的路径是一个一阶马尔可夫链 M= (Q, A, p)。这条路径在 HMM 中发出一系列符号,x[1], x[2], x[L],称为观察值。因此,知道观察值和隐藏状态,联合概率是:
在现实世界中,我们只知道观察值 x 而不知道隐藏状态 q。HMM 帮助我们回答以下问题:
-
什么是最可能生成观察值 x 的路径?
-
x 的概率是多少?
-
在给定观察值的情况下,处于状态 qi = k 的概率是多少?
HMM 中的最可能路径
假设观察值 x = x[1], x[2], x[L],我们想要找到生成观察值的路径 。这可以表示为:
路径 q* 不一定是唯一的,但在计算和解释时,通常假设路径是唯一的。在一种简单的方法中,我们可以计算 q 的所有可能的长度为 L 的路径,并选择概率最高的路径(或路径),这会导致指数级的计算或速度。更有效的方法是使用维特比算法,它利用动态规划和递归的概念。它基于将方程分解为更简单项的简单原则:
这里, 和
给定初始条件
并使用动态规划以及路径指针,我们可以有效地计算出答案。
HMM 中的后验解码
给定观察值 x,处于状态 q[i] = k 的概率可以用贝叶斯定理表示为:
分子可以重写为:
其中 被称为前向变量,而
被称为后向变量。
前向变量的计算类似于 Viterbi 算法,使用动态规划和递归,其中进行的是求和:
观察 x 的概率可以是
前向变量是联合概率,后向变量是条件概率:
它被称为后向变量,因为动态规划表是从 L^(th) 列开始向后填充到第一列。后向概率也可以用来计算观察 x 的概率,如下所示:
工具和用法
在本节中,我们将介绍两个在 Java 中非常流行的用于概率图建模的工具。
OpenMarkov
OpenMarkov 是一个基于 Java 的 PGM 工具,以下是来自 www.openmarkov.org 的描述:
注意
OpenMarkov 是由西班牙马德里 UNED 的智能决策支持系统研究中心开发的用于概率图形模型(PGMs)的软件工具。
它被设计用于:编辑和评估多种类型的 PGM,如贝叶斯网络、影响图、分解马尔可夫模型等,交互式地从数据中学习贝叶斯网络,以及成本效益分析。
OpenMarkov 在从数据中进行交互式和自动学习方面表现非常出色。它具有预处理数据(使用频率和值进行离散化)以及使用一些搜索算法(如基于搜索的爬山法和基于得分的 PC)进行结构和参数学习的能力。OpenMarkov 以名为 pgmx 的格式存储模型。为了将模型应用于大多数传统软件包,可能需要将 pgmx 模型转换为 XMLBIF 格式。各种开源工具提供了这些转换。
在这里,我们有一些截图说明了如何使用 OpenMarkov 从数据中学习结构和参数。
在 图 20 中,我们看到交互式学习的屏幕,在这里你可以选择要使用的数据文件和算法:
图 20. OpenMarkov GUI – 交互式学习,算法选择
下一个步骤是 预处理 选项卡(图 21),在这里我们可以选择如何进行离散化:
图 21. OpenMarkov GUI – 预处理屏幕
最后,在 图 22 中,我们看到学习到的贝叶斯网络结构的显示:
图 22. OpenMarkov GUI – 结构输出
Weka 贝叶斯网络 GUI
与 OpenMarkov 相比,Weka 的贝叶斯网络编辑器在交互式和自动学习方面提供了大量贝叶斯网络表示、推理和学习选项。使用 Weka 的优势在于它提供了一系列高度集成的预处理和转换过滤器、算法、评估和实验指标。
在图 23中,我们看到贝叶斯网络编辑器,在这里可以选择搜索算法并配置各种选项:
图 23. WEKA 贝叶斯网络 – 配置搜索算法
贝叶斯网络(BayesNet)学习到的结构和参数在图 24的输出屏幕中显示:
图 24. WEKA 贝叶斯网络 – 学习到的参数和结构
案例研究
在本节中,我们将使用现实世界的机器学习数据集进行案例研究,以说明贝叶斯网络的一些概念。
我们将使用 UCI 成人数据集,也称为人口普查收入数据集(archive.ics.uci.edu/ml/datasets/Census+Income
)。这个数据集是从美国人口普查局的 1994 年人口普查数据中提取出来的。数据捐赠者是 Ronny Kohavi 和 Barry Becker,当时他们在 Silicon Graphics 工作。数据集包含 48,842 个实例和 14 个属性,属性类型包括分类和连续型。目标类别是二元的。
商业问题
该问题包括根据人口普查数据预测人口成员的收入,具体来说,他们的收入是否超过$50,000。
机器学习映射
这是一个分类问题,这次我们将训练贝叶斯图网络来开发预测模型。我们将使用线性、非线性以及集成算法,正如我们在前几章的实验中所做的那样。
数据采样和转换
在原始数据集中,有 3,620 个示例存在缺失值和六个重复或冲突的实例。在这里,我们只包括没有缺失值的示例。这个没有未知值的集合被分为 30,162 个训练实例和 15,060 个测试实例。
特征分析
特征及其描述在表 3中给出:
特征 | 类型信息 |
---|---|
age | 连续型。 |
workclass | 私营,自营非营利,自营营利,联邦政府,地方政府,州政府,无报酬,从未工作过。 |
fnlwgt | 连续型。 |
education | 学士,部分大学,11 年级,高中毕业,专业学校,学院,职业,9 年级,7-8 年级,12 年级,硕士,1-4 年级,10 年级,博士,5-6 年级,学前班。 |
教育程度 | 连续型。 |
marital-status | 已婚平民配偶,离婚,从未结婚,分居,丧偶,已婚配偶缺席,已婚 AF 配偶。 |
职业 | 技术支持、手工艺维修、其他服务、销售、执行管理、专业特长、搬运工-清洁工、机器操作-检查员、行政-文职、农业-渔业、运输-搬运、私人家庭服务、保护服务、武装部队。 |
关系 | 妻子、亲生子女、丈夫、非家庭、其他亲属、未婚。 |
种族 | 白人、亚洲-太平洋岛民、美洲印第安人-爱斯基摩人、其他、黑人。 |
性别 | 女性、男性。 |
资本收益 | 连续。 |
资本损失 | 连续。 |
每周小时数 | 连续。 |
国籍 | 美国、柬埔寨、英格兰、波多黎各、加拿大、德国、美国海外属地(关岛-美属维尔京群岛等)、印度、日本、希腊、中国南部、古巴、伊朗、洪都拉斯、菲律宾、意大利、波兰、牙买加、越南、墨西哥、葡萄牙、爱尔兰、法国、多米尼加共和国、老挝、厄瓜多尔、台湾、海地、哥伦比亚、匈牙利、危地马拉、尼加拉瓜、苏格兰、泰国、南斯拉夫、萨尔瓦多、特立尼达和多巴哥、秘鲁、香港、荷兰-荷兰。 |
表 3. UCI 成人数据集 – 特征
数据集按标签分割为 24.78%(>50K)到 75.22%(<= 50K)。关键特征的摘要统计在图 25中给出:
图 25. 特征摘要统计
模型、结果和评估
我们将使用不同类型的贝叶斯网络结构和常规线性、非线性以及集成算法对成人数据集进行详细分析。Weka 还提供了一个选项,可以通过菜单项在训练数据集上可视化图模型,如图图 26所示。当领域专家想要理解假设和图模型的结构时,这非常有用。如果领域专家想要更改或修改网络,可以轻松完成并使用贝叶斯网络编辑器保存。
图 26. Weka 探索器 – 可视化菜单
图 27显示了训练好的贝叶斯网络模型的图结构可视化:
图 27:贝叶斯网络学习结构的可视化。
实验中使用的算法是:
-
贝叶斯网络分类器
-
在连续数据上使用默认核估计的朴素贝叶斯
-
在连续数据上使用监督离散化的朴素贝叶斯
-
使用 K2 算法和每个节点三个父节点选择进行搜索分数结构参数学习的树增强网络(TAN)
-
具有搜索和评分的贝叶斯网络
-
使用爬山法和 K2 进行搜索
-
使用简单估计进行评分
-
父母选择从两个增加到三个以说明对指标的影响
-
非贝叶斯算法
-
逻辑回归(默认参数)
-
KNN(IBK 与 10 个邻居)
-
决策树(J48,默认参数)
-
AdaBoostM1(决策树和默认参数)
-
随机森林(默认参数)
表 4 展示了实验中使用的所有学习者的评估指标,包括贝叶斯网络分类器以及非贝叶斯算法:
算法 | TP Rate | FP Rate | Precision | Recall | F-Measure | MCC | ROC Area | PRC Area |
---|---|---|---|---|---|---|---|---|
Naïve Bayes (Kernel Estimator) | 0.831 | 0.391 | 0.821 | 0.831 | 0.822 | 0.494 | 0.891 | 0.906 |
Naïve Bayes (Discretized) | 0.843 | 0.191 | 0.861 | 0.843 | 0.848 | 0.6 | 0.917 | 0.93 |
TAN (K2, 3 Parents, Simple Estimator) | 0.859 | 0.273 | 0.856 | 0.859 | 0.857 | 0.6 | 0.916 | 0.931 |
BayesNet (K2, 3 Parents, Simple Estimator) | 0.863 | 0.283 | 0.858 | 0.863 | 0.86 | 0.605 | 0.934 | 0.919 |
BayesNet (K2, 2 Parents, Simple Estimator) | 0.858 | 0.283 | 0.854 | 0.858 | 0.855 | 0.594 | 0.917 | 0.932 |
BayesNet (Hill Climbing, 3 Parents, Simple Estimator) | 0.862 | 0.293 | 0.857 | 0.862 | 0.859 | 0.602 | 0.918 | 0.933 |
Logistic Regression | 0.851 | 0.332 | 0.844 | 0.851 | 0.845 | 0.561 | 0.903 | 0.917 |
KNN (10) | 0.834 | 0.375 | 0.824 | 0.834 | 0.826 | 0.506 | 0.867 | 0.874 |
Decision Tree (J48) | 0.858 | 0.300 | 0.853 | 0.858 | 0.855 | 0.590 | 0.890 | 0.904 |
AdaBoostM1 | 0.841 | 0.415 | 0.833 | 0.841 | 0.826 | 0.513 | 0.872 | 0.873 |
Random Forest | 0.848 | 0.333 | 0.841 | 0.848 | 0.843 | 0.555 | 0.896 | 0.913 |
表 4. 分类器性能指标
结果分析
使用监督离散化的朴素贝叶斯与核估计相比,表现出相对较好的性能。这为离散化提供了有用的提示,在大多数贝叶斯网络中都需要离散化,它将发挥重要作用。
当贝叶斯网络的复杂性增加时,表中的结果显示出持续改进。例如,使用离散化的朴素贝叶斯假设所有特征都是独立的,TP 率为 84.3,可以有更多父节点的 TAN 算法 TP 率为 85.9,而具有三个父节点的 BN 显示出最佳的 TP 率为 86.2。这清楚地表明,具有一些节点不超过三个父节点的复杂 BN 可以捕捉领域知识并将其编码良好,以预测未见过的测试数据。
使用搜索和得分(使用具有三个父节点的 K2 搜索和贝叶斯得分进行评分)以及简单估计进行估计的贝叶斯网络,在几乎所有的评估指标中表现最佳,如高亮显示的值所示。
贝叶斯网络与 K2 之间的差异非常小——在贝叶斯网络中,结构是通过搜索和 Hill Climbing 的得分来学习的——这表明即使是局部搜索算法也能找到最优解。
具有三个父结构的贝叶斯网络在几乎所有未见测试数据的指标上击败了大多数线性、非线性以及集成方法,如 AdaBoostM1 和随机森林。这表明了 BNs 在不仅能够在包含大量缺失值的小数据集上学习结构和参数,而且在未见数据上预测良好,还能击败其他复杂算法的强大之处。
摘要
PGMs 通过变量之间的关系捕获领域知识,并表示联合概率。它们在广泛的领域中都有应用。
概率将事件映射到 0 到 1 之间的实数值,可以解释为事件发生频率的度量(频率主义观点)或对该事件发生的信念程度(贝叶斯观点)。随机变量、条件概率、贝叶斯定理、链式法则、边缘和条件独立性以及因子的概念构成了理解 PGMs 的基础。MAP 和边缘图查询是询问图中变量和关系的方法。
图的结构及其性质,如路径、迹、环、子图和团,对于理解贝叶斯网络至关重要。表示、推理和学习是网络的核心元素,帮助我们捕获、提取并使用这些方法进行预测。从图的表现形式,我们可以推理影响流,并检测有助于在查询模型时减少计算负载的独立性。交联树、变量消除和信念传播方法同样通过简化步骤使从查询中进行推理更加可行。从贝叶斯网络中学习涉及从数据中生成结构和模型参数。我们讨论了学习参数和结构的方法。
马尔可夫网络(MN),具有无向边,也包含可以使用吉布斯参数化、因子图和对数线性模型等参数化技术捕获的交互作用。MN 中的独立性控制着影响流,就像在贝叶斯网络中一样。推理技术也类似。在 MN 中学习参数和结构是困难的,因此使用了近似方法。专门的网络,如树增强网络(TAN),假设节点之间的独立性,并在某些应用中非常有用。马尔可夫链和隐马尔可夫模型是其他专业网络,它们也在众多领域中找到应用。
介绍了基于 Java 的工具 Open Markov 和 Weka 贝叶斯网络 GUI,用于 PGMs。本章中的案例研究使用了贝叶斯网络从 UCI 成人人口普查数据集中学习,并将其性能与其他(非 PGM)分类器进行了比较。
参考文献
-
Daphne Koller 和 Nir Friedman (2009). 概率图模型. MIT Press. ISBN 0-262-01319-3.
-
T. Verma 和 J. Pearl (1988),在第四届人工智能不确定性研讨会论文集中,蒙大拿,第 352-359 页。因果网络-语义和表达能力。
-
Dagum, P. 和 Luby, M. (1993). 在贝叶斯信念网络中近似概率推理是 NP 难。人工智能 60(1): 141–153。
-
U. Bertele 和 F. Brioschi,非序列动态规划,Academic Press。纽约,1972 年。
-
Shenoy, P. P. 和 G. Shafer (1990). 概率和信念函数传播的公理,在《人工智能中的不确定性》第 4 卷,第 169-198 页,North-Holland,阿姆斯特丹。
-
Bayarri, M.J. 和 DeGroot, M.H. (1989). 选择模型中的信息。概率与贝叶斯统计学,(R. Viertl 编),Plenum Press,纽约。
-
Spiegelhalter 和 Lauritzen (1990)。在有向图形结构上条件概率的顺序更新。《网络》20 卷。第 579-605 页。
-
David Heckerman, Dan Geiger, David M Chickering (1995). 在《机器学习杂志》中。学习贝叶斯网络:知识与统计数据的结合。
-
Friedman, N.,Geiger, D.,& Goldszmidt, M. (1997)。贝叶斯网络分类器。《机器学习》。第 29 卷,第 131–163 页。
-
Isham, V. (1981)。空间点过程和马尔可夫随机场导论。《国际统计评论》。第 49 卷(1):21–43。
-
Frank R. Kschischang, Brendan J. Frey 和 Hans-Andrea Loeliger,因子图和乘积算法,IEEE 信息理论汇刊,第 47 卷,第 498–519 页,2001 年 2 月。
-
Kemeny, J. G. 和 Snell, J. L. 有限马尔可夫链。纽约:Springer-Verlag,1976 年。
-
Baum, L. E. 和 Petrie, T. (1966)。有限状态马尔可夫链的概率函数的统计推断。《数学统计年鉴》。第 37 卷(6):1554–1563。
-
Gelman, A., Hwang, J. 和 Vehtar, A. (2004). 理解贝叶斯模型的预测信息准则。统计学与计算杂志 24: 997。doi:10.1007/s11222-013-9416-2
-
Dimitris. Margaritis (2003)。从数据中学习贝叶斯网络模型结构。卡内基梅隆大学博士论文。
-
John Lafferty, Andrew McCallum, Fernando C.N. Pereira (2001)。条件随机字段:用于序列数据分割和标记的概率模型,国际机器学习会议 2001(ICML 2001),第 282-289 页。
第七章:深度学习
在《实际应用中的监督学习》的第二章中,我们讨论了不同的一般监督分类技术,这些技术可以广泛应用于各种应用。在监督非线性技术的领域,特别是在计算机视觉中,深度学习及其变体正产生显著影响。我们发现深度学习及其相关方法可以应用于图像识别、图像和对象标注、电影描述,甚至包括文本分类、语言建模、翻译等领域。(参考文献 [1, 2, 3, 4, 和 5])
为了为深度学习做准备,我们将首先描述神经元是什么以及它们如何被排列来构建多层神经网络,展示这些网络的核心元素,并解释它们的工作原理。然后,我们将讨论与神经网络相关的问题和挑战,这些挑战导致了深度学习在技术和结构上的进步。我们将了解深度学习的一些构建块,如受限玻尔兹曼机和自编码器。然后,我们将通过监督学习和无监督学习的不同变体来探索深度学习。接下来,我们将游览卷积神经网络(CNN),并通过一个用例,通过分解 CNN 在计算机视觉领域的应用来展示它们的工作原理。我们将介绍循环神经网络(RNN)及其变体,以及它们在文本/序列挖掘领域的应用。最后,我们将通过使用 MNIST 图像的真实数据案例研究来比较/对比不同的技术。我们将使用 DeepLearning4J 作为我们的 Java 工具包来执行这些实验。
多层前馈神经网络
从历史上看,人工神经网络主要被识别为多层前馈感知器,因此我们将从讨论这类网络的结构的基本元素开始,包括如何训练它们、过拟合问题以及解决该问题的技术。
输入、神经元、激活函数和数学符号
单个神经元或感知器与第二章中线性回归主题所描述的单位相同,即《实际应用中的监督学习》。在本章中,数据实例向量将由x表示,具有d个维度,每个维度可以表示为。与每个维度相关联的权重表示为一个具有d个维度的权重向量w,每个维度可以表示为
。每个神经元都有一个额外的输入b,称为偏置。
神经元预激活执行由以下给出的输入线性变换:
激活函数由给出,它将神经元输入
转换为以下形式:
图 1. 具有输入、权重和偏置的感知器生成输出。
多层神经网络
多层神经网络是理解深度学习网络的第一步,因为多层网络的基本概念和原语构成了所有深度神经网络的基础。
结构和数学符号
在本节中,我们介绍了神经网络的一般结构。大多数神经网络都是这里概述的结构变体。我们还展示了本章其余部分我们将使用的相关符号。
图 2. 展示输入层、两个隐藏层和输出层的多层神经网络。
与神经网络相关的最常见监督学习算法使用多层感知器。输入层由几个神经元组成,每个神经元独立连接到输入,并有自己的权重和偏置集。除了输入层之外,还有一层或更多被称为隐藏层的神经元。输入层神经元连接到第一隐藏层中的每个神经元,该层同样连接到下一隐藏层,依此类推,形成一个全连接网络。连接到最后隐藏层的神经元层被称为输出层。
每个隐藏层由表示,其中k是层。对于*0 < k * < l层的预激活由以下给出:
的隐藏层激活:
最终输出层激活为:
输出通常是每个神经元一个类别,并且调整方式使得只有一个神经元激活,其他所有神经元的输出都是 0。使用的 softmax 函数来给出结果。
神经网络中的激活函数
在以下章节中给出了神经网络中使用的一些最著名的激活函数,它们之所以被使用,是因为学习过程中所需的导数可以用函数本身来表示。
Sigmoid 函数
Sigmoid 激活函数由以下方程给出:
它可以被视为一个有界、严格递增且正的变换函数,将值压缩在 0 和 1 之间。
双曲正切("tanh")函数
Tanh 函数由以下方程给出:
它可以被视为有界、严格递增的,但作为一个将值压缩在-1 和 1 之间的正或负变换函数。
训练神经网络
在本节中,我们将讨论从输入训练集训练神经网络的要素,这与我们在第二章中讨论的方式非常相似,即实际应用世界监督学习。数据集用 D 表示,由单个数据实例组成。实例通常表示为的集合。每个实例的标签表示为
的集合。整个带标签的数据集,具有数值或实值特征,表示为集合中的配对元素,如
所示。
经验风险最小化
经验风险最小化是一个通用的机器学习概念,在许多分类或监督学习中得到应用。这种技术背后的主要思想是将训练或学习问题转化为一个优化问题(参考文献 [13])。
给定神经网络的参数为 ? = ({W¹, W², … W ^l ^(+1)}, {b¹, b², …b ^L ^(+1)}),训练问题可以看作是寻找最佳参数 (?),使得
其中 随机梯度下降(SGD)在第二章(ch02.html "第二章. 实际应用世界监督学习")和第五章(ch05.html "第五章. 实时流机器学习")中讨论,实际应用世界监督学习和实时流机器学习,通常用作优化过程。应用于训练神经网络的 SGD 如下:
-
初始化 ? = ({W¹, W², … W^l ^(+1)}, {b¹, b², …b^L ^(+1)})
-
对于 i=1 到 N 个 epoch
- 对于每个训练样本(xt,*y*t)
//找到函数 2 的梯度 ?= ?+ a? //沿方向移动
- 对于每个训练样本(xt,*y*t)
这里使用的学习率(a)将通过减少接近最优解的振荡来影响算法的收敛;选择正确的 a 值通常是一个超参数搜索,需要使用第二章中描述的验证技术。
因此,为了学习神经网络的参数,我们需要选择一种参数初始化的方法,选择一个损失函数 ,计算参数梯度
,将损失反向传播,选择正则化/惩罚函数 O(?),并计算正则化的梯度
。在接下来的几节中,我们将逐步描述这一过程。
参数初始化
神经网络的参数是输入层、通过隐藏层到输出层的每一层的权重和偏置。在这个领域已经进行了很多研究,因为优化取决于起始或初始化。偏置通常设置为 0。权重初始化取决于激活函数,因为一些函数,如 tanh,其值 0 不能使用。通常,初始化每一层权重的办法是使用具有用户定义边界的对称函数进行随机初始化。
损失函数
损失函数的主要作用是最大化预测输出标签与输入数据向量类别的匹配程度。
因此,最大化 等同于最小化负对数似然或交叉熵:
梯度
我们将描述输出层和隐藏层的梯度,而不涉及推导,因为这超出了本书的范围。感兴趣的读者可以在 Rumelhart、Hinton 和 Williams 的文本中看到推导(参考文献 [6])。
输出层的梯度
输出层的梯度可以计算为:
其中 e(y) 被称为“独热向量”,其中向量的一个值是 1,对应正确的类别 y,其余都是 0。
输出层预激活的梯度可以类似地计算:
= – (e(y) – f(x))
隐藏层梯度
隐藏层梯度是使用偏微分链式法则计算的。
隐藏层梯度
隐藏层预激活的梯度可以表示为:
由于隐藏层预激活需要如前所述的激活函数的偏导数(g'(a^kx[j])),因此之前描述的一些著名激活函数在方程本身中有偏导数,这使得计算非常容易。
例如,sigmoid 函数的偏导数为 g'(a) = g(a)(1 – g(a)),而对于 tanh 函数,它是 1 – g(a)²。
参数梯度
参数的损失梯度必须使用权重和偏差的梯度来计算。权重的梯度可以表示为:
偏差的梯度可以表示为:
前向传播和反向传播
神经网络训练的目的是调整每一层的权重和偏差,以便基于输出层的反馈和损失函数(该函数估计预测输出与实际输出之间的差异),最小化这种差异。
基于初始权重和偏差的神经网络算法可以看作是按层逐层前向计算,如图所示的单隐藏层无环流程图,以演示流程:
图 3:前向传播中神经网络作为图的流程。
从输入向量和预初始化的权重和偏差值开始,计算后续的每个元素:预激活、隐藏层输出、最终层预激活、最终层输出以及相对于实际标签的损失函数。在反向传播中,流向正好相反,从输出层的损失到第一层的权重和偏差,如下图所示:
图 4:反向传播中神经网络作为图的流程。
它是如何工作的?
反向传播算法(参考文献 [6 和 7])整体上可以总结如下:
计算激活前的输出梯度:
对于隐藏层 k=l+1 到 1:
计算隐藏层参数的梯度:
计算当前隐藏层以下的隐藏层梯度:
计算激活前的层梯度:
正则化
在之前定义的经验风险最小化目标中,正则化用于解决机器学习中的过拟合问题,如第二章《实际应用中的监督学习》中所述。以下给出了众所周知的正则化函数。
L2 正则化
这只应用于权重,而不应用于偏差,并且对于连接 (i,j) 元件的层给出如下:
此外,正则化器的梯度可以计算为 。它们通常被解释为权重分布上的“高斯先验”。
L1 正则化
这只应用于权重,而不应用于偏差,并且对于连接 (i,j) 组件的层给出如下:
而这个正则化器的梯度可以计算为 。它通常被解释为权重分布上的“拉普拉斯先验”。
神经网络的局限性
在本节中,我们将详细讨论神经网络面临的问题,这将成为构建深度学习网络的垫脚石。
消失梯度、局部最优和慢速训练
神经网络的主要问题之一是“消失梯度”问题 (参考文献 [8])。我们将尝试给出对该问题的简单解释,而不是深入探讨数学推导。我们将选择 sigmoid 激活函数和两层神经网络,如图所示,以演示该问题:
图 5:消失梯度问题。
正如我们在激活函数描述中看到的,sigmoid 函数将输出压缩在 0 和 1 之间。sigmoid 函数的导数 g'(a) = g(a)(1 – g(a)) 的范围在 0 和 0.25 之间。学习的目标是使输出损失最小化,即 。一般来说,输出误差不会降到 0,所以最大迭代次数;一个用户指定的参数决定了学习的质量和误差的反向传播。
简化以说明输出误差对输入权重层的影响:
每个转换,例如,从输出到隐藏,涉及两个小于 1 的项的乘法:
因此,当它达到输入层时,值变得如此之小,以至于梯度的传播几乎消失。这被称为消失梯度问题。
当你需要添加更多层来使隐藏层中的特征更加有趣时,就会出现一个矛盾的情况。但添加更多层也会增加错误。随着你添加更多层,输入层变得“训练缓慢”,这导致输出层更加不准确,因为它们依赖于输入层;进一步地,对于相同的迭代次数,随着层数的增加,错误也会增加。
在固定最大迭代次数的情况下,更多的层和缓慢的误差传播可能导致“局部最优”。
基本神经网络的一个问题是参数的数量。随着层数的增加,找到每个隐藏层和偏置的有效大小和权重变得更加具有挑战性。如果我们增加层数,参数将以多项式增长。为数据拟合参数需要大量的数据样本。这可能导致之前讨论过的问题,即过拟合。
在接下来的几节中,我们将开始学习帮助克服这些问题的深度学习构建块。
深度学习
深度学习包括用于监督学习和无监督学习的架构和技术,它能够使用由构建块组成的网络来内化高维数据的抽象结构,以创建判别性或生成模型。这些技术在近年来证明取得了巨大成功,任何希望掌握这些技术的读者都必须首先熟悉深度学习的基本构建块,并了解从业者使用的各种网络类型。如果你打算更深入地了解该主题,那么实际构建和调整深度神经网络的经验是无价的。在图像分类和文本学习等各个领域,深度学习在其结构中融合了特征生成,从而使得在许多应用中挖掘特征的任务变得多余。以下章节提供了概念、构建块、架构组合技术和训练深度网络的指南。
深度学习的构建块
在以下章节中,我们将介绍深度学习中最重要的组件,包括受限玻尔兹曼机、自编码器和去噪自编码器,它们的工作原理以及它们的优缺点。
矩形线性激活函数
Reclin 函数由以下方程给出:
g(a) = reclin (a) = max (0, a)
它可以看作是下限为 0 且没有上限,严格递增,并且仅对正数进行线性变换的正变换函数。
可以更容易地看出,修正线性单元或 ReLu 对于大于 0 的值具有 1 或恒等导数。这作为一个显著的好处,因为导数没有被压缩,并且在链式操作中不具有递减值。ReLu 的一个问题是对于负输入值,其值为 0,相应的神经元充当“死亡”状态,尤其是在偏置项学习到较大的负值时。ReLu 无法从这种情况中恢复,因为输入和导数都是 0。这通常通过具有“泄漏 ReLu”来解决。这些函数对于负输入值具有较小的值,并由以下公式给出 ,其中 ? = 0.01,通常是。
受限玻尔兹曼机
受限玻尔兹曼机(RBM)是一种无监督学习神经网络(参考文献 [11])。RBM 的想法是从标记或未标记数据中提取“更有意义的特征”。它还旨在在获取标记数据成本高昂或困难时,从许多领域中的大量未标记数据中“学习”。
定义和数学符号
在其基本形式中,RBM 假设每个维度上的输入是二进制值 0 或 1。RBM 是无向图模型,具有两层,一个表示为x的可见层和一个隐藏层h,以及连接W。
RBM 定义了一个涉及隐藏层潜在变量的可见层分布。首先定义一个能量函数来捕捉可见层和隐藏层之间在向量形式上的关系:
在标量形式中,能量函数可以定义为:
分布的概率由给出,其中Z被称为“配分函数”,它是对所有* x 和 h*值的枚举,它们是二进制值,导致指数项,因此使其难以处理!
图 6:可见层和隐藏层之间的连接。
相同内容的马尔可夫网络视图可以用所有成对因子表示,如下图所示。这也清楚地说明了为什么它被称为“受限”玻尔兹曼机,因为给定隐藏层或可见层内的单元之间没有连接:
图 7:输入和隐藏层作为标量
我们已经看到,整个概率分布函数难以处理。现在我们将推导出x, h的基本条件概率分布。
条件分布
虽然计算整个p(x, h)是难以处理的,但p(x|h)或p(h|x)的条件分布可以很容易地定义并证明是伯努利分布且可处理:
类似地,由于对称和无向性:
RBM 中的自由能
输入或观察变量的分布是:
函数F(x)被称为自由能。
训练 RBM
RBM 是通过在整个训练数据上最小化平均负对数似然度来训练的。这可以表示为:
优化是通过使用随机梯度下降来进行的:
术语被称为“正相”,而术语
被称为“负相”,因为它们对概率分布的影响——正相,因为它通过减少自由能来增加训练数据的概率,而负相,因为它减少了模型生成的样本的概率。
已经证明,由于“负相”,整体梯度难以从理论上计算,因为它是在模型形成的分布下计算输入数据的所有可能配置的期望,这使得它变得难以处理!
为了使计算可行,使用固定数量的模型样本进行估计,并将它们称为“负粒子”,用N表示。
梯度现在可以写成近似形式:
其中粒子是通过一些采样技术(如蒙特卡洛方法)采样的。
RBM 中的采样
吉布斯抽样通常用于生成样本并学习p(x,h)的概率,这是基于p(x|h)和p(h|x),它们相对容易计算,如前所述。
对 N 个随机变量进行联合采样的吉布斯抽样是通过 N 个形式
的采样子步骤来完成的,其中S [-i]包含从步骤S [i]到但不包括步骤S [i]的样本。从图形上看,可以表示如下:
图 8:隐藏层和输入层之间采样的图形表示。
如所示,采样表示实际的分布p(x,h)。
对比散度
对比散度(CD)是用于加速先前描述的吉布斯抽样过程的一个技巧,它停止在过程的步骤k而不是长时间继续以保证收敛。已经看到,即使k=1也是合理的,并且给出了良好的性能(参考文献 [10])。
输入和输出
这些是算法的输入:
-
训练数据集
-
吉布斯抽样的步数,k
-
学习率 a
-
输出是更新后的参数集
它是如何工作的?
使用自由能函数和偏导数的 CD 的完整训练伪代码可以表示为:
-
对于训练中的每个实例x^t:
-
使用* k* 步吉布斯抽样生成一个负粒子
。
-
更新参数:
-
持续对比散度
持续对比散度是另一种用于计算联合概率 p(x,h) 的技巧。在此方法中,有一个单链,在观察每个样本后不会重新初始化,以找到负粒子 。它保持其状态,并且参数仅通过运行这些 k 状态并通过使用前一步的粒子来更新。
自编码器
自编码器是神经网络中另一种无监督学习技术。它与开头描述的前馈神经网络非常相似,唯一的区别是它不生成输出层的类别,而是在输出层尝试复制输入。(参考文献[12 和 23]) 目标是让隐藏层捕获输入的潜在或隐藏信息作为特征,这些特征在无监督或监督学习中可能是有用的。
定义和数学符号
以下图中展示了自编码器的单个隐藏层示例:
图 9:层之间的自编码器流程
输入层和输出层具有与前馈网络相同的神经元数量,对应于输入向量 x。每个隐藏层可以比输入层或输出层有更多的神经元,也可以相等或更少,并且有一个执行信号的非线性变换的激活函数。它可以看作是使用无监督或潜在隐藏结构来“压缩”数据。
隐藏层通过数据编码器或输入变换如下所示:
并且数据通过输出层的解码器或输出变换如下所示:
通常,在层中使用描述在神经网络部分的信号线性变换的 Sigmoid 函数是流行的:
和
)
损失函数
损失函数的工作是减少训练误差,就像之前一样,以便可以使用如随机梯度函数之类的优化过程。
在二元值输入的情况下,损失函数通常是平均交叉熵,如下所示:
可以很容易地验证,当输入信号和输出信号匹配 0 或 1 时,误差为 0。同样,对于实值输入,使用平方误差:
用于随机梯度过程的损失函数的梯度与前馈神经网络相似,可以通过推导在实值和二进制中展示如下:
通过反向传播来获得参数梯度,这与神经网络中的操作完全相同。
自动编码器的局限性
自动编码器存在一些已知的缺点,这些问题将在后续章节中讨论。这些局限性包括:
当自动编码器的大小等于输入层中的神经元数量时,存在一种可能性,即自动编码器学习到的权重只是身份向量,整个表示仅仅将输入原封不动地传递为输出,损失为零。因此,它们模拟了“死记硬背”或“记忆”而没有任何泛化。
当自动编码器的大小大于输入层中的神经元数量时,这种配置称为“过完备”隐藏层,可能存在与之前提到的问题相似的问题。一些单元可能被关闭,而其他单元可能成为身份,使其仅成为复制单元。
当自动编码器的大小小于输入层中的神经元数量,称为“欠完备”时,可以在数据中发现潜在结构或重要的隐藏组件。
去噪自动编码器
如前所述,当自动编码器的隐藏层大小大于或等于输入层时,并不能保证学习到权重,它可能仅仅是一个将输入复制到输出的单元开关。这个问题通过去噪自动编码器得到解决。在这里,在输入和隐藏层之间增加了一个额外的层。这个层使用已知的分布或使用随机噪声(例如将二进制输入中的一个位转换为 0)向输入添加一些噪声。这个“噪声”输入随后通过从隐藏层到输出层的精确学习过程,就像自动编码器一样。去噪自动编码器的损失函数将输出与实际输入进行比较。因此,添加的噪声和更大的隐藏层使得学习潜在结构或添加/删除冗余以在输出端产生精确信号成为可能。这种架构——其中噪声层中的非零特征在信号向前推进时由激活层转换成隐藏层中的特征——为学习过程提供了鲁棒性和隐式结构(参考文献 [15])。
图 10:去噪自动编码器
无监督预训练和监督微调
正如我们在神经网络问题部分所讨论的,过拟合问题在深度学习中尤为突出,因为层数和参数数量都很大。解决过拟合的一种方法是对数据进行特定正则化。在本节中,我们将描述在隐藏层中进行的“无监督预训练”方法,以克服过拟合问题。请注意,这通常是许多深度学习算法中使用的“初始化过程”。
无监督预训练算法以层级的贪婪方式工作。如图所示,在给定时间考虑一个可见和隐藏结构的一层。使用之前描述的无监督技术(如 RBM)对该层的权重进行几次迭代学习。然后,隐藏层的输出被用作“可见”或“输入”层,训练继续进行到下一层,依此类推。
每层的学习可以被视为一个“特征提取或特征生成”过程。当实际数据输入被转换时,在给定层形成高级特征,然后进一步组合形成更高层次的特征,依此类推。
图 11:通过无监督学习逐层增量学习。
一旦在预训练中使用之前描述的无监督技术学习所有隐藏层参数,接下来将进行监督微调过程。在监督微调过程中,添加一个最终输出层,就像在神经网络中一样,通过前向和反向传播进行训练。其想法是大多数权重或参数几乎完全调整,只需要微小变化就能在输出产生判别性类别映射。
图 12:最终调整或监督学习。
深度前馈神经网络
深度前馈神经网络涉及使用预训练和微调阶段。
根据使用的无监督学习技术——RBM、自编码器或降噪自编码器——形成不同的算法:堆叠 RBM、堆叠自编码器和堆叠降噪自编码器,分别。
输入和输出
给定深度前馈神经网络的架构,以下是为训练网络提供的输入:
-
层数数量 L
-
没有标签的数据集 D
-
带有标签的数据集 D
-
训练迭代次数 n
它是如何工作的?
所有三种的通用学习/训练算法如下所示:
-
对于层 l=1 到 L(预训练):
-
没有标签的数据集
-
执行逐步层无监督学习(RBM、自编码器或降噪自编码器)
-
从前一步骤中最终确定参数 W^l, b^l
-
-
对于输出层 (L+1) 执行参数 WL*(+1), b^L* ^(+1) 的随机初始化。
-
对于层 l=1 到 L+1(微调):
-
带标签的数据集
。
-
使用从 1.(W^l, b^l)预初始化的权重。
-
进行 n 次前向-反向传播。
-
深度自编码器
深度自编码器具有许多隐藏单元层,这些层缩小到一个非常小的维度,然后对称地增长到输入大小。
图 13:深度自编码器
深度自编码器背后的想法是使用深度网络创建能够捕捉输入的潜在复杂结构的特征,同时克服由于深度结构导致的梯度消失和欠拟合问题。已经证明,这种方法生成的特征在许多数据集上比 PCA 表现更好(参考文献 [13])。
深度自编码器使用预训练、编码器/解码器和微调的概念来执行无监督学习:
在预训练阶段,使用 RBM 方法学习编码器的贪婪逐步参数,如图所示,用于初始化:
图 14:RBM 的逐步学习
在展开阶段,相同的参数对称地应用于解码器网络进行初始化。
最后,使用全网络的反向传播微调来调整参数。
深度信念网络
深度信念网络(DBNs)是无监督预训练概念的起源(参考文献 [9])。无监督预训练起源于 DBNs,后来发现它在前馈监督深度网络中也同样有用和有效。
深度信念网络不是监督的前馈网络,而是一个生成模型,用于生成数据样本。
输入和输出
输入层是数据的实例,每个输入特征用一个神经元表示。DBN 的输出是从学习到的特征层次中重建的输入,这些特征具有越来越大的抽象性。
它是如何工作的?
如何使用三层深度信念网络(DBN)架构来解释 DBN 学习输入数据的联合分布。
图 15:深度信念网络
如所示,具有三个隐藏层的 DBN 包含一个无向的 RBM 层,该层连接到两层贝叶斯网络。具有 sigmoid 激活函数的贝叶斯网络被称为 sigmoid 贝叶斯网络(SBN)。
生成模型的目标是学习由 p(x,h((1)),**h**((2)),h^((3))) 给出的联合分布
p(x,h((1)),**h**((2)),h^((3))) = p(h²),h((3)))*p*(**h**((1))|h^((2))) p(x|h^((1)))
如前所述的 RBM 计算给我们:
下一两层中的贝叶斯网络是:
对于二进制数据:
具有丢弃法的深度学习
另一种用于克服深度神经网络中提到的“过拟合”问题的技术是使用丢弃技术来学习参数。在接下来的几节中,我们将定义、说明并解释具有丢弃法的深度学习是如何工作的。
定义和数学符号
丢弃背后的想法是通过随机移除一些隐藏单元来“削弱”深度神经网络结构,如图所示,在参数学习之后。这些单元被设置为 0,丢弃概率通常设置为 p=0.5
灵感类似于向输入添加噪声,但这是在所有隐藏层中完成的。当随机移除某些特征(或特征的组合)时,神经网络必须以更稳健的方式学习潜在特征,而不依赖于某些特征之间的相互依赖性。
图 16:通过用深色阴影表示丢弃某些单元来指示具有丢弃法的深度学习。
每个隐藏层由 h^k(x) 表示,其中 k 是层。对于 0<k<l 层的预激活由以下给出:
对于 1< k < l 的隐藏层激活。二进制掩码在每个隐藏层由 m^k 表示:
最终输出层激活为:
输入和输出
对于使用丢弃法的训练,输入如下:
-
网络架构
-
训练数据集
-
丢弃概率 p(通常为 0.5)
输出是一个经过训练的深度神经网络,可用于预测用途。
它是如何工作的?
我们现在将描述具有丢弃法的深度学习的工作原理的不同部分。
使用丢弃法的训练和测试
使用梯度从输出损失函数反向传播学习权重和偏置与传统的神经网络学习非常相似。唯一的区别是应用了适当的掩码,如下所示:
在激活之前计算输出梯度:
对于隐藏层 k=l+1 到 1:
计算隐藏层参数的梯度:
h^(k-1) 的计算已考虑应用二进制掩码 m^(k-1)。
在激活之前计算当前以下隐藏层的梯度:
在激活之前计算以下层的梯度:
在测试模型时,我们不能使用二值掩码,因为它是不确定的;使用掩码的“期望”值。如果 dropout 概率是p=0.5,则在测试或模型应用时间点的单元期望值使用相同的值 0.5。
稀疏编码
稀疏编码是另一种用于无监督学习和特征生成的神经网络(参考文献 [22])。它基于在高维空间中寻找捕获模式的潜在结构的原则,从而在无监督学习之外执行特征提取。
形式上,对于每个输入x((t)),学习一个潜在表示**h**((t)),它具有稀疏表示(向量中的大多数值都是 0)。这是通过以下目标函数的优化来完成的:
其中第一个项用于控制重建误差,第二个项,使用正则化器?用于稀疏控制。矩阵D也被称为字典,因为它与字典中的单词具有等价性,h^((t))类似于词频;它们共同捕捉到在执行文本挖掘时,单词在提取模式中的影响。
卷积神经网络
卷积神经网络或 CNNs 已成为突出且在计算机视觉领域得到广泛应用。计算机视觉涉及处理图像/视频以捕获知识和模式。标注图像、分类图像/视频、纠正它们、讲故事或描述图像等,是计算机视觉中的一些广泛应用[16]。
计算机视觉问题通常需要处理无结构数据,这些数据可以描述为:
输入是具有单色或多色通道的 2D 图像或高维向量的 3D 视频。
这些 2D 或 3D 表示中的特征具有众所周知的空间拓扑结构、层次结构和一些可利用的重复元素。
图像/视频基于诸如光照、噪声等因素具有大量变换或变体。同一个人或汽车可以根据几个因素看起来不同。
接下来,我们将描述在 CNNs 中使用的某些构建块。我们将使用简单的图像,如字母表中的 X,来解释涉及的概念和数学。例如,尽管由于平移、缩放或扭曲,以下图中相同的字符 X 以不同的方式表示,但人眼可以轻松地将其识别为 X,但对于计算机来说,识别模式变得复杂。图像显示已获得作者的许可(参考文献 [19]):
图 17:以不同方式表示的字符 X 的图像。
下一个图示说明了如何将一个简单的灰度图像 X 具有的共同特征,如从左上角到右上角的斜线,以及左和右交叉的斜线重复并组合成更大的 X:
图 18:字符 X 图像中表示的常见特征。
局部连通性
这就是将整个图像划分为“补丁”或“接收场”并将每个补丁分配给隐藏层的简单概念。如图所示,而不是完整的样本图像的 9 X 9 像素,左上角的 3 X 3 像素补丁被送到第一个隐藏单元,重叠的第二补丁被送到第二个,依此类推。
由于完全连接的隐藏层会有大量的参数,拥有较小的补丁完全减少了参数或高维空间问题!
图 19:整个图像上的补丁概念。
参数共享
参数共享的概念是构建一个权重矩阵,可以在不同的补丁或接收场中重复使用,如前图所示在局部共享中构建。如图所示,具有相同参数W[1,1]和W[1,4]的特征图创建出两个不同的特征图,特征图 1 和 4,都捕捉到相同的特征,即两侧的对角线边缘。因此,特征图捕捉图像中的“相似区域”并进一步降低输入空间的维度。
离散卷积
我们将解释离散卷积的步骤,通过一个简单的、经过简化的数学示例来说明这个操作。
假设代表对角线特征的核在整个图像上作为一个 3 X 3 的补丁进行扫描。如果这个核落在输入图像中的相同特征上,并且我们必须通过我们所说的卷积算子来计算中心值,由于匹配,我们得到精确的值为 1,如下所示:
图 21:离散卷积步骤。
当整个图像通过这个核和卷积算子运行时,会得到如下值的矩阵:
图 22:经过核和卷积算子变换后的字符图像。
我们可以看到如何通过这个扫描突出显示左对角线特征。同样,通过运行其他核,如图所示,我们可以得到一个“过滤图像堆叠”:
图 23:不同的特征通过核运行,生成一系列图像。
过滤后的图像中的每个单元格可以表示为:
池化或子采样
池化或子采样在过滤图像堆栈上工作,进一步缩小图像或压缩它,同时保持模式不变。池化中执行的主要步骤如下:
-
选择窗口大小(例如,2 X 2)和步长大小(例如,2)。
-
在步长中移动窗口,覆盖所有过滤图像。
-
在每个窗口中,选择“最大”值。
图 24:使用 2 X 2 窗口大小和 2 步长进行的最大池化,计算第一个单元格的最大值为 1.0,下一个为 0.33,依此类推。
池化也扮演着重要角色,由于使用了最大值,即使特征被移动或缩放,也可以检测到相同的特征。同一组堆叠的过滤图像被转换成池化图像,如下所示:
图 25:展示如何将一叠过滤图像转换为池化图像的转换。
使用 ReLU 进行归一化
如我们在深度学习的基石中讨论的那样,ReLU 通过将其压缩到 0 来移除负值,并保持正值不变。它们在反向传播中的梯度计算中也扮演着重要的角色,解决了梯度消失的问题。
图 26:使用 ReLU 的转换。
CNN 层
在本节中,我们将把之前讨论的构建块组合起来,形成 CNN 的完整图景。通过结合卷积层、ReLU 和池化层形成一个连接的网络,生成缩小后的图像,并在最终输出中捕获模式,我们得到下一个复合构建块,如图所示:
图 27:CNN 的基本单元,展示了卷积、ReLU 和池化的组合。
因此,这些层可以组合或“深度堆叠”,如图所示,形成一个复杂的网络,输出一个小图像池:
图 28:通过重复堆叠基本单元来形成 CNN 层。
输出层是一个如所示的全连接网络,它使用投票技术并学习所需输出的权重。全连接输出层也可以堆叠。
图 29:CNN 的输出层为全连接层。
因此,最终的 CNN 可以完全如图所示:
图 30:显示所有层的 CNNS 输入和输出的图。
如前所述,梯度下降被选为学习技术,使用损失函数来计算差异并反向传播错误。
如果可以将数据映射到“图像”并且存在“局部空间”模式,CNN 可以用于其他领域,如声音模式识别、文本挖掘等。以下图示了将声音和文本映射到图像以供 CNN 使用的一种方法:
图 31:时间数据(如声音)映射到空间数据(如图像)的映射示意图。
循环神经网络
当你有有限输入且输入示例或实例之间没有相互依赖时,使用正常的深度网络。当存在可变长度输入且它们之间存在时间依赖性时,即序列相关数据,神经网络必须修改以处理此类数据。循环神经网络(RNN)是广泛用于解决此类问题的神经网络的例子,我们将在以下章节中讨论它们。RNN 用于许多与序列相关的问题,如文本挖掘、语言建模、生物信息学数据建模等,仅举一些符合这一元级描述的领域(参考文献 [18 和 21])。
循环神经网络的结构
我们将首先描述 RNN 的最简单单元,然后展示它是如何组合起来以理解其功能和数学原理,并说明不同组件如何相互作用和工作。
图 32:人工神经元与具有反馈的神经元的区别。
让我们考虑基本输入,一个具有激活的神经元及其在给定时间 t 的输出:
一个具有反馈的神经元保持一个矩阵 W[R],以包含时间 t-1 的前一个输出,方程如下:
图 33:具有反馈连接的神经元链。
基本 RNN 堆叠隐藏单元的结构,如图所示,从前一层反馈连接。在时间 t 的激活不仅依赖于输入 x^((t)),还依赖于由 W[R]h^((t-1)) 给出的前一个单元。RNN 反馈连接中的权重通常在所有单元中相同,W[R]。此外,RNN 不是在前馈神经网络的末端发出输出,而是每个单元持续发出输出,这些输出可用于损失函数的计算。
RNN 中的学习和相关问题
与 RNN 一起工作会带来一些特定于它们的挑战,但也有在其他类型神经网络中也遇到的一些共同问题。
-
单元在任何时间 t 的输出损失函数中使用的梯度具有回溯到第一个单元或 t=0 的依赖性,如图所示。这是因为单元的偏导数依赖于前一个单元,因为:
时间反向传播(BPTT)是用于说明该过程的术语。
图 34:时间反向传播。
-
与我们在前馈神经网络部分看到的情况类似,由于单元的连接性,梯度爆炸和消失的情况在 RNN 中变得更加明显。
-
解决梯度爆炸的一些方法包括:
-
截断 BPTT 是对 BPTT 过程的小幅修改。不是将学习传播回时间t=0,而是截断到固定时间向后到t=k。
-
梯度裁剪,当梯度急剧上升时,将其裁剪到阈值以上。
-
自适应学习率。学习率根据反馈和值进行调整。
-
-
解决梯度消失的一些方法包括:
-
使用 ReLU 作为激活函数;因此梯度将为 1。
-
自适应学习率。学习率根据反馈和值进行调整。
-
使用扩展,如长短期记忆(LSTM)和门控循环单元(GRU),我们将在下一部分进行描述。
-
RNN 有许多应用,例如在下一个字母预测、下一个单词预测、语言翻译等方面。
图 35:展示使用 RNN 结构在下一个字母/单词预测中的应用。
长短期记忆
解决 RNN 中梯度消失问题的一种神经网络架构或修改,被称为长短期记忆或 LSTM。我们将解释 LSTM 的一些构建块,然后将其组合起来供读者参考。
RNN 的第一个修改是将反馈学习矩阵改为 1,即W[R] = 1,如图所示:
图 36:LSTM 的构建块,其中反馈矩阵设置为 1。
这将确保从旧细胞或记忆单元的输入直接传递到下一个单元。因此需要一些修改。
输出门,如图所示,结合了两个计算。第一个是从单个单元输出的,通过激活函数传递,第二个是经过 sigmoid 缩放的老单元的输出。
图 37:LSTM 的构建块输出门。
从数学上讲,单元的输出门由以下公式给出:
遗忘门位于两个记忆单元之间。它根据学习权重和变换生成 0 或 1。遗忘门如图所示:
图 38:LSTM 中添加的遗忘门构建块。
从数学上讲,可以看作是遗忘门的表示。接下来,输入门和新门结合,如图所示:
图 39:添加了新门和输入门以完成 LSTM。
新的记忆生成单元通过激活函数使用当前输入 x[t] 和旧状态 h[t-1],生成新的记忆 C[t]。输入门结合输入和旧状态,并确定是否保留新的记忆或输入。
因此,更新方程看起来是这样的:
门控循环单元
门控循环单元 (GRUs) 是经过修改的简化 LSTMs。许多门通过使用一个“更新”单元进行了简化,如下所示:
图 40:带有更新单元的 GRUs。
对方程所做的更改如下:
案例研究
对于图像分类,存在几个基准测试。我们将使用 MNIST 图像数据库进行本案例研究。当我们使用 MNIST 在第三章中时,无监督机器学习技术,包括聚类和异常检测技术,每个像素都被视为一个特征。除了像以前实验中那样从像素值中学习外,我们还将使用深度学习技术从训练数据集的结构中学习新特征。深度学习算法将在 60,000 张图像上进行训练,并在 10,000 张图像的测试数据集上进行测试。
工具和软件
在本章中,我们介绍了名为 DeepLearning4J (DL4J)的开源 Java 深度学习框架。DL4J 包含实现众多深度学习技术的库,它们可以在分布式 CPU 和 GPU 上使用。
DeepLearning4J: deeplearning4j.org/index.html
我们将展示如何使用一些 DL4J 库从 MNIST 训练图像中学习,并将学到的模型应用于测试集中的图像分类。
商业问题
图像分类是评估深度学习网络的特别有吸引力的测试平台。我们之前遇到了 MNIST 数据库,它由手写数字的灰度图像组成。这次,我们将展示如何使用无监督和监督的深度学习技术从同一数据集中学习。MNIST 数据集包含 28x28 像素的单通道图像。这些图像被分类为 10 个标签,代表数字 0 到 9。目标是训练 60,000 个数据点,并在剩余的 10,000 张图像上测试我们的深度学习分类算法。
机器学习映射
这包括应用于有 10 个可能输出类别的分类问题的监督和无监督方法。一些技术使用一个初始的预训练阶段,这个阶段本质上是无监督的,正如我们在前面的章节中看到的。
数据采样和转换
数据集可在以下位置获取:
在本案例研究的实验中,MNIST 数据集已经被标准化,使得像素值在 0 到 255 的范围内被归一化到 0.0 到 1.0。例外的是在堆叠 RBM 的实验中,训练数据和测试数据已经被二值化,即如果标准化值大于或等于 0.3 则设置为 1,否则为 0。10 个类别在训练集和测试集中都有相同的代表性。此外,使用用户提供的随机数生成器种子对示例进行随机排序。
特征分析
输入数据特征是每张图像中像素的灰度值。这是原始数据,我们将使用深度学习算法从原始像素值中学习高级特征。数据集已经被准备,使得训练集和测试集中每个类别的示例数量相等。
模型、结果和评估
我们将从简单的 MLP、卷积网络、变分自编码器、堆叠 RBM 和 DBN 开始进行不同的实验。我们将逐步讲解代码中的重要部分,突出网络结构或专门的调整,提供参数以帮助读者重现实验,并给出每种网络类型的结果。
基本数据处理
以下代码片段显示:
如何使用分隔符强制结构的 CSV 读取数据。
如何迭代数据并获取记录。
如何在内存中打乱数据并创建训练/测试或验证集:
RecordReader recordReader = new ] CSVRecordReader(numLinesToSkip,delimiter);
recordReader.initialize(new FileSplit(new ClassPathResource(fileName).getFile()));
DataSetIterator iterator = new RecordReaderDataSetIterator(recordReader,batchSize,labelIndex,numClasses);
DataSet allData = iterator.next();
allData.shuffle();
SplitTestAndTrain testAndTrain = allData.splitTestAndTrain(trainPercent);
DataSet trainingData = testAndTrain.getTrain();
DataSet testData = testAndTrain.getTest();
DL4J 有一个特定的 MNIST 包装器来处理我们所使用的数据,如下面的代码片段所示:
DataSetIterator mnistTrain = new MnistDataSetIterator(batchSize, true, randomSeed);
DataSetIterator mnistTest = new MnistDataSetIterator(batchSize, false, randomSeed);
多层感知器
在第一个实验中,我们将使用一个基本的多层感知器,包含输入层、一个隐藏层和一个输出层。以下是代码中使用的参数的详细列表:
用于 MLP 的参数
参数 | 变量 | 值 |
---|---|---|
迭代次数 | m | 1 |
学习率 | rate | 0.0015 |
动量 | momentum | 0.98 |
L2 正则化 | 正则化 | 0.005 |
输入行数 | numRows | 28 |
输入列数 | numColumns | 28 |
第 0 层输出大小,第 1 层输入大小 | outputLayer0, inputLayer1 | 500 |
第 1 层输出大小,第 2 层输入大小 | outputLayer1, inputLayer2 | 300 |
第 2 层输出大小,第 3 层输入大小 | outputLayer2, inputLayer3 | 100 |
第 3 层输出大小 | outputNum | 10 |
MLP 代码
在下面的列表中,我们可以看到我们首先通过 Builder 模式传递超参数来配置 MLP。
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() .seed(randomSeed) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) // use SGD
.iterations(m)//iterations
.activation(Activation.RELU)//activation function
.weightInit(WeightInit.XAVIER)//weight initialization
.learningRate(rate) //specify the learning rate
.updater(Updater.NESTEROVS).momentum(momentum)//momentum
.regularization(true).l2(rate * regularization) //
.list()
.layer(0,
new DenseLayer.Builder() //create the first input layer.
.nIn(numRows * numColumns)
.nOut(firstOutput)
.build())
.layer(1, new DenseLayer.Builder() //create the second input layer
.nIn(secondInput)
.nOut(secondOutput)
.build())
.layer(2, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) //create hidden layer
.activation(Activation.SOFTMAX)
.nIn(thirdInput)
.nOut(numberOfOutputClasses)
.build())
.pretrain(false).backprop(true) //use backpropagation to adjust weights
.build();
下面的代码片段展示了 MLP 的训练、评估和测试。注意初始化可视化后端代码,这使您能够在浏览器中监控模型训练,特别是模型得分(每次迭代的训练误差)和参数更新:
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(new ScoreIterationListener(5)); //print the score with every iteration
//Initialize the user interface backend
UIServer uiServer = UIServer.getInstance();
//Configure where the network information (gradients, activations, score vs. time etc) is to be stored
//Then add the StatsListener to collect this information from the network, as it trains
StatsStorage statsStorage = new InMemoryStatsStorage(); //Alternative: new FileStatsStorage(File) - see UIStorageExample
int listenerFrequency = 1;
net.setListeners(new StatsListener(statsStorage, listenerFrequency));
//Attach the StatsStorage instance to the UI: this allows the contents of the StatsStorage to be visualized
uiServer.attach(statsStorage);
log.info(""Train model...."");
for( int i=0; i<numEpochs; i++ ){
log.info(""Epoch "" + i);
model.fit(mnistTrain);
}
log.info(""Evaluate model...."");
Evaluation eval = new Evaluation(numberOfOutputClasses);
while(mnistTest.hasNext()){
DataSet next = mnistTest.next();
INDArray output = model.output(next.getFeatureMatrix()); //get the networks prediction
eval.eval(next.getLabels(), output); //check the prediction against the true class
}
log.info(eval.stats());
下面的图表显示了 MLP 模型的训练误差与训练迭代次数的关系。这条曲线应该随着迭代次数的增加而降低:
图 41:使用训练迭代次数测量的 MLP 模型的训练误差。
在下面的图中,我们可以看到 MLP 的第 0 层参数的分布以及参数更新的分布。这些直方图应该具有大约高斯(正态)形状,这表明良好的收敛。有关如何使用图表调整模型的信息,请参阅 DL4J 可视化页面(deeplearning4j.org/visualization
):
图 42:显示层参数和更新分布的直方图。
卷积网络
在第二个实验中,我们使用内置的多层配置(MultiLayerConfiguration)配置了一个卷积网络(ConvNet)。网络的架构由总共五层组成,如下代码片段所示。在输入层之后,两个交替的 5x5 卷积层和最大池化层之后,是一个使用 ReLu 激活层的全连接密集层,最终以 Softmax 激活结束在输出层。使用的优化算法是随机梯度下降,损失函数是负对数似然。
ConvNet 的各种配置参数(或超参数)在表中给出。
ConvNet 使用的参数
参数 | 变量 | 值 |
---|---|---|
随机数种子 | seed | 123 |
输入大小 | numRows, numColumns | 28, 28 |
训练轮数 | numEpochs | 10 |
迭代次数 | iterations | 1 |
L2 正则化 | regularization | 0.005 |
学习率 | learningRate | 0.1 |
动量 | momentum | 0.9 |
卷积滤波器大小 | xsize, ysize | 5, 5 |
卷积层步长大小 | x, y | 1, 1 |
输入通道数 | numChannels | 1 |
下采样层步长大小 | sx, sy | 2, 2 |
第 0 层输出大小 | nOut0 | 20 |
第 2 层输出大小 | nOut1 | 50 |
第 4 层输出大小 | nOut2 | 500 |
第 5 层输出大小 | outputNum | 10 |
CNN 代码
如您所见,使用 DL4J API 配置多层神经网络,无论是构建 MLP 还是 CNN,都是相似的。算法特定的配置只需在每一层的定义中完成。
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed)
.iterations(iterations) .regularization(true).l2(regularization)
.learningRate(learningRate)
.weightInit(WeightInit.XAVIER) .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) .updater(Updater.NESTEROVS).momentum(momentum)
.list()
.layer(0, new ConvolutionLayer.Builder(xsize, ysize)
.nIn(nChannels)
.stride(x,y)
.nOut(nOut0)
.activation(Activation.IDENTITY)
.build())
.layer(1, new SubsamplingLayer
.Builder(SubsamplingLayer.PoolingType.MAX)
.kernelSize(width, height)
.stride(sx,sy)
.build())
.layer(2, new ConvolutionLayer.Builder(xsize, ysize)
.stride(x,y)
.nOut(nOut2)
.activation(Activation.IDENTITY)
.build())
.layer(3, new SubsamplingLayer
.Builder(SubsamplingLayer.PoolingType.MAX)
.kernelSize(width, height)
.stride(sx,sy)
.build())
.layer(4, new DenseLayer.Builder()
.activation(Activation.RELU)
.nOut(nOut4).build())
.layer(5, new OutputLayer. Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD)
.nOut(outputNum)
.activation(Activation.SOFTMAX)
.build())
.setInputType(InputType.convolutionalFlat(numRows,numColumns,1))
.backprop(true).pretrain(false).build();
变分自动编码器
在第三个实验中,我们将变分自动编码器配置为分类器。
变分自动编码器使用的参数
用于配置 VAE 的参数在表中显示。
参数 | 变量 | 值 |
---|---|---|
RNG 种子 | rngSeed | 12345 |
迭代次数 | Iterations | 1 |
学习率 | learningRate | 0.001 |
RMS 衰减 | rmsDecay | 0.95 |
L2 正则化 | regularization | 0.0001 |
输出层大小 | outputNum | 10 |
VAE 编码器层大小 | vaeEncoder1, vaeEncoder2 | 256, 256 |
VAE 解码器层大小 | vaeDecoder1, vaeDecoder2 | 256, 256 |
潜在变量空间大小 | latentVarSpaceSize | 128 |
变分自动编码器的代码
我们已配置了编码器和解码器各两层,并使用伯努利分布重构输入。
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(rngSeed)
.iterations(iterations)
.optimizationAlgo(
OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.learningRate(learningRate)
.updater(Updater.RMSPROP).rmsDecay(rmmsDecay)
.weightInit(WeightInit.XAVIER)
.regularization(true).l2(regulaization)
.list()
.layer(0, new VariationalAutoencoder.Builder()
.activation(Activation.LEAKYRELU)
.encoderLayerSizes(vaeEncoder1, vaeEncoder2) //2 encoder layers
.decoderLayerSizes(vaeDecoder1, vaeDecoder2) //2 decoder layers
.pzxActivationFunction(""identity"") //p(z|data) activation function
.reconstructionDistribution(new BernoulliReconstructionDistribution(Activation.SIGMOID.getActivationFunction())) //Bernoulli distribution for p(data|z) (binary or 0 to 1 data only)
.nIn(numRows * numColumns) //Input size
.nOut(latentVarSpaceSize) //Size of the latent variable space: p(z|x).
.build())
.layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD).activation(Activation.SOFTMAX)
.nIn(latentVarSpaceSize).nOut(outputNum).build())
.pretrain(true).backprop(true).build();
DBN
DBN 中使用的参数如下表所示:
参数 | 变量 | 值 |
---|---|---|
输入数据大小 | numRows, numColumns | 28, 28 |
RNG 种子 | seed | 123 |
训练迭代次数 | iterations | 1 |
动量 | momentum | 0.5 |
层 0(输入)层 0(输出)层 1(输入,输出)层 2(输入,输出)层 3(输入,输出) | numRows * numColumnsnOut0nIn1, nOut1nIn2, nOut2nIn3, outputNum | 28 * 28500500, 250250, 200200, 10 |
使用 DL4J API 配置 DBN 的示例在此案例研究中使用。网络配置的代码在此处显示。
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed)
.gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue)
.gradientNormalizationThreshold(1.0)
.iterations(iterations)
.updater(Updater.NESTEROVS)
.momentum(momentum)
.optimizationAlgo(OptimizationAlgorithm.CONJUGATE_GRADIENT)
.list()
.layer(0, new RBM.Builder().nIn(numRows*numColumns).nOut(nOut0)
.weightInit(WeightInit.XAVIER).lossFunction(LossFunction.KL_DIVERGENCE)
.visibleUnit(RBM.VisibleUnit.BINARY)
.hiddenUnit(RBM.HiddenUnit.BINARY)
.build())
.layer(1, new RBM.Builder().nIn(nIn1).nOut(nOut1)
.weightInit(WeightInit.XAVIER).lossFunction(LossFunction.KL_DIVERGENCE)
.visibleUnit(RBM.VisibleUnit.BINARY)
.hiddenUnit(RBM.HiddenUnit.BINARY)
.build())
.layer(2, new RBM.Builder().nIn(nIn2).nOut(nOut2)
.weightInit(WeightInit.XAVIER).lossFunction(LossFunction.KL_DIVERGENCE)
.visibleUnit(RBM.VisibleUnit.BINARY)
.hiddenUnit(RBM.HiddenUnit.BINARY)
.build())
.layer(3, new OutputLayer.Builder().nIn(nIn3).nOut(outputNum)
.weightInit(WeightInit.XAVIER).activation(Activation.SOFTMAX)
.build())
.pretrain(true).backprop(true)
.build();
MultiLayerNetwork model = new MultiLayerNetwork(conf);
model.init();
model.setListeners(new ScoreIterationListener(listenerFreq));
使用 Arbiter 进行参数搜索
DeepLearning4J 提供了一个框架,通过移除模型师手动调整的负担来微调超参数;相反,它允许指定搜索的参数空间。在下面的示例代码片段中,配置是通过使用 MultiLayerSpace 而不是 MutiLayerConfiguration 对象来指定的,其中超参数的范围是通过 Arbiter DL4J 包中的 ParameterSpace 对象来指定的,用于调整的参数:
ParameterSpace<Double> learningRateHyperparam = new ContinuousParameterSpace(0.0001, 0.1); //Values will be generated uniformly at random between 0.0001 and 0.1 (inclusive)
ParameterSpace<Integer> layerSizeHyperparam = new IntegerParameterSpace(16,256); //Integer values will be generated uniformly at random between 16 and 256 (inclusive)
MultiLayerSpace hyperparameterSpace = new MultiLayerSpace.Builder()
//These next few options: fixed values for all models
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.iterations(1)
.regularization(true)
.l2(0.0001)
//Learning rate: this is something we want to test different values for
.learningRate(learningRateHyperparam)
.addLayer( new DenseLayerSpace.Builder()
//Fixed values for this layer:
.nIn(784) //Fixed input: 28x28=784 pixels for MNIST
.activation(""relu"")
//One hyperparameter to infer: layer size
.nOut(layerSizeHyperparam)
.build())
.addLayer( new OutputLayerSpace.Builder()
//nIn: set the same hyperparemeter as the nOut for the last layer.
.nIn(layerSizeHyperparam)
//The remaining hyperparameters: fixed for the output layer
.nOut(10)
.activation(""softmax"")
.lossFunction(LossFunctions.LossFunction.MCXENT)
.build())
.pretrain(false).backprop(true).build();
结果和分析
在以下表格中给出了评估四个网络在测试数据上性能的结果:
MLP | ConvNet | VAE | DBN | |
---|---|---|---|---|
准确率 | 0.9807 | 0.9893 | 0.9743 | 0.7506 |
精度 | 0.9806 | 0.9893 | 0.9742 | 0.7498 |
召回率 | 0.9805 | 0.9891 | 0.9741 | 0.7454 |
F1 分数 | 0.9806 | 0.9892 | 0.9741 | 0.7476 |
实验的目标不是在每个神经网络结构中匹配基准结果,而是向读者提供一个综合的架构实现,并在代码中提供详细的参数供他们探索。
在深度学习网络中调整超参数是一项相当大的挑战,尽管 Arbiter 和在线资源如 gitter(gitter.im/deeplearning4j/deeplearning4j
)有助于 DL4J,但与包括 SVM 在内的其他分类技术相比,超参数搜索的时间和成本相当高。
MNIST 数据集上的基准结果和相应的论文在此处可用:
从基准测试结果来看,线性 1 层神经网络(NN)的错误率为 12%,增加更多层可以将其降低到大约 2%。这表明了数据的非线性性质以及需要复杂算法来拟合模式的需求。
与基准测试中神经网络的最佳结果相比,其错误率从 2.5%到 1.6%,我们的结果与 2%的错误率非常相似。
大多数基准测试结果都显示卷积网络架构的错误率在 1.1%到 0.5%之间,我们的超参数搜索已经将那些模型中的最佳模型与错误率略低于 1.1%相匹配。
我们对深度信念网络(DBN)的结果远远低于基准测试,仅为 25%多。没有理由怀疑进一步的调整不能提高性能,将其提升到 3-5%的范围内。
摘要
深度学习的历史与早期在机器学习和人工智能中使用神经网络尝试的局限性紧密相连,以及这些局限性是如何通过新技术、技术改进和大量数据的可用性而被克服的。
感知器是基本的人工神经网络。多层网络用于监督学习,通过连接几个隐藏层的神经元来传播激活,并使用反向传播来减少训练误差。常用的激活函数包括 sigmoid 和 tanh 函数。
神经网络的问题包括梯度消失或爆炸、训练缓慢和陷入局部最小值陷阱。
深度学习通过几种有效的技术成功地解决了这些问题,这些技术可以用于无监督学习以及监督学习。
深度学习网络的基本构建块包括受限玻尔兹曼机(RBM)、自编码器和去噪自编码器。RBM 是两层无向网络,能够从其输入中提取高级特征。对比散度用于加速训练。自编码器也是用于无监督学习的深度学习网络,它们通过首先在编码层中编码学习到的特征,然后通过一组解码层重建输入来尝试复制输入。去噪自编码器解决了自编码器的一些局限性,有时会导致它们简单地学习恒等函数。
深度学习网络通常以无监督的方式预训练,然后通过监督微调来调整其参数。在预训练阶段使用堆叠的 RBM 或自编码器,而在分类的情况下,微调通常通过输出层的 softmax 激活来完成。
深度自编码器擅长学习数据中的复杂潜在结构,并通过使用自编码器构建块进行预训练和微调在无监督学习中使用。深度信念网络(DBN)是生成模型,可用于创建更多样本。它使用一个带有顶部无向 RBM 层的有向贝叶斯网络构建。通过使用带有随机“关闭”一些网络节点的 dropout 进行学习,可以解决深度学习网络中的过拟合问题。
卷积神经网络(CNN)在计算机视觉中有许多应用。CNN 可以学习数据中的模式,这些模式对数据的平移不变性和线性缩放具有鲁棒性。它们使用卷积滤波器和池化层来降低数据的维度,并在分类任务中实现非常有效的结果。一个涉及数字图像分类的用例被提出。
当数据以序列形式到达且数据之间存在时间关系时,使用循环神经网络(RNN)进行建模。RNN 使用来自先前层的反馈并持续输出。在 RNN 中,梯度消失和梯度爆炸的问题会再次出现,并通过修改架构的几种方法来解决,例如长短期记忆(LSTM)和门控循环网络(GRU)。
在本章的案例研究中,我们展示了使用各种深度学习网络从 MNIST 手写数字图像数据集中学习的实验。展示了使用 MLP、ConvNet、变分自编码器和堆叠 RBM 的结果。
我们认为,深度神经网络能够逼近底层数据所基于的关键结构的显著和代表性子集。此外,数据的层次结构可以通过不同的隐藏层轻松捕获。最后,图像的旋转、平移和尺度的不变性是深度神经网络性能的最后关键要素。这种不变性使我们能够减少神经网络需要捕获的可能状态的数量(参考文献 [19])。
参考文献
-
Behnke, S. (2001). 在神经抽象金字塔中学习迭代图像重建。国际计算智能与应用杂志,1(4),427–438。
-
Behnke, S. (2002). 使用分层循环神经网络进行人脸定位。载于第 12 届国际人工神经网络会议论文集(第 1319–1324 页)。
-
Behnke, S. (2003). 使用卷积非负矩阵分解发现层次语音特征。载于国际神经网络联合会议论文集,第 4 卷(第 2758–2763 页)。
-
Behnke, S. (2003). LNCS,计算机科学讲义:第 2766 卷。用于图像解释的层次神经网络。Springer。Behnke, S. (2005). 神经抽象金字塔中的人脸定位和跟踪。神经计算与应用,14(2),97–103。
-
Casey, M. P. (1996). 离散时间计算的动力学,及其在循环神经网络和有限状态机提取中的应用。神经计算杂志,第 8 卷,第 6 期,第 1135–1178 页。
-
Rumelhart, D. E., Hinton, G. E., 和 Williams, R. J. (1986). 通过误差传播学习内部表示。在 Rumelhart, D. E. 和 McClelland, J. L. 编著的《并行分布式处理》第 1 卷,第 318–362 页。麻省理工学院出版社。
-
Goller, C.; Küchler, A (1996). ""通过结构反向传播进行任务相关分布式表示的学习"". 神经网络,IEEE。doi:10.1109/ICNN.1996.548916
-
Hochreiter, Sepp. 在学习循环神经网络时梯度消失问题及其解决方案。国际不确定性、模糊性和基于知识的系统杂志,第 6 卷,第 2 期,第 107–116 页,1998 年。
-
G. E. Hinton, S. Osindero, 和 Y. The (2006). "深度信念网的快速学习算法," 神经计算杂志,第 18 卷,第 1527–1554 页。
-
G. E. Hinton (2002). "通过最小化对比散度训练专家乘积," 神经计算杂志,第 14 卷,第 1771–1800 页。
-
G. E. Hinton 和 R. R. Salakhutdinov (2006). "使用神经网络降低数据维度," 科学,第 313 卷,第 5786 号,第 504–507 页。
-
Hinton, G. E., 和 Zemel, R. S. (1994). 自编码器、最小描述长度和亥姆霍兹自由能。神经信息处理系统进展,第 6 卷,第 3–10 页。
-
Y. Bengio, P. Lamblin, D. Popovici, 和 H. Larochelle. (2007). "深度网络的贪婪层叠训练," 在《神经信息处理系统进展》第 19 卷(NIPS'06)第 153–160 页。
-
H. Larochelle, D. Erhan, A. Courville, J. Bergstra, 和 Y. Bengio (2007). "在具有许多变化因素的问题上对深度架构的经验评估," 在第 24 届国际机器学习会议(ICML'07)论文集,第 473–480 页。
-
P. Vincent, H. Larochelle, Y. Bengio, 和 P.-A. Manzagol (2008), "使用降噪自编码器提取和组合鲁棒特征," 在第 25 届国际机器学习会议(ICML'08)论文集,第 1096–1103 页。
-
F.-J. Huang 和 Y. LeCun (2006). "使用 SVM 和卷积网进行通用对象分类的大规模学习," 在计算机视觉和模式识别会议(CVPR'06)论文集。
-
F. A. Gers, N. N. Schraudolph, 和 J. Schmidhuber (2003). 使用 LSTM 循环网络学习精确的时间。机器学习研究杂志。
-
Kyunghyun Cho 等人 (2014). 使用 RNN 编码器-解码器学习短语表示以进行统计机器翻译。
arxiv.org/pdf/1406.1078.pdf
。 -
brohrer.github.io/how_convolutional_neural_networks_work.html
-
Henry W. Lin, Max Tegmark, David Rolnick (2016). 为什么深度学习和低成本学习工作得如此之好?
arxiv.org/abs/1608.08225
。 -
Mike Schuster 和 Kuldip K. Paliwal (1997). 双向循环神经网络,信号处理杂志。
-
H Lee, A Battle, R Raina, AY Ng (2007). 高效稀疏编码算法,载于《神经信息处理系统进展》
-
Bengio Y. (2009). 为人工智能学习深度架构,载于《机器学习基础与趋势》第 1 卷第 2 期,第 1-127 页。
第八章:文本挖掘与自然语言处理
自然语言处理(NLP)如今在各种应用中无处不在,如移动应用、电子商务网站、电子邮件、新闻网站等。检测电子邮件中的垃圾邮件、描述电子邮件、语音合成、分类新闻、搜索和推荐产品、对社交媒体品牌进行情感分析——这些都是 NLP 和挖掘文本信息的不同方面。
数字文本信息呈指数级增长——以网页、电子书、短信、各种格式的文档、电子邮件、社交媒体消息(如推文和 Facebook 帖子)等形式,现在达到泽字节(1 泽字节等于 1,018 字节)。历史上,最早依赖自动机和概率建模的基础性工作始于 20 世纪 50 年代。20 世纪 70 年代见证了诸如随机建模、马尔可夫建模和句法解析等变化,但在“人工智能寒冬”年份,它们的进展有限。20 世纪 90 年代见证了文本挖掘和统计革命的兴起,包括语料库统计、监督机器学习和文本数据的标注等思想。从 2000 年开始,随着计算和大数据的巨大进步,以及监督学习和无监督学习中复杂机器学习算法的引入,该领域重新引起了人们的兴趣,现在成为学术界和商业企业研发部门研究的热点话题之一。在本章中,我们将讨论 NLP 和文本挖掘在机器学习中的关键方面。
本章首先介绍了自然语言处理(NLP)中的关键领域,然后解释了使文档更适合机器学习(无论是监督学习还是无监督学习)的重要处理和转换步骤。接下来是主题建模、聚类和命名实体识别的概念,以及简要介绍了两个提供强大文本处理能力的 Java 工具包。本章的案例研究使用另一个广为人知的数据集,通过使用 KNIME 和 Mallet 工具进行实验,展示了这里描述的几种技术。
本章组织如下:
-
NLP,子领域和任务:
-
文本分类
-
词性标注
-
文本聚类
-
信息提取和命名实体识别
-
情感分析
-
共指消解
-
词义消歧
-
机器翻译
-
语义推理和推断
-
摘要
-
问答
-
数据挖掘和无结构数据的问题
-
-
文本处理组件和转换:
-
文档收集和标准化
-
分词
-
停用词去除
-
词干提取/词元还原
-
本地/全局字典
-
特征提取/生成
-
特征表示和相似性
-
特征选择和降维
-
-
文本挖掘主题:
-
主题建模
-
文本聚类
-
命名实体识别
-
深度学习和 NLP
-
-
工具和用法:
-
Mallet
-
KNIME
-
-
案例研究
NLP,子领域和任务
实际世界的信息以结构化数据的形式存在,通常由自动化过程生成,或者以非结构化数据的形式存在,在文本的情况下,它是由直接的人类活动以书面或口头语言的形式创造的。观察现实世界情况并使用自动化过程或让人类感知并将该信息转换为可理解数据的过程,在结构化和非结构化数据中都非常相似。将观察到的世界转化为非结构化数据涉及诸如文本的语言、存在的格式、不同观察者对同一数据的解释差异等复杂性。此外,所选语言的语法和语义的歧义、表达的微妙之处、数据中的上下文等,使得挖掘文本数据变得非常困难。
接下来,我们将讨论一些涉及 NLP 和文本挖掘的高级子领域和任务。NLP 的主题非常广泛,以下话题远非全面。
文本分类
这个领域是最为成熟的之一,其基本形式是将包含非结构化文本数据的文档分类到预定义的类别中。这可以被视为在非结构化文本世界中监督机器学习的直接扩展,通过学习历史文档来预测未来未见文档的类别。在电子邮件垃圾邮件检测或新闻分类中的一些基本方法,是这个任务最突出的应用之一。
图 1:文本分类显示分类到不同的类别
词性标注(POS 标注)
在自然语言处理(NLP)中,另一个取得巨大成功的子任务是,根据上下文和与相邻词语的关系,将语言的词性(如名词、形容词、动词)与文本中的词语关联起来。如今,我们不再进行手动词性标注,而是由自动化且复杂的词性标注器来完成这项工作。
图 2:与文本片段关联的词性标注
文本聚类
文本聚类是将非结构化数据聚类以组织、检索和基于相似性的分组,这是文本聚类的子领域。这个领域也得到了很好的发展,不同聚类和适合学习的文本表示方法都有所进步。
图 3:将操作系统新闻文档聚类到各种操作系统特定集群
信息提取和命名实体识别
提取特定元素的任务,如时间、地点、组织、实体等,属于信息提取的范畴。命名实体识别是一个在多个领域有广泛应用子领域,从历史文件的评论到生物信息学中的基因和药物信息。
图 4:句子中的命名实体识别
情感分析和意见挖掘
在自然语言处理(NLP)领域的另一个子领域涉及推断观察者的情感,以便用可理解的指标对他们进行分类,或者提供他们对意见的见解。这个领域不如前面提到的某些领域先进,但在这个方向上正在进行大量研究。
图 5:情感分析显示句子的正面和负面情感
指代消解
理解文本中存在的多个实体的引用并消除歧义是自然语言处理(NLP)中另一个流行的领域。这被认为是进行更复杂任务(如问答和摘要)的垫脚石,这些内容将在后面讨论。
图 6:指代消解显示代词如何被消歧
词义消歧
在像英语这样的语言中,由于同一个词可以根据上下文有多种含义,自动解析这一点是自然语言处理(NLP)的一个重要部分,也是词义消歧(WSD)的焦点。
图 7:展示如何使用上下文将单词“mouse”与正确的单词关联起来
机器翻译
将文本从一种语言翻译成另一种语言,或者在不同语言中将语音转换为文本,这在机器翻译(MT)领域得到了广泛的涵盖。这个领域在过去的几年里取得了显著的进步,机器学习算法在监督学习、无监督学习和半监督学习中的应用。使用 LSTM 等技术的深度学习已被证明是这个领域最有效的技术,并被 Google 广泛用于其翻译服务。
图 8:机器翻译显示英语到中文的转换
语义推理和推断
从非结构化文本中推理、推导逻辑和进行推断是自然语言处理(NLP)进步的下一个层次。
图 9:语义推断回答复杂问题
文本摘要
在自然语言处理(NLP)中,一个越来越受欢迎的子领域是将大型文档或文本段落自动总结成易于理解的小型代表性文本。这是 NLP 中一个新兴的研究领域。搜索引擎使用摘要、为专家提供的多文档摘要等,都是从这个领域受益的应用之一。
自动化问答
用自然语言回答人类提出的问题,这些问题从特定领域的具体问题到通用、开放式问题不等,是自然语言处理(NLP)领域另一个新兴的领域。
矿掘非结构化数据的问题
与基于计算机的程序相比,人类更容易阅读、解析和理解非结构化文本/文档。以下是为什么文本挖掘比一般的监督学习或无监督学习更复杂的一些原因:
-
术语和短语的不确定性。单词“bank”有多个含义,人类读者可以根据上下文正确地将其关联起来,但这需要预处理步骤,如词性标注和词义消歧,正如我们所看到的。根据牛津高阶英汉双解大词典,单词“run”在动词形式下就有不少于 645 种不同的用法,我们可以看到这样的单词确实会在解决意图含义(例如,run、put、set 和 take 这些词之间有超过一千种含义)时带来问题。
-
与文本相关的上下文和背景知识。考虑一个使用后缀“gate”来表示政治丑闻的新词,例如,“随着弹劾的呼声和民意调查的急剧下降,Russiagate 最终给他的总统生涯带来了致命一击”。人类读者可以通过联想,通过前缀与另一个美国政治历史上的重大丑闻“Watergate”的关联,推断出“Russiagate”所指的是什么,即回忆起高调阴谋的感觉。这对机器来说尤其难以理解。
-
推理,即从文档中进行推断,是非常困难的,因为将非结构化信息映射到知识库本身就是一大障碍。
-
执行监督学习的能力需要标记的训练文档,并且根据领域,对文档进行标记可能既耗时又昂贵。
文本处理组件和转换
在本节中,我们将讨论在大多数文本挖掘过程中执行的一些常见的预处理和转换步骤。一般概念是将文档转换为具有特征或属性的结构化数据集,这些特征或属性是大多数机器学习算法可以用来执行不同类型学习的基础。
我们将在下一节简要描述一些最常用的技术。文本挖掘的不同应用可能使用以下图中显示的组件的不同部分或变体:
图 10:文本处理组件和流程
文档收集和标准化
在大多数文本挖掘应用中的第一步通常是收集以文档形式存在的数据——在文本挖掘领域通常被称为语料库。这些文档可以与预定义的分类相关联,或者它可能只是一个未标记的语料库。这些文档可以是异构格式,或者为了下一阶段的分词过程而标准化为一种格式。拥有多种格式,如文本、HTML、DOCs、PDGs 等,可能会导致许多复杂性,因此大多数应用中通常首选一种格式,如 XML 或JavaScript 对象表示法(JSON)。
输入和输出
输入是大量同质或异质来源的集合,输出是一组标准化为一种格式(如 XML)的文档集合。
它是如何工作的?
标准化涉及到确保工具和格式基于应用需求达成一致:
-
就标准格式达成一致,如 XML,其中预定义的标签提供了关于文档元属性(如
<author>
、<title>
、<date>
等)和实际内容(如<document>
)的信息。 -
大多数文档处理器都可以转换为 XML,或者可以编写转换代码来执行此操作。
分词
分词的任务是从包含这些单词的文本流中提取单词或有意义的字符。例如,文本The boy stood up. He then ran after the dog可以被分词成标记,如{the, boy, stood, up, he, ran, after, the, dog}。
输入和输出
输入是一组如上一节所述的已知格式的文档,输出是包含所需单词或字符标记的文档。
它是如何工作的?
任何自动化的分词系统都必须解决它预期处理的语言(们)所提出的特定挑战:
-
在像英语这样的语言中,由于存在空白、制表符和换行符来分隔单词,分词相对简单。
-
每种语言都有不同的挑战——即使在英语中,像Dr.这样的缩写、代数字符(B12)、不同的命名方案(O'Reilly)等,也必须适当地分词。
-
编写特定于语言的规则,以 if-then 指令的形式从文档中提取标记。
停用词移除
这涉及到移除没有区分性或预测价值的常用词。如果每个词都可以被视为一个特征,这个过程就会通过显著减少特征向量的维度来降低特征数量。介词、冠词和代词是形成停用词的一些例子,这些停用词被移除,而不会影响许多应用中文本挖掘的性能。
输入和输出
输入是一组已提取标记的文档,输出是一组通过移除停用词来减少标记的文档。
它是如何工作的?
在过去几年中,已经发展出各种技术,从手动预编译的列表到基于术语或互信息的统计消除。
-
对于许多语言来说,最常用的技术是手动预编译的停用词列表,包括介词(in、for、on)、冠词(a、an、the)、代词(his、her、they、their)等等。
-
许多工具使用 Zipf 定律(参考文献 [3]),其中移除了高频词、单音节词和独特术语。Luhn 的早期工作(参考文献 [4]),如图 11 所示,显示了单词频率的上限和下限阈值,这些阈值为我们提供了可用于建模的显著单词:
图 11:单词频率分布,显示了在语料库中频繁使用、显著和罕见单词的存在
词干提取或词形还原
将相似单词的标记归一化为一个的想法被称为词干提取或词形还原。因此,将文档中所有"talking"、"talks"、"talked"等出现归一化到一个根词"talk"的例子就是词干提取。
输入和输出
输入是带有标记的文档,输出是带有减少标记并归一化到其词干或根词的文档。
它是如何工作的?
-
基本上有两种词干提取类型:变化词干提取和根词提取。
-
变化词干提取通常涉及去除词缀,使动词时态正常化并去除复数形式。因此,英语中的"ships"变为"ship","is"、"are"和"am"变为"be"。
-
将词干提取到根词通常比变化词干提取更为激进,后者将单词归一化到其根词。这种例子是"applications"、"applied"、"reapply"等等,都减少到根词"apply"。
-
Lovin 的词干提取算法是第一批词干提取算法之一(参考文献 [1])。Porter 的词干提取,在 20 世纪 80 年代发展起来,有 60 条规则分 6 步进行,仍然是应用最广泛的词干提取形式(参考文献 [2])。
-
当前的应用推动了基于词干提取的广泛统计技术,包括使用 n-gram(给定文本序列中 n 个连续项的连续序列,可以是字母或单词)、隐马尔可夫模型(HMM)和上下文敏感词干提取。
局部/全局字典或词汇表?
一旦执行了将文档转换为标记的预处理任务,下一步就是创建一个语料库或词汇表,作为一个单一的字典,使用所有文档中的所有标记。或者,根据类别创建几个字典,使用较少文档中的特定标记。
在主题建模和文本分类的许多应用中,当按主题/类别创建字典时,即所谓的本地字典,表现良好。另一方面,在文档聚类和信息提取的许多应用中,当从所有文档标记中创建一个单一的全局字典时,表现良好。创建一个或多个特定字典的选择取决于核心 NLP 任务,以及计算和存储需求。
特征提取/生成
将包含非结构化文本的文档(s)转换为具有结构化特征的集合的关键步骤是将它们转换为类似于我们在迄今为止的机器学习数据集中所看到的结构化特征集合。从文本中提取特征以便在机器学习任务中使用,如监督学习、无监督学习和半监督学习,这取决于许多因素,例如应用目标、特定领域的需求以及可行性。可以从任何文档中提取各种特征,例如单词、短语、句子、词性标注的单词、排版元素等。我们将给出在不同的机器学习应用中常用的一系列特征。
词汇特征
词汇特征是文本挖掘应用中最常用的特征。词汇特征是下一级特征的基础。它们是构建在未尝试捕获关于意图或与文本相关的各种含义的信息的简单字符或单词级别的特征。词汇特征可以进一步细分为基于字符的特征、基于单词的特征、词性特征和分类法,例如。在下一节中,我们将更详细地描述其中的一些。
基于字符的特征
单个字符(单语元)或字符序列(n-gram)是从文本文档中可以构建的最简单形式的特征。字符包或单语元字符没有位置信息,而高阶 n-gram 捕获了一定程度的内容和位置信息。这些特征可以用不同的方式编码或赋予数值,例如二进制 0/1 值或计数,如下一节中所述。
让我们以难忘的苏斯博士的韵文作为文本内容——“the Cat in the Hat steps onto the mat”。虽然字符袋(1-gram 或单词特征)将生成唯一的字符{"t","h", "e", "c","a","i","n","s","p","o","n","m"}作为特征,但 3-gram 特征为{"\sCa" ,"\sHa", "\sin" , "\sma", "\son", "\sst", "\sth", "Cat", "Hat", "at\s", "e\sC", "e\sH", "e\sm", "eps", "he\s", "in\s ", "mat", "n\st", "nto", "o\st", "ont", "ps\s", "s\so" , "ste"," t\si"," t\ss" , "tep", "the", "to\s "}。正如所见,随着“n”的增加,特征的数量呈指数增长,很快变得难以控制。n-gram 的优势在于,在增加总特征数量的同时,组装的特征往往似乎捕捉到了比单个字符本身更有趣的字符组合。
基于单词的特征
与从字符生成特征不同,特征也可以以单词和 n-gram 的方式从单词中构建。这些是最流行的特征生成技术。单词或 1-gram 标记也被称为词袋模型。因此,当“the Cat in the Hat steps onto the mat”作为单词特征考虑时,其例子为{"the", "Cat", "in", "Hat", "steps", "onto", "mat"}。同样,同一文本上的二元特征将产生{"the Cat", "Cat in", "in the", "the Hat", "Hat step", "steps onto", "onto the", "the mat"}。与基于字符的特征类似,通过在 n-gram 中增加到更高的“n”,特征的数量增加,但捕捉单词意义的能力也随之增强。
词性标注特征
输入是包含单词的文本,输出是每个单词都与语法标签关联的文本。在许多应用中,词性提供了上下文,并在识别命名实体、短语、实体消歧等方面很有用。在“the Cat in the Hat steps onto the mat”的例子中,输出为{"the\Det", "Cat\Noun", "in\Prep", "the\Det", "Hat\Noun", "steps\Verb", "onto\Prep", "the\Det", "mat\Noun"}。在此过程中,通常使用基于语言规则的标记器或基于马尔可夫链的概率标记器。
分类学特征
从文本数据创建分类法并使用它来理解单词之间的关系在不同情境中也很有用。各种分类学特征,如上位词、下位词、成员、成员-of、部分、部分-of、反义词、同义词、首字母缩略词等,为搜索、检索和许多文本挖掘场景中的匹配提供了有益的词汇上下文。
语法特征
低于文本文档中的字符或单词的下一级特征是基于句法的特征。文本中句子的句法表示通常以句法树的形式出现。句法树捕获句子中使用的术语作为节点,节点之间的关系以链接的形式捕获。句法特征还可以捕获关于句子和使用的更复杂特征——例如聚合——这些特征可用于机器学习。它还可以捕获关于句法树的统计数据——例如句子是左重、右重或平衡——这些数据可用于理解不同内容或作者的签名。
两个句子在词汇分析中可能有相同的字符和单词,但它们的句法树或意图可能完全不同。将文本中的句子分解成不同的短语——名词短语(NP)、介词短语(PP)、动词短语(或动名词短语)VP)等——并捕获句子的短语结构树是这一处理任务的一部分。以下是我们示例句子的句法分析树:
(S (NP (NP the cat)
(PP in
(NP the hat)))
(VP steps
(PP onto
(NP the mat))))
句法语言模型(SLM)是确定术语序列的概率。语言模型特征用于机器翻译、拼写校正、语音翻译、摘要等应用,仅举几例。语言模型还可以在其计算中使用分析树和句法树。
链式法则用于计算句子中术语的联合概率:
在示例 "the cat in the hat steps onto the mat" 中:
通常,由于需要大量此类句子的示例,基于任何语料库使用计数来估计长句的概率是困难的。大多数语言模型在实际实现中采用马尔可夫独立假设和 n-gram(2-5 个单词)(参考文献 [8])。
语义特征
语义特征试图捕捉文本的“意义”,然后用于文本挖掘的不同应用。语义特征的最简单形式之一是对文档添加注释的过程。这些注释或元数据可以包含描述或捕捉文本或文档意图的附加信息。使用协作标记添加标签以捕获描述文本的关键字是常见的语义特征生成过程。
另一种语义特征生成形式是文本的本体表示过程。在知识库中可用的通用和领域特定本体捕获了对象之间不同的关系,并且具有众所周知的规范,例如语义网 2.0。这些本体特征有助于在文本挖掘中推导复杂的推理、摘要、分类和聚类任务。文本或文档中的术语可以映射到本体中的“概念”并存储在知识库中。这些本体中的概念具有语义属性,并以多种方式与其他概念相关联,例如泛化/特殊化、成员-of/是成员、关联等,仅举几例。这些概念或关系的属性或属性可以进一步用于搜索、检索甚至在预测建模中。许多语义特征使用词汇和句法过程作为语义过程的先导,并使用输出,如名词,将其映射到本体中的概念,例如。将概念添加到现有本体或用更多概念对其进行注释,使结构更适合学习。例如,在“the cat in the ..”这个句子中,“cat”具有诸如{age, eats, ...}等属性,并且有不同的关系,如{ "isA Mammal", "hasChild", "hasParent",等等}。
特征表示和相似性
在上一节中描述的词汇、句法和语义特征,通常具有完全不同的表示。同一特征类型的表示,即词汇、句法或语义,可以根据它们被用于的计算或挖掘任务而有所不同。在本节中,我们将描述最常用的基于词汇特征表示,即向量空间模型。
向量空间模型
向量空间模型(VSM)是将非结构化文档转换为数值向量表示的一种转换,其中语料库中的术语形成向量的维度,我们使用某种数值方式将这些维度与值关联。
如在字典章节所述,语料库是由来自一个领域或一个局部子类别中所有文档的独特单词和短语组成的。这样一个字典的每个元素都是向量的维度。这些术语——可以是单个单词或短语,如 n-gram——形成维度,并且在一个给定的文本/文档中可以与它们相关联不同的值。目标是按反映整个语料库中术语(参考文献 [11])的相关性的方式捕获维度中的值。因此,每个文档或文件都表示为一个高维数值向量。由于术语的稀疏性,数值向量表示在数值空间中具有稀疏表示。接下来,我们将介绍一些将这些术语与值关联的知名方法。
二进制
这是最简单的将值关联到术语或维度的形式。在二进制形式中,语料库中的每个术语根据术语在文档中的出现与否被赋予 0 或 1 的值。例如,考虑以下三个文档:
-
文档 1: "The Cat in the Hat steps onto the mat"
-
文档 2: "The Cat sat on the Hat"
-
文档 3: "The Cat loves to step on the mat"
在使用单语元或词袋模型,通过去除停用词{on, the, in, onto}和词干提取{love/loves, steps/step}进行预处理后,{cat, hat, step, mat, sat, love}是语料库的特征。现在每个文档都表示为一个二元向量空间模型,如下所示:
术语 | cat | hat | step | mat | sat | love |
---|---|---|---|---|---|---|
文档 1 | 1 | 1 | 1 | 1 | 0 | 0 |
文档 2 | 1 | 1 | 0 | 0 | 1 | 0 |
文档 3 | 1 | 0 | 1 | 1 | 0 | 1 |
术语频率(TF)
在词频(TF)中,正如其名所示,整个文档中术语的频率构成了特征的数值。基本假设是,术语的频率越高,该术语与文档的相关性就越大。术语的计数或归一化计数被用作每个术语列的值:
tf(t) = count(D, t)
下表给出了我们示例中三个文档的术语频率:
TF / 术语 | cat | hat | step | mat | sat | love |
---|---|---|---|---|---|---|
文档 1 | 1 | 1 | 1 | 1 | 0 | 0 |
文档 2 | 1 | 1 | 0 | 0 | 1 | 0 |
文档 3 | 1 | 0 | 1 | 1 | 0 | 1 |
逆文档频率(IDF)
逆文档频率(IDF)有多种形式,但计算它的最常见方法是使用以下方法:
这里,
IDF 主要青睐那些在文档中相对不常出现的术语。研究(参考文献 [7])中也提出了对 IDF 的一些基于经验动机的改进。
TF 对于我们示例语料库:
术语 | cat | hat | step | mat | sat | love |
---|---|---|---|---|---|---|
N/nj | 3/3 | 3/2 | 3/2 | 3/2 | 3/1 | 3/1 |
IDF | 0.0 | 0.40 | 0.40 | 0.40 | 1.10 | 1.10 |
术语频率-逆文档频率(TF-IDF)
将术语频率和逆文档频率结合在一个指标中,我们得到术语频率-逆文档频率值。其思想是重视那些在语料库中相对不常见(高 IDF),但对于文档来说相对相关(高 TF)的术语。TF-IDF 是许多文本挖掘过程中最常见的值关联形式:
这为我们提供了每个文档中所有术语的 TF-IDF 值:
TF-IDF/术语 | cat | hat | step | mat | sat | love |
---|---|---|---|---|---|---|
文档 1 | 0.0 | 0.40 | 0.40 | 0.40 | 1.10 | 1.10 |
文档 2 | 0.0 | 0.40 | 0.0 | 0.0 | 1.10 | 0.0 |
文档 3 | 0.0 | 0.0 | 0.40 | 0.40 | 0.0 | 1.10 |
相似度度量
监督学习、无监督学习和半监督学习中的许多技术在其底层算法中使用“相似度”度量来寻找相似模式或分离不同模式。相似度度量与数据的表示紧密相关。在文档的 VSM 表示中,向量是高维且稀疏的。这在分类、聚类或信息检索的大多数传统相似度度量中提出了一个严重问题。基于角度的相似度度量,如余弦距离或 Jaccard 系数,在实践中更常被使用。考虑由 t[1] 和 t[2] 表示的两个向量,它们对应于两个文本文档。
欧几里得距离
这是文档特征空间中的 L2 范数:
余弦距离
这种基于角度的相似度度量仅考虑向量之间的方向,而不考虑它们的长度。它等于向量之间角度的余弦值。由于向量空间模型是一个正空间,余弦距离从 0(正交,没有共同项)变化到 1(所有项都是两个文档共有的,但不一定是相同的词频):
成对自适应相似度
这种度量通过仅考虑两个文档中最重要的特征来在降维特征空间中测量距离:
这里,t[i,k] 是由 t[i] (i = 1, 2) 的特征子集形成的向量,包含 t[1] 和 t[2] 中出现的 K 个最大特征的并集。
扩展 Jaccard 系数
这种度量是文档之间共享项与项的并集之比:
Dice 系数
Dice 系数由以下公式给出:
特征选择和降维
目标与第二章 实际应用中的监督学习 和第三章 无监督机器学习技术 中的目标相同。随着文本挖掘和高维特征的出现,维度诅咒问题变得更加明显。
特征选择
大多数特征选择技术是监督技术,依赖于标签或结果来评分特征。在大多数情况下,我们执行基于过滤器的特征选择而不是基于包装器的特征选择,因为性能成本较低。即使在基于过滤器的方 法中,一些方法,如第二章中描述的涉及多元技术的方法,如基于相关性的特征选择(CFS),也可能因为高维性而成本高昂或导致次优性能(参考文献 [9])。
信息论技术
如第二章所示,实际应用中的监督学习方法,在预处理和特征提取完成后,基于过滤器的单变量特征选择方法,如信息增益(IG)和增益比率(GR),是最常用的。
在他们的研究中,Yang 和 Pederson(参考文献 [10])清楚地展示了使用 IG 进行特征选择和降低,可以移除近 98%的术语,同时提高分类器的预测能力。
许多基于信息论或熵的方法具有更强的边际概率影响。当术语具有相等的条件概率 P(t|class)时,这可能会成为一个问题,即较不常见的术语可能比常见术语有更好的得分。
基于统计的技术
卡方特征选择是文本挖掘中用于特征选择的最常见的基于统计的技术之一。卡方统计量,如第二章所示,实际应用中的监督学习方法,给出了文本中的标记与类别之间的独立性关系。
已有研究表明,当存在低频项时,特征选择的卡方统计量可能并不有效(参考文献 [19])。
基于频率的技术
使用特征表示部分中描述的词频或文档频率,可以手动设置一个阈值,并且只允许高于或低于一定阈值的术语用于分类或聚类任务中的建模。请注意,词频(TF)和文档频率(DF)方法倾向于常见词汇,而一些基于信息论或统计的方法则倾向于不常见词汇。特征选择的选择取决于领域、特定预测学习的应用,以及更重要的是,使用这些特征的模型如何评估,尤其是在未见数据集上的评估。
维度降低
在第三章中,我们看到了另一种方法,即使用无监督技术通过某种形式的转换来减少特征,以决定其有用性。
主成分分析(PCA)从文档-词矩阵计算协方差或相关矩阵。它将数据转换成输入中术语的线性组合,使得转换后的特征或术语组合具有比输入术语更高的区分能力。PCA 在转换特征上使用截止值或阈值,如第三章中所示(ch03.html "第三章。无监督机器学习技术"),可以显著降低维度,甚至提高或与高维输入空间具有可比的性能。使用 PCA 的唯一问题是转换后的特征不可解释,对于理解哪些术语或组合产生更好的预测模型,这种技术在某些领域有限制。
潜在语义分析(LSA)是另一种使用从词和文档构建的输入矩阵并将其转换为具有通过文档中使用的术语组合发现的潜在概念的低维度的方法(参考文献 [5])。以下图展示了使用奇异值分解(SVD)方法对输入文档-词矩阵进行因式分解的过程:
图 12:输入文档-词向量的 SVD 分解和 LSA 文档向量以及 LSA 词向量
LSA 已被证明是一种非常有效的降低维度并提高模型预测性能的方法。LSA 的缺点是需要存储向量 U 和 V 以执行检索或查询。确定较低维度 k 是困难的,需要一些类似于第三章中讨论的 k-means 的启发式方法。
文本挖掘中的主题
正如我们在第一部分所看到的,文本挖掘和文本上的机器学习涵盖了广泛的主题。每个讨论的主题都有对主流算法的一些定制,或者在该领域已经开发出特定的算法来执行所需的任务。我们选择了四个广泛的主题,即文本分类、主题建模、文本聚类和命名实体识别,并将对每个主题进行一些详细的讨论。
文本分类/分类
文本分类问题在不同的应用中表现出来,例如文档过滤和组织、信息检索、意见和情感挖掘、电子邮件垃圾邮件过滤等。与第二章中讨论的分类问题类似,即《面向现实世界监督学习的实用方法》,其基本思想是在带有标签的训练数据上训练,并预测未见文档的标签。
如前文所述,预处理步骤有助于将非结构化的文档集合转换成以文档-词矩阵形式排列的已知数值或分类/二进制结构化数据。是否执行某些预处理步骤,例如词干提取或自定义停用词,取决于数据和应用程序。特征选择通常是基本的词汇特征,单词的 n-gram 作为术语,只有在某些情况下,我们才使用整个文本作为字符串,而不将其分解成术语或标记。对于文档-词结构化数据,通常使用二进制特征表示或基于频率的表示。一旦这种转换完成,我们就使用单变量分析,如信息增益或卡方检验,来选择得分高于一定阈值的判别特征。在许多应用中,也可以执行特征转换和降维,如 PCA 或 LSA。
一旦我们从前面的过程中得到结构化数据,选择分类器的范围就非常广泛。在研究和商业应用中,我们看到大多数常见的建模技术都被使用,包括线性(线性回归、逻辑回归等)、非线性(SVM、神经网络、KNN)、生成性(朴素贝叶斯、贝叶斯网络)、可解释性(决策树、规则)和基于集成(bagging、boosting、随机森林)的分类器。许多算法使用相似度或距离度量,其中余弦距离是最受欢迎的选择。在某些分类器中,如 SVM,文档的字符串表示可以直接使用,通过选择合适的字符串核和基于字符串的相似度度量来计算点积。
验证和评估方法与监督分类方法类似——将数据分为训练/验证/测试集,在训练数据上训练,在验证数据上调整算法的参数,并在保留或测试数据上估计模型的性能。
由于大多数文本分类涉及大量文档,且目标类别很少见,因此用于评估、调整或选择算法的指标通常是精确度、召回率和 F 分数,如下所示:
主题建模
主题是一个固定词汇表上的分布。主题建模可以定义为捕捉各种文档中不同核心思想或主题的能力。这有广泛的应用范围,例如文档摘要、理解情感、趋势、新闻等。以下图示展示了主题建模如何从语料库中识别用户指定的主题数量k,然后为每个文档分配比例,表示文档中每个主题出现的程度:
图 13:文档的概率主题权重分配
文献中关于使用监督和无监督学习进行主题建模的技术有很多(参考文献 [13])。我们将讨论最常见的技术,即概率潜在语义索引(PLSI)。
概率潜在语义分析(PLSA)
PLSA 的想法,类似于用于特征降维的 LSA,是通过发现共现术语之间的关联,并将文档视为这些概念的混合物来寻找语料库中隐藏的潜在概念。这是一种无监督技术,类似于降维,但其目的是用它来模拟文档中的主题或潜在概念的混合(参考文献 [12])。
如以下图所示,模型可能会将语料库中经常一起出现的术语与一个潜在概念关联起来,然后每个文档可以被认为在较小或较大的程度上表现出该主题:
图 14:棒球潜在概念图,捕捉文档与相关术语之间的关联
输入和输出
输入如下:
-
按照一定格式和结构组织的文档集合。我们将给出以下符号:
-
需要建模或发现的主题数量k。
输出如下:
-
识别k个主题,T = {T[1], T[2],…T[k]}。
-
对于每个文档,给定文档d[i]的主题覆盖范围可以表示为 = {p[i1], p[i2], …p[ik]},其中p[ij]是文档di 覆盖主题 T[j]的概率。
它是如何工作的?
PLSA 的实现通常遵循以下步骤:
-
基本预处理步骤,如之前所述,包括分词、去除停用词、词干提取、构建词汇表、特征提取(单词或 n-gram 等)以及特征选择(无监督技术),如有必要,则执行这些步骤。
-
该问题可以简化为估计文档中术语的分布,并给定分布,根据与主题对应的最大术语选择主题。
-
引入一个“潜在变量”z帮助我们选择一个术语是否属于一个主题。请注意,z不是“观察到的”,但我们假设它与从主题中选择术语有关。因此,给定文档t的术语t的概率可以用这个潜在变量表示:
-
通过使用两组变量(?, p),方程可以写成:
在这里,p(t|z; ?)是术语中的潜在概念的概率,p(z|d; p)是文档特定混合中潜在概念的概率。
-
使用对数似然估计参数以最大化:
-
由于这个方程涉及非凸优化,EM 算法通常用于迭代寻找参数,直到收敛或完成总迭代次数(参考文献 [6]):
-
EM 算法的 E 步骤用于确定潜在概念的后验概率。文档 d 中术语 t 出现的概率可以用潜在概念 z 来解释:
-
EM 算法的 M 步骤使用从 E 步骤获得的价值,即 p(z|d, t),并进行参数估计:
-
= 术语t与概念z关联的频率:
-
= 文档d与概念z关联的频率。
-
优点和局限性
优点和局限性如下:
-
尽管广泛使用,PLSA 也有一些缺点,这些缺点已被更近期的技术所克服。
-
该算法的无监督性质及其通用适用性使其能够应用于各种类似的文本挖掘应用,例如聚类文档、关联作者/时间相关的主题等。
-
使用 EM 算法的 PLSA,如前几章所述,面临“陷入局部最优”的问题,这与其他全局算法,如进化算法不同。
-
PLSA 算法只能在已知文档中执行主题识别,但不能进行任何预测建模。PLSA 已被推广,并被称为潜在狄利克雷分配(LDA)以克服这一点(参考文献 [14])。
文本聚类
聚类的目标,如第三章中所述的“无监督机器学习技术”,是找到组内彼此相似的数据、文本或文档。非结构化数据的粒度可以从短语或句子、段落和文本段落到文档集合不等。文本聚类在许多领域都有应用,例如信息检索、摘要、主题建模和无监督情况下的文档分类,仅举几例。一旦通过预处理将非结构化文本数据转换为结构化数据,就可以使用传统的聚类技术。传统聚类技术的困难在于使用转换后的文档-术语矩阵表示获得的具有高维和稀疏性的数据集。许多传统的聚类算法仅适用于特征的数值。由于这种限制,不能使用术语的分类或二进制表示,通常使用 TF 或 TF-IDF 来表示文档-术语矩阵。
在本节中,我们将讨论聚类中的一些基本过程和技术。我们将从预处理和转换开始,然后讨论一些广泛使用的技术及其修改。
特征转换、选择和减少
本节中讨论的大多数预处理步骤通常用于获取文档中术语的单词或 n-gram 表示。降维技术,如 LSA,通常用于将特征转换为更小的潜在空间。
聚类技术
文本聚类的技术包括概率模型以及使用基于距离的方法,这些方法在我们学习结构化数据时是熟悉的。我们还将讨论非负矩阵分解(NNMF)作为一种具有良好性能和可解释性的有效技术。
生成概率模型
在生成方法中,主题建模和文本聚类之间存在共性。如图所示,聚类将一个文档与单个聚类(通常)关联起来,而主题建模中每个文档可以在多个主题中具有覆盖概率。主题建模中的每个词可以由多个主题独立生成,而在聚类中,所有词都来自同一个聚类:
图 15:文档到 K-聚类的独占映射
从数学上讲,这可以用两个主题 T = {T[1],T[2]}和两个聚类 c = {c[1],c[2]}来解释。
在聚类中,文档的可能性可以表示为:
如果文档有 L 个术语,这可以进一步展开为:
因此,一旦“假设”一个簇,所有单词都来自该簇。计算所有术语的乘积,然后对所有簇进行求和。
在主题建模中,文档的似然可以表示为:
因此,每个术语 ti 可以独立地从主题中选择,因此求和是在内部进行的,而乘积是在外部进行的。
输入和输出
输入是:
-
以以下符号表示的遵循一定格式和结构的文档集合:
D = {d1, d2, … dn}
-
需要建模或发现的簇数k。
输出如下:
-
k个识别出的簇 c = {c[1], c[2], … c[k]}。
-
对于每个文档,p(d[i])被映射到簇k中的一个。
如何工作?
这里是步骤:
-
基本预处理步骤,如之前所述,包括分词、去除停用词、词干提取、形成词汇表、术语的特征提取(单词或 n-gram 等),以及特征转换(LSA)甚至特征选择。令t为最终特征集中的术语;它们对应于词汇表或词汇
。
-
与 PLSA 类似,我们引入一个“潜在变量”,z,帮助我们选择文档所属的簇是否落在z={1, 2, … k}的范围内,对应于簇。令?参数为我们为每个潜在变量估计的参数,使得p(?[i])对应于簇z = i的概率。
-
文档属于簇的概率由p(?[i])给出,并且从该簇生成的文档中的每个术语由p(t|?[i])给出。似然方程可以写成:
注意,我们不是通过文档进行,而是用词汇表
中术语t出现的次数作为指数重新编写。
-
以与我们之前使用的方法类似的方式执行 EM 算法来估计参数,如下所示:
-
EM 算法的 E 步用于推断文档生成的簇:
-
EM 算法的 M 步用于使用 E 步的结果重新估计参数,如下所示:
-
-
对于每个文档的最终概率估计可以使用最大似然估计或使用具有先验概率的贝叶斯算法,如下所示:
或
优点和局限性
-
基于生成的模型与 LSA 和 PLSA 有类似的优点,我们为簇中的文档得到一个概率分数。通过应用领域知识或先验知识,使用簇的大小,可以对分配进行进一步的微调。
-
与 EM 算法相关的缺点,即陷入局部最优和敏感于起始点,在这里仍然成立。
基于距离的文本聚类
大多数基于距离的聚类算法依赖于相似度或距离度量,用于确定实例在特征空间中的距离。通常在具有数值数据的数据集中,欧几里得距离或其变体工作得非常好。在文本挖掘中,即使在将非结构化文本转换为具有数值值的结构化特征项之后,也发现余弦和 Jaccard 相似度函数表现更佳。
通常,如第三章中讨论的聚合或层次聚类,无监督机器学习技术,用于根据相似性合并文档,如前所述。合并文档或组通常使用单链接、组平均链接和完全链接技术。聚合聚类还产生一个可用于信息检索和文档搜索的结构。
基于划分的聚类技术 k-means 和 k-medoids,伴随着一个合适的相似度或距离方法也被采用。k-means 的问题,如聚类技术讨论中所示,是对起始条件的敏感性,以及计算空间和时间。k-medoids 对稀疏数据结构敏感,并且也有计算空间和时间限制。
非负矩阵分解(NMF)
非负矩阵分解是另一种将大型数据-特征矩阵分解为两个非负矩阵的技术,这不仅执行降维,而且更容易检查。NMF 在文档聚类中获得了流行,现在已证明许多具有不同优化函数的 NMF 变体在聚类文本方面非常有效(参考文献 [15])。
输入和输出
输入为:
-
按照给定符号的格式和结构组织的一组文档:
D =
-
需要建模或发现的簇的数量为k。
输出结果为:
- 识别 k 个簇,c = {c[1],c[2],… c[k]},文档分配到簇中。
它是如何工作的?
NMF 的数学细节和解释如下:
-
NMF 背后的基本思想是使用低秩近似分解输入矩阵,如下所示:
-
使用如下非线性优化函数:
在 W 或 H 中是凸的,但不是两者都是,因此无法保证全局最小值。各种使用约束最小二乘法(如均方误差和梯度下降)的算法被用来解决优化函数。
-
NMF 的解释,特别是在基于术语理解潜在主题方面,使其非常有用。术语和文档的输入 A[m x n],可以用低秩近似表示为 W[m x k] H[k x n] 矩阵,其中 W[m x k] 是术语-主题表示,其列是 NMF 基向量。W 的第 1 列的非零元素,由 W[1] 给出,对应于特定的术语。因此,w[ij] 可以解释为关于术语 j 的基向量 W[i]。H[i1] 可以解释为文档 1 给定的文档对主题向量 W[i] 方向的亲和力。
-
从论文(参考文献 [18])中清楚地展示了为医学摘要(称为 Medlars 数据集)获得的基向量,这些基向量具有高度的解释性。这些基向量中最权重的术语直接对应于概念,例如,W[1] 对应于与“心脏”相关的主题,而 W[5] 与“发育障碍”相关。
图 16:来自 Langville 等人(2006)的展示,用于解释医疗数据集的一些基向量。
优点和局限性
NMF 已被证明在信息检索和查询方面与顶级算法(如 LSI)几乎性能相当:
-
与使用 SVD 的 LSA 或 LSI 相比,NMF 在可扩展性、计算和存储方面表现更好。
-
NMF 存在一个问题,即优化不是全局的,并且会陷入局部最小值。
-
NMF 因素的产生取决于优化算法和选择的参数,并且不是唯一的。
文本聚类的评估
在标记数据集的情况下,第三章 中讨论的所有外部度量,如 F 度量和 Rand 指数,对于评估聚类技术是有用的。当数据集没有标签时,可以采用一些描述为内部度量的技术,如 Davies–Bouldin 指数、R-Squared 和 Silhouette 指数。
一般的良好实践是适应并确保在应用于文本挖掘数据时,如本节所述,文档之间的相似性用于测量簇的接近度、距离和分布。类似的使用取决于算法,并且与问题也有一定的相关性。在基于距离的划分算法中,可以使用均值向量或质心来计算文档的相似性。在层次算法中,可以使用组中最相似或最不相似的文档来计算相似性。
命名实体识别
命名实体识别(NER)是文本挖掘中信息检索最重要的主题之一。许多复杂的挖掘任务,如关系的识别、事件的标注以及实体之间的相关性,都将 NER 作为初始组件或基本预处理步骤。
从历史上看,手动基于规则和正则表达式的技术被用于实体识别。这些手动规则依赖于基本的预处理,使用词性标注作为特征,以及手工设计的特征,如大写单词的存在、单词前的标点符号使用等。
基于统计学习的技巧现在更多地用于 NER 及其变体。NER 可以被映射到机器学习中的序列标注和预测问题。BIO 表示法,其中每个实体类型 T 有两个标签 B-T 和 I-T,分别对应于开始和中间,被标注,学习涉及在未见数据中找到模式和预测它。O 代表文本序列中的外部或不相关实体。实体类型 T 在基本形式上进一步被分类为人物、组织、数据和地点。
在本节中,我们将讨论两种最常用的算法:基于生成模型的隐马尔可夫模型和基于判别模型的最大熵模型。
虽然我们是在讨论命名实体识别的上下文中这些算法,但相同的算法和过程也可以用于其他 NLP 任务,如词性标注(POS Tagging),其中标签与一个序列相关联,而不是与 NER 类别相关联。
命名实体识别的隐马尔可夫模型
隐马尔可夫模型,如第六章《概率图建模》中所述,是基于序列的生成模型,它假设存在一个生成序列的潜在分布。通过用正确的 NER 类别标注序列获得训练数据可以用来学习分布和参数,以便对于未见未来的序列,可以执行有效的预测。
输入和输出
训练数据由文本序列 x = {x[1], x[2], ... x[n]}组成,其中每个 xi 是文本序列中的一个词,每个词的标签作为 y = {y[1], y[2], ... y[n]}提供。算法生成一个模型,以便在测试未见数据时,可以生成新序列的标签。
如何工作?
-
在最简单的情况下,假设马尔可夫假设,即序列的隐藏状态和标签仅依赖于前一个状态。对带标签的单词序列的适应在以下图中展示:
图 17:隐马尔可夫链中 NER 对应的文本序列和标签
-
序列分类的 HMM 公式有助于在训练数据上估计最大化的联合概率:
-
每个 y[i]被假定为基于 y[i–1]和 x[i]生成的。实体的第一个单词是在当前和前一个标签的条件下生成的,即 y[i]和 y[i–1]。如果实例已经是命名实体,则条件仅基于前一个实例,即 x[i–1]。像"visited"和"in"这样的外部单词被认为是"非名称类别"。
-
使用前向-后向算法的 HMM 公式可以用来确定从训练数据中学习到的参数的观察序列的概率。
优点和局限性
优点和局限性如下:
-
HMM 对于短序列很好,如图所示,只有一个单词或术语,并且假设独立性。对于具有较长实体范围的序列,结果将违反这些假设。
-
HMM 需要大量的训练数据来估计参数。
命名实体识别的最大熵马尔可夫模型
最大熵马尔可夫模型(MEMM)是一种流行的命名实体识别(NER)技术,它利用马尔可夫链和最大熵模型的概念来学习和预测命名实体(参考[16]和[17])。
输入和输出
训练数据由文本序列 x={x1,x2,... xn}组成,其中每个 xi 是文本序列中的一个单词,每个单词的标签作为 y={y1,y2,... yn}可用。算法生成模型,以便在测试未见数据时,可以生成新序列的标签。
它是如何工作的?
以下说明了 MEMM 方法是如何用于学习命名实体的。
-
MEMM 中的特征可以是单词特征或其他类型的特征,如"isWordCapitalized"等,这给它提供了一点更多的上下文,并且与仅基于单词的 HMM 相比,提高了性能。
-
接下来,让我们看看一种称为最大熵模型(MaxEnt 模型)的最大熵模型,它是一个指数概率模型,但也可以被视为多项式逻辑回归模型。在基本的 MaxEnt 模型中,给定特征{f[1],f[2]…f[N]}和类别 c[1],c[2]…c[C],使用从训练数据中得到的优化方法为每个类别学习这些特征的权重{w[c1],w[c2]…w[cN]},可以估计特定类别的概率如下:
-
特征 fi 正式表示为 fi,这意味着对于类别 c 和观察 x 的特征 f[i]。在大多数 NER 模型中,fi 通常是二元的,值为 1/0。因此,它可以写成:
基于预测概率跨类最大似然可以用来选择单个类别:
-
对于每个单词,我们使用当前单词、"附近"单词的特征以及附近单词的预测来创建一个联合概率模型。这也被称为局部学习,因为测试和分布的块是在与单词对应的局部特征周围学习的。
从当前单词和最后预测中,我们可以从数学上看到如何创建一个判别模型:
对于 k 个特征进行泛化:
-
因此,在 MEMM 中,我们计算状态的概率,即命名实体识别(NER)中的类别,尽管我们基于 y[i–1]给出的邻近单词的预测进行条件化,但通常我们可以使用更多特征,这就是相对于之前讨论的 HMM 模型的优势:
图 18:带标签的文本序列和观察概率
-
维特比算法用于在 HMM 中对单词或解码/推理进行类别估计,即得到 p(y[i]|y[i–1], X[i])的估计
-
最后,使用状态变化的优化方法,MaxEnt 模型被用来估计权重,就像之前一样:
优点和局限性
-
MEMM 在使用特征方面具有更大的灵活性,这些特征不仅基于单词,甚至不是由人类设计的,这使得它更加丰富,并使其模型具有更强的预测能力。
-
MEMM 可以检测比 HMM 更大的跨度,具有比 HMM 更大的检测优势。
深度学习和 NLP
在过去几年中,深度学习和其在自然语言处理(NLP)各个领域的应用取得了巨大成功,被认为是当今技术的尖端。使用深度学习的主要优势在于一小部分工具和方法,这些工具和方法在广泛的 NLP 问题中都很有用。它通过自动学习来解决特征工程和精心创建的手动表示的基本问题,从而解决了需要大量语言专家处理广泛问题的问题,例如文本分类、情感分析、词性标注和机器翻译等。在本节中,我们将尝试涵盖深度学习和 NLP 领域的重要概念和研究。
在他的开创性论文中,Bengio 介绍了深度学习最重要的构建块之一,称为词嵌入或词向量(参考文献 [20])。词嵌入可以被定义为将单词映射到高维向量(通常基于应用,25 到 500 维)的参数化函数。
形式上,这可以写成。
例如,和
,等等。
一个神经网络(R),其输入是句子中的单词或句子的 n-gram,用于二分类,例如 n-gram 中单词序列是否有效,用于训练和学习W和R:
图 19:一个模块化神经网络学习 5-gram 单词进行有效-无效分类
例如:
-
R(W(cat),W(sat ),W(on),W(the),W(mat)) = 1(有效)
-
R(W(cat),W(sat),W(on),W(the),W(mat)) = 0 (无效)
训练这些句子或 n-gram 的想法不仅是为了学习短语的正确结构,也是为了学习W和R的正确参数。单词嵌入也可以使用第三章中介绍的线性和非线性特征降维/可视化技术投影到低维空间,例如二维空间,这些技术人类可以轻松可视化。使用 t-SNE 等技术将单词嵌入在二维空间中的可视化揭示了基于语义意义单词的接近性以及该区域单词的聚类信息,如下所示图所示:
图 20:整个单词映射的小部分 t-SNE 表示。罗马数字和单词在左侧聚集在一起显示,而语义相近的单词在右侧聚集在一起。
进一步扩展这些概念,Collobert 和 Mikolov 都展示了学习单词嵌入的副作用在多种 NLP 任务中非常有用,例如相似短语学习(例如,W("the color is red") ? W("the color is yellow")),寻找同义词(例如,W("nailed") ? W("smashed")),类比映射(例如,W("man")?W("woman")然后 W("king")?W("queen")),甚至复杂的关联映射(例如,W("Paris")?W("France")然后 W("Tokyo")?W("Japan")) (参考文献 [21 和 22])。
将单词嵌入概念扩展到一种通用表示,帮助我们以(稍作扩展)的方式重用该表示来解决各种 NLP 问题,这是许多最近深度学习在 NLP 中取得成功的主要原因。Socher 在他的研究中将单词嵌入概念扩展到产生双语单词嵌入,即把来自两种不同语言的单词,如中文(普通话)和英语嵌入到一个共享空间中 (参考文献 [23])。通过独立学习两种语言的单词嵌入,然后将它们投影到同一个空间,他的工作为我们提供了关于跨语言单词相似性的有趣见解,这些见解可以扩展到机器翻译。Socher 还就使用 CNN 学习到的图像与单词嵌入投影到同一个空间进行了有趣的工作,以将单词与图像关联起来作为一个基本的分类问题 (参考文献 [24])。大约在同一时间,谷歌也在研究类似的概念,但规模更大,用于单词-图像匹配和学习 (参考文献 [26])。
将词嵌入概念扩展到具有组合器或关联模块,这些模块可以帮助组合所有组合的词语、词语-短语、短语-短语,以学习复杂句子,这是递归神经网络(Recursive Neural Networks)的理念。以下图示展示了如何使用递归神经网络学习复杂的关联 ((the cat)(sat(on (the mat))))。它还由于递归组合的能力而消除了神经网络中“固定”输入数量的限制:
图 21:递归神经网络展示了如何学习复杂短语。
递归神经网络在 NLP 任务中显示出巨大的潜力,例如情感分析,其中许多正面词语开头的单个负面词语会对句子产生整体负面的影响,如下图所示:
图 22:一个复杂的句子,展示了通过 RNN 连接的带有负面(红色圆圈)、正面(绿色圆圈)和中立(空,0)的词语,整体呈现负面情感。
现在通过编码器和解码器的构建块扩展递归神经网络的概念,以学习可逆的句子表示——即从输入句子中重建具有大致相同意义的原始句子(参考文献 [27])。这已成为神经机器翻译背后的核心主题。使用 RNN 的编码器-解码器框架建模对话也取得了巨大的突破(参考文献 [28])。
工具和用法
我们现在将讨论一些在 Java 中用于各种 NLP 和文本挖掘应用的最知名的工具和库。
Mallet
Mallet 是一个用 Java 编写的机器学习工具包,用于文本处理,附带几个自然语言处理库,包括一些用于文档分类、序列标记和主题建模的库,以及各种机器学习算法。它是开源的,在 CPL 下发布。Mallet 提供了一个广泛的 API(见以下截图),用于创建和配置“管道”序列以进行预处理、向量化、特征选择等,以及扩展分类和聚类算法的实现,以及一系列其他文本分析和机器学习功能。
KNIME
KNIME 是一个具有 OpenGL 许可的开源分析平台,提供了一系列强大的工具,用于执行数据科学的各个方面。文本处理模块可以从 KNIME Labs 单独下载。KNIME 具有直观的拖放 UI,并提供从其工作流服务器下载的示例。
注意
KNIME: www.knime.org/
KNIME Labs: tech.knime.org/knime-text-processing
该平台包括一个节点仓库,其中包含所有必要的工具,可以方便地通过节点的嵌套组合您的流程,这些节点可以很容易地通过复制粘贴来重复使用。工作流程的执行很简单。调试错误可能需要一些习惯,因此我们的建议是使用文本挖掘示例,使用不同的数据集作为输入,并确保工作流程无错误执行。这是熟悉平台的最快方式。
使用 Mallet 进行主题建模
现在我们将展示如何使用 API 和 Java 代码实现主题建模,以向用户展示如何在 Java 中构建一个文本学习流程:
//create pipeline
ArrayList<Pipe> pipeList = new ArrayList<Pipe>();
// Pipes: lowercase, tokenize, remove stopwords, map to features
pipeList.add( new CharSequenceLowercase() );
pipeList.add( new CharSequence2TokenSequence(Pattern.compile("\\p{L}[\\p{L}\\p{P}]+\\p{L}")) );
pipeList.add( new TokenSequenceRemoveStopwords(new File("stopReuters/en.txt"), "UTF-8", false, false, false) );
//add all
pipeList.add( new TokenSequence2FeatureSequence() );
InstanceList instances = new InstanceList (new SerialPipes(pipeList));
//read the file
Reader fileReader = new InputStreamReader(new FileInputStream(new File(reutersFile)), "UTF-8");
instances.addThruPipe(new CsvIterator (fileReader, Pattern.compile("^(\\S*)[\\s,]*(\\S*)[\\s,]*(.*)$"),
3, 2, 1)); // name fields, data, label
Mallet 中的 ParallelTopicModel 具有一个 API,包含如主题数量、alpha 和 beta 等参数,这些参数控制着使用 Dirichlet 分布调整 LDA 的底层参数。并行化得到了很好的支持,正如系统中可用的线程数量增加所显示的那样:
ParallelTopicModel model = new ParallelTopicModel(10, 1.0, 0.01);//10 topics using LDA method
model.addInstances(instances);//add instances
model.setNumThreads(3);//parallelize with threading
model.setNumIterations(1000);//gibbs sampling iterations
model.estimate();//perform estimation of probability
主题和术语关联如下截图所示,是运行 Mallet 中的 ParallelTopicModel 的结果。很明显,在许多情况下,如 exec、acq、wheat、crude、corn 和 earning 等类别,顶级术语和主题的关联都得到了很好的发现:
商业问题
Reuters 语料库将每个文档标记为 10 个类别之一。本案例研究的实验目的是利用本章学到的文本处理技术,通过向量空间模型为这些文档提供结构。这是以三种不同的方式完成的,并且使用了四种分类算法来训练和预测在每个案例中转换后的数据集。开源 Java 分析平台 KNIME 用于文本处理和学习。
机器学习映射
在无结构数据的学习技术中,例如文本或图像,给定带有标签的训练集将数据分类到不同的类别是一个监督学习问题。然而,由于数据是无结构的,一些统计或信息论方法对于从数据中提取可学习特征是必要的。在本研究的构思中,我们在使用线性、非线性以及集成方法进行分类之前,对文档进行了特征表示和选择。
数据收集
实验中使用的数据集是来自 UCI 机器学习仓库的 Reuters-21578 Distribution 1.0 文本分类数据集的一个版本:
注意
Reuters-21578 数据集:archive.ics.uci.edu/ml/datasets/Reuters-21578+Text+Categorization+Collection
该数据集是一个包含 9,981 个文档的 Modified-Apte 分割,每个文档都有一个类别标签,指示文档的类别。数据集中有 10 个不同的类别。
数据采样和转换
在导入数据文件后,我们进行了一系列预处理步骤,以便在训练任何模型之前丰富和转换数据。这些步骤可以在 KNIME 创建的工作流程快照中看到。它们包括:
-
标点符号擦除
-
N 字符过滤(移除长度小于四个字符的标记)
-
数字过滤
-
案例转换 - 将所有内容转换为小写
-
停用词过滤
-
词干提取
在学习步骤之前,我们将数据随机分为 70-30 的比例进行训练和测试。每个实验中使用了五折交叉验证。
上述截图显示了第一个实验集的工作流程,它使用特征的二进制向量。数据导入后,一系列预处理节点随后,数据集被转换为文档向量。在添加回目标向量后,工作流程分支为四个分类任务,每个任务使用五折交叉验证设置。结果在评分节点中汇总。
特征分析和降维
我们总共进行了三组实验。在第一组中,预处理后,我们使用了术语的二进制向量化,这添加了一个表示术语是否出现在文档中的表示:
在第二次实验中,我们使用了每个术语的相对词频(TF)值,结果在 0 到 1 之间。
在第三组中,我们通过过滤掉相对 TF 分数小于 0.01 的术语来进行特征选择。
模型、结果和评估
对于这三组实验中的每一组,我们使用了两种线性分类器(朴素贝叶斯和线性核的 SVM)以及两种非线性分类器(决策树和以朴素贝叶斯为基础学习器的 AdaBoost)。在文本挖掘分类中,通常选择精确率/召回率指标作为评估指标,而不是准确率,后者在传统的、平衡的分类问题中更为常见。
三组实验的结果在表中给出。分数是所有类别的平均值:
二进制术语向量:
分类器 | 召回率 | 精确率 | 灵敏度 | 特异性 | F 度量 | 准确率 | 科亨κappa 系数 |
---|---|---|---|---|---|---|---|
基于朴素贝叶斯 | 0.5079 | 0.5281 | 0.5079 | 0.9634 | 0.5087 | 0.7063 | 0.6122 |
决策树 | 0.4989 | 0.5042 | 0.4989 | 0.9518 | 0.5013 | 0.7427(2) | 0.6637(2) |
AdaBoost(NB) | 0.5118(2) | 0.5444(2) | 0.5118(2) | 0.9665(2) | 0.5219(2) | 0.7285 | 0.6425 |
LibSVM | 0.6032(1) | 0.5633(1) | 0.6032(1) | 0.9808(1) | 0.5768(1) | 0.8290(1) | 0.7766(1) |
相对 TF 向量:
分类器 | 召回率 | 精确率 | 灵敏度 | 特异性 | F 度量 | 准确率 | 科亨κappa 系数 |
---|---|---|---|---|---|---|---|
朴素贝叶斯 | 0.4853 | 0.5480(2) | 0.4853 | 0.9641 | 0.5113(2) | 0.7248 | 0.6292 |
决策树 | 0.4947(2) | 0.4954 | 0.4947(2) | 0.9703(2) | 0.4950 | 0.7403(2) | 0.6612(2) |
AdaBoost(NB) | 0.4668 | 0.5326 | 0.4668 | 0.9669 | 0.4842 | 0.6963 | 0.6125 |
LibSVM | 0.6559(1) | 0.6651(1) | 0.6559(1) | 0.9824(1) | 0.6224(1) | 0.8433(1) | 0.7962(1) |
相对 TF 向量与阈值过滤(rel TF > 0.01):
分类器 | 召回率 | 精确率 | 敏感性 | 特异性 | F 度量 | 准确率 | 科亨κ系数 |
---|---|---|---|---|---|---|---|
朴素贝叶斯 | 0.4689 | 0.5456(2) | 0.4689 | 0.9622 | 0.4988 | 0.7133 | 0.6117 |
决策树 | 0.5008(2) | 0.5042 | 0.5008(2) | 0.9706(2) | 0.5022(2) | 0.7439(2) | 0.6657(2) |
AdaBoost(NB) | 0.4435 | 0.4992 | 0.4435 | 0.9617 | 0.4598 | 0.6870 | 0.5874 |
LibSVM | 0.6438(1) | 0.6326(1) | 0.6438(1) | 0.9810(1) | 0.6118(1) | 0.8313(1) | 0.7806(1) |
文本处理结果分析
在这里展示了从我们的 Reuters 数据集实验中获得的结果分析,并附带一些关键观察:
-
如第一张表所示,使用项的二进制表示,朴素贝叶斯得分为约 0.7,这表明生成的特征具有良好的区分能力。在相同配置的朴素贝叶斯上进一步使用 AdaBoost 可以提升所有指标,如精确率、召回率、F1 度量以及准确率,大约提高 2%,这表明了提升和元学习的优势。
-
如第一张表所示,非线性分类器,如决策树,在大多数指标上仅略优于线性朴素贝叶斯。使用线性分类器的 SVM 比线性朴素贝叶斯提高了 17%的准确率,并且在几乎所有指标上都有更好的表现。SVM 和核函数,在处理高维数据时没有问题,解决了文本分类的诅咒,因此是建模的较好算法之一,结果也证实了这一点。
-
将表示从二进制转换为 TF(词频)改进了许多指标,如准确率,对于线性朴素贝叶斯(从 0.70 提高到 0.72)和 SVM(从 0.82 提高到 0.84)。这确实证实了基于 TF 的表示在许多基于数字的算法中,如 SVM。当底层分类器贝叶斯在性能上变得更强大时,如许多理论和实证结果所示,AdaBoost 与朴素贝叶斯在大多数指标上的性能会下降。
-
最后,通过使用阈值 TF > 0.01 减少特征,正如这里所使用的,我们在大多数分类器中得到了几乎相似或略有降低的性能,这表明尽管某些术语似乎很少见,但它们具有区分能力,减少它们会产生负面影响。
摘要
数字世界中的大量信息是文本形式。文本挖掘和自然语言处理是关注从这种非结构化数据形式中提取信息的领域。该领域中的几个重要子领域现在是活跃的研究主题,对这些领域的理解对于数据科学家来说是必不可少的。
文本分类关注将文档分类到预先确定的类别中。文本可以通过标注单词(如词性标注)来丰富,以便为后续处理任务提供更多结构。聚类等无监督技术也可以应用于文档。信息提取和命名实体识别有助于识别信息丰富的具体内容,如地点、人名或组织名称等。摘要也是另一个重要应用,用于生成较大文档或文档集的简洁摘要。语言和语义的多种歧义,如上下文、词义和推理,使得自然语言处理(NLP)的任务具有挑战性。
文本内容的转换包括分词、停用词去除和词干提取,所有这些通过标准化内容来准备语料库,以便机器学习技术能够有效地应用。接下来,提取词汇、语义和句法特征,以便使用向量空间模型以更传统的方式用数值表示文档结构。然后可以应用相似性和距离度量来有效地比较文档的相似性。由于通常存在大量特征,降维是关键。本章描述了主题建模技术、PLSA 和文本聚类以及命名实体识别的技术细节。最后,介绍了在自然语言处理的各个领域中应用深度学习的最新技术。
Mallet 和 KNIME 是两种开源 Java 工具,它们提供了强大的自然语言处理和机器学习功能。案例研究考察了使用 KNIME 在 Reuters 语料库上不同分类器的性能。
参考文献
-
J. B. Lovins (1968). 词干算法的开发, 机械翻译与计算机语言学, 第 11 卷,第 1/2 期,第 22-31 页。
-
Porter M.F (1980). 后缀剥离算法, 程序; 14, 130-137。
-
ZIPF, H.P. (1949). 人类行为与最小努力原则, 哈德逊出版社,马萨诸塞州剑桥。
-
LUHN, H.P. (1958). 自动生成文献摘要, IBM 研究与发展杂志, 2, 159-165。
-
Deerwester, S., Dumais, S., Furnas, G., & Landauer, T. (1990), 基于潜在语义分析的索引, 美国信息科学学会杂志, 41, 391–407。
-
Dempster, A. P., Laird, N. M., & Rubin, D. B. (1977), 通过 EM 算法从不完全数据中估计最大似然. 英国皇家统计学会,系列 B,39(1),1–38。
-
Greiff, W. R. (1998). 基于探索性数据分析的词权重理论. 在第 21 届国际 ACM SIGIR 信息检索研究与发展会议,纽约,纽约。ACM。
-
P. F. Brown, P. V. deSouza, R. L. Mercer, V. J. Della Pietra, 和 J/ C. Lai (1992), 基于类别的自然语言 n-gram 模型, 计算语言学, 18, 4, 467-479.
-
T. Liu, S. Lin, Z. Chen, W.-Y. Ma (2003),文本聚类特征选择的评估,ICML 会议。
-
Y. Yang, J. O. Pederson (1995). 文本分类中特征选择的比较研究,ACM SIGIR 会议。
-
Salton, G. & Buckley, C. (1998). 自动文本检索中的词频加权方法,《信息处理与管理》,24(5),513–523。
-
Hofmann, T. (2001). 无监督学习通过概率潜在语义分析. 机器学习杂志,41(1),177–196。
-
D. Blei, J. Lafferty (2006). 动态主题模型,ICML 会议。
-
D. Blei, A. Ng, M. Jordan (2003). 潜在狄利克雷分配,机器学习研究杂志,3: pp. 993–1022。
-
W. Xu, X. Liu, 和 Y. Gong (2003). 基于非负矩阵分解的文档聚类,SIGIR'03 会议论文,多伦多,加拿大,pp. 267-273。
-
Dud´ik M. 和 Schapire (2006). R. E. 广义正则化下的最大熵分布估计,Lugosi, G. 和 Simon, H. (编),COLT,柏林,pp. 123–138,Springer-Verlag。
-
McCallum, A., Freitag, D., 和 Pereira, F. C. N. (2000). 信息提取和分割的最大熵马尔可夫模型,ICML,pp. 591–598。
-
Langville, A. N, Meyer, C. D., Albright, R. (2006). 非负因子分解的初始化,KDD,费城,美国。
-
Dunning, T. (1993). 准确计算惊喜和巧合的统计方法,《计算语言学》,19,1,pp. 61-74。
-
Y. Bengio, R. Ducharme, P. Vincent 和 C. Jauvin (2003). 神经概率语言模型,机器学习研究杂志。
-
R. Collobert, J. Weston, L. Bottou, M. Karlen, K. Kavukcuoglu, 和 P. Kuksa. (2011). 从零开始的自然语言处理,机器学习研究杂志,12:2493–2537。
-
T. Mikolov, K. Chen, G. Corrado 和 J. Dean (2013). 在向量空间中高效估计词表示,arXiv:1301.3781v1。
-
R. Socher, Christopher Manning, 和 Andrew Ng. (2010). 使用递归神经网络学习连续短语表示和句法解析,NIPS 2010 深度学习和无监督特征学习研讨会。
-
R. Socher, J. Pennington, E. H. Huang, A. Y. Ng, 和 C. D. Manning. (2011). 半监督递归自动编码器用于预测情感分布,EMNLP。
-
M. Luong, R. Socher 和 C. Manning (2013). 使用递归神经网络为形态学获得更好的词表示,CONLL。
-
A. Frome, G. S. Corrado, J. Shlens, S. Bengio, J. Dean, T. Mikolov, 等人 (2013). Devise:一种深度视觉-语义嵌入模型,NIPS 论文。
-
Léon Bottou (2011). 从机器学习到机器推理。
arxiv.org/pdf/1102.1808v3.pdf
。 -
Cho, Kyunghyun, 等人 (2014). 使用 RNN 编码器-解码器学习短语表示以进行统计机器翻译,arXiv 预印本 arXiv:1406.1078。
第九章. 大数据机器学习 – 最终边疆
近年来,我们见证了人类和机器生成数据的指数级增长。包括家庭传感器、与医疗相关的监测设备、新闻源、社交媒体上的对话、图像和全球商业交易在内的各种来源——这是一个无休止的列表——每天都会产生大量数据。
2017 年 3 月,Facebook 有 12.8 亿每日活跃用户分享了近四百万条非结构化信息,包括文本、图像、URL、新闻和视频(来源:Facebook)。1.3 亿 Twitter 用户每天分享约 5 亿条推文(来源:Twitter)。物联网(IoT)中的传感器,如灯光、恒温器、汽车中的传感器、手表、智能设备等,到 2020 年将从 500 亿增长到 2000 亿(来源:IDC 估计)。YouTube 用户每五分钟上传 300 小时的新视频内容。Netflix 有 3000 万观众每天流式传输 77,000 小时的视频。亚马逊销售了约 4.8 亿件产品,拥有约 2.44 亿客户。在金融领域,即使是单一大型机构产生的交易数据量也非常巨大——美国约有 2500 万户家庭将美国银行(一家主要金融机构)作为其主要银行,每年共同产生数百万兆字节的数据。总体而言,预计到 2017 年,全球大数据产业的价值将达到 430 亿美元(来源:www.statista.com)。
上述公司以及许多类似的公司都面临着存储所有这些数据(结构化和非结构化)、处理数据以及从数据中学习隐藏模式以增加收入和提高客户满意度的真实问题。我们将探讨当前的方法、工具和技术如何帮助我们在大数据规模环境中从数据中学习,以及作为该领域从业者,我们必须认识到这一特定问题空间所特有的挑战。
本章结构如下:
-
大数据的特征是什么?
-
大数据机器学习
-
通用大数据框架:
-
大数据集群部署框架
-
HortonWorks 数据平台 (HDP)
-
Cloudera CDH
-
Amazon Elastic MapReduce (EMR)
-
Microsoft HDInsight
-
-
数据采集:
-
发布-订阅框架
-
源-汇框架
-
SQL 框架
-
消息队列框架
-
自定义框架
-
-
数据存储:
-
Hadoop 分布式文件系统 (HDFS)
-
NoSQL
-
-
数据处理和准备:
-
Hive 和 Hive 查询语言 (HQL)
-
Spark SQL
-
Amazon Redshift
-
实时流处理
-
-
机器学习
-
可视化和分析
-
-
批量大数据机器学习
-
H2O:
-
H2O 架构
-
H2O 中的机器学习
-
工具和用法
-
案例研究
-
商业问题
-
机器学习映射
-
数据收集
-
数据采样和转换
-
实验、结果和分析
-
-
Spark MLlib:
-
Spark 架构
-
MLlib 中的机器学习
-
工具和用法
-
实验、结果和分析
-
-
-
实时大数据机器学习
-
可扩展的高级大规模在线分析(SAMOA):
-
SAMOA 架构
-
机器学习算法
-
工具和用法
-
实验、结果和分析
-
机器学习的未来
-
-
大数据的特征有哪些?
大数据有许多与普通数据不同的特征。在这里,我们将它们突出为四个“V”,以表征大数据。每个“V”都使得使用专门的工具、框架和算法进行数据采集、存储、处理和分析成为必要。
-
体积:大数据的一个特征是内容的大小,无论是结构化还是非结构化,都不适合单台机器的存储容量或处理能力,因此需要多台机器。
-
速度:大数据的另一个特征是内容生成的速率,这有助于增加数据量,但需要以时间敏感的方式处理。社交媒体内容和物联网传感器信息是高速大数据的最佳例子。
-
多样性:这通常指的是数据存在的多种格式,即结构化、半结构化和非结构化,而且每种格式都有不同的形式。包含图像、视频、音频、文本以及关于活动、背景、网络等结构化信息的社交媒体内容是必须分析来自各种来源的数据的最佳例子。
-
真实性:这涉及到数据中的各种因素,如噪声、不确定性、偏差和异常,必须加以解决,尤其是在数据量、速度和多样性的情况下。我们将讨论的一个关键步骤是处理和清理这些“不干净”的数据,正如我们将在大数据机器学习背景下讨论的那样。
许多人已经将价值、有效性和波动性等特征添加到前面的列表中,但我们认为它们在很大程度上是从前四个特征派生出来的。
大数据机器学习
在本节中,我们将讨论大数据机器学习所需的一般流程和组件。尽管许多组件,如数据采集或存储,与机器学习方法没有直接关系,但它们不可避免地对框架和流程产生影响。提供所有可用组件和工具的完整目录超出了本书的范围,但我们将讨论涉及任务的一般职责,并介绍一些可用于完成这些任务的技术和工具。
通用大数据框架
以下图示为通用大数据框架:
图 1:大数据框架
在集群中如何设置和部署大数据框架的选择是影响工具、技术和成本决策的因素之一。数据采集或收集组件是第一步,它包括多种同步和异步技术,用于将数据吸收到系统中。组件中提供了从发布-订阅、源-汇、关系型数据库查询和自定义数据连接器等各种技术。
根据各种其他功能需求,数据存储选择包括从分布式文件系统如 HDFS 到非关系型数据库(NoSQL)。NoSQL 数据库在数据存储部分进行了描述。
数据准备,即转换大量存储的数据,使其能够被机器学习分析所消费,是一个重要的处理步骤。这依赖于存储中使用的框架、技术和工具。它还依赖于下一步:选择将要使用的机器学习分析/框架。以下子节将讨论广泛的选择处理框架。
回想一下,在批量学习中,模型是在之前收集的多个示例上同时训练的。与批量学习相反,实时学习模型训练是连续的,每个到达的新实例都成为动态训练集的一部分。有关详细信息,请参阅第五章,实时流机器学习。一旦数据根据领域要求收集、存储和转换,就可以采用不同的机器学习方法,包括批量学习、实时学习和批量-实时混合学习。选择监督学习、无监督学习或两者的组合也取决于数据、标签的可用性和标签质量。这些将在本章后面详细讨论。
开发阶段以及生产或运行时阶段的分析结果也需要存储和可视化,以便于人类和自动化任务。
大数据集群部署框架
基于核心 Hadoop (参考资料 [3]) 开源平台构建了许多框架。每个框架都为之前描述的大数据组件提供了一系列工具。
Hortonworks 数据平台
Hortonworks 数据平台 (HDP) 提供了一个开源分布,包括其堆栈中的各种组件,从数据采集到可视化。Apache Ambari 通常是用于管理服务和提供集群配置和监控的用户界面。以下截图展示了用于配置各种服务和健康检查仪表板的 Ambari:
图 2:Ambari 仪表板用户界面
Cloudera CDH
与 HDP 类似,Cloudera CDH (参考文献[4]) 提供了类似的服务,Cloudera 服务管理器可以像 Ambari 一样用于集群管理和健康检查,如下面的截图所示:
图 3:Cloudera 服务管理器用户界面
Amazon Elastic MapReduce
Amazon Elastic MapReduce (EMR) (参考文献[5]) 是另一个类似于 HDP 和 Cloudera 的大数据集群平台,它支持广泛的框架。EMR 有两种模式——集群模式和步骤执行模式。在集群模式下,您可以选择 EMR 或 MapR 的大数据堆栈供应商,而在步骤执行模式下,您可以为执行提供从 JAR 文件到 SQL 查询的各种作业。以下截图显示了配置新集群以及定义新作业流的界面:
图 4:Amazon Elastic MapReduce 集群管理用户界面
Microsoft Azure HDInsight
Microsoft Azure HDInsight (参考文献[6]) 是另一个平台,它允许使用包括存储、处理和机器学习在内的大多数服务进行集群管理。如下面的截图所示,Azure 门户用于创建、管理和帮助学习集群各个组件的状态:
图 5:Microsoft Azure HDInsight 集群管理用户界面
数据采集
在大数据框架中,采集组件在从不同的源系统收集数据并将其存储在大数据存储中方面发挥着重要作用。根据源类型、数量、速度、功能以及性能要求,存在各种采集框架和工具。我们将描述一些最知名框架和工具,以给读者提供一些洞察。
发布-订阅框架
在基于发布-订阅的框架中,发布源将数据以不同格式推送到代理,该代理有不同的订阅者等待消费。发布者和订阅者彼此之间不知情,由代理在中间调解。
Apache Kafka (参考文献[9]) 和 Amazon Kinesis 是基于此模型的两个知名实现。Apache Kafka 定义了发布者、消费者和主题的概念——事物在此发布和消费,以及一个用于管理主题的代理。Amazon Kinesis 基于类似的概念,通过 Kinesis 流连接生产者和消费者,这些流类似于 Kafka 中的主题。
源-汇框架
在源-汇模型中,源将数据推入框架,框架将系统推送到汇。Apache Flume (参考文献[7]) 是此类框架的一个知名实现,具有各种源、用于缓冲数据的通道以及在大数据世界中存储数据的多个汇。
SQL 框架
由于许多传统数据存储以基于 SQL 的关系型数据库管理系统(RDBMS)的形式存在,基于 SQL 的框架提供了一种通用的方式来从 RDBMS 导入数据并将其存储在大数据中,主要是 HDFS 格式。Apache Sqoop(参考文献 [10])是一个知名的实现,可以从任何基于 JDBC 的 RDBMS 导入数据并将其存储在基于 HDFS 的系统。
消息队列框架
消息队列框架是基于推送-拉取的框架,类似于发布-订阅系统。消息队列将生产者和消费者分开,并可以在队列中存储数据,采用异步通信模式。已经开发了许多协议,例如高级消息队列协议(AMQP)和 ZeroMQ 消息传输协议(ZMTP)。RabbitMQ、ZeroMQ、Amazon SQS 等是一些此框架的知名实现。
自定义框架
针对不同来源(如 IoT、HTTP、WebSockets 等)的专用连接器导致了许多特定连接器的出现,例如 Amazon IoT Hub、REST 连接器、WebSocket 等。
数据存储
数据存储组件在连接获取和其他组件方面发挥着关键作用。在决定数据存储时,应考虑性能、对数据处理的影响、成本、高可用性、易于管理等因素。对于纯实时或近实时系统,有基于内存的存储框架,但对于基于批次的系统,主要有分布式文件系统,如 HDFS 或 NoSQL。
HDFS
HDFS 可以在大型节点集群上运行,并提供所有重要功能,如高吞吐量、复制、故障转移等。
HDFS 的基本架构包含以下组件:
-
NameNode:HDFS 客户端始终将请求发送到 NameNode,它保存文件的元数据,而实际数据以块的形式分布在 DataNode 上。NameNode 只负责处理文件的打开和关闭,而读取、写入和追加的其余交互发生在客户端和数据节点之间。NameNode 将元数据存储在两个文件中:
fsimage
和edit
文件。fsimage
包含文件系统元数据作为快照,而 edit 文件包含对元数据的增量更改。 -
Secondary NameNode:Secondary NameNode 通过在每个预定义检查点保留
fsimage
和edit
文件的副本,为 NameNode 中的元数据提供冗余。 -
DataNode:DataNode 管理实际的数据块并促进对这些数据块的读写操作。DataNode 通过心跳信号与 NameNode 保持通信,以表明它们处于活动状态。存储在 DataNode 中的数据块也进行了冗余复制。DataNode 中的数据块复制受制于机架感知放置策略。
NoSQL
非关系型数据库,也称为 NoSQL 数据库,在大数据世界中越来越受欢迎。高吞吐量、更好的水平扩展、检索性能的提高以及以牺牲较弱的一致性模型为代价的存储是大多数 NoSQL 数据库的显著特征。在本节中,我们将讨论一些重要的 NoSQL 数据库形式及其实现。
键值数据库
键值数据库是最突出的 NoSQL 数据库,主要用于半结构化或非结构化数据。正如其名所示,存储结构相当基本,具有独特的键将数据值(可以是字符串、整数、双精度等类型,甚至 BLOBS)与之关联。对键进行哈希处理以快速查找和检索值,以及将数据跨多个节点分区,提供了高吞吐量和可伸缩性。查询能力非常有限。Amazon DynamoDB、Oracle NoSQL、MemcacheDB 等是一些键值数据库的例子。
文档数据库
文档数据库以 XML、JSON 或 YAML 文档的形式存储半结构化数据,以下是一些最流行的格式。文档具有独特的键,它们被映射到这些键上。尽管在键值存储中存储文档是可能的,但文档存储提供的查询能力更强,因为构成文档结构的原语(可能包括名称或属性)也可以用于检索。当数据不断变化且字段数量或长度可变时,文档数据库通常是一个不错的选择。文档数据库不提供连接能力,因此所有信息都需要在文档值中捕获。MongoDB、ElasticSearch、Apache Solr 等是一些著名的文档数据库实现。
列式数据库
列作为存储的基本单元,具有名称、值和通常的时间戳,这区分了列式数据库与传统的关系数据库。列进一步组合形成列族。行通过行键索引,并关联多个列族。某些行可能只能使用已填充的列族,这使其在稀疏数据中具有很好的存储表示。列式数据库没有像关系数据库那样的固定模式;新列和列族可以随时添加,这给了它们显著的优势。HBase、Cassandra和Parquet是一些著名的列式数据库实现。
图数据库
在许多应用中,数据具有固有的图结构,包括节点和链接。在图数据库中存储此类数据使其在存储、检索和查询方面更加高效。节点有一组属性,通常代表实体,而链接表示节点之间的关系,可以是定向的或非定向的。Neo4J、OrientDB和ArangoDB是一些著名的图数据库实现。
数据处理和准备
数据准备步骤涉及在数据准备好由分析和机器学习算法消费之前的各种预处理步骤。涉及的一些关键任务包括:
-
数据清洗:涉及对原始数据进行错误纠正、类型匹配、元素归一化等所有内容。
-
数据抓取和整理:将数据元素从一种结构转换为另一种结构并进行归一化。
-
数据转换:许多分析算法需要基于原始或历史数据的聚合特征。在这个步骤中,会进行这些额外特征的转换和计算。
Hive 和 HQL
Apache Hive (参考文献[11]) 是在 HDFS 系统中执行各种数据准备活动的强大工具。Hive 将底层 HDFS 数据组织成类似于关系数据库的结构。HQL 类似于 SQL,有助于执行各种聚合、转换、清理和归一化,然后数据被序列化回 HDFS。Hive 中的逻辑表被分区并在子分区中划分以提高速度。Hive 中的复杂连接和聚合查询会自动转换为 MapReduce 作业以实现吞吐量和速度提升。
Spark SQL
Spark SQL,Apache Spark 的主要组件 (参考文献[1]和[2]),提供了类似 SQL 的功能——类似于 HQL 提供的功能——用于对大数据进行更改。Spark SQL 可以与底层数据存储系统(如 Hive 或 NoSQL 数据库如 Parquet)一起工作。我们将在 Spark 部分的章节中涉及 Spark SQL 的某些方面。
Amazon Redshift
Amazon Redshift 在 Amazon EMR 设置上提供了一些仓库功能。它可以使用其 大规模并行处理 (MPP) 数据仓库架构处理 PB 级的数据。
实时流处理
在许多大数据部署中,必须对之前指定的转换在实时数据流上而不是从存储的批量数据中实时进行处理。有各种 流处理引擎 (SPE),如 Apache Storm (参考文献[12]) 和 Apache Samza,以及内存处理引擎如 Spark-Streaming,它们用于流处理。
机器学习
机器学习有助于对大数据进行描述性、预测性和规范性分析。本章将涵盖两个广泛的极端:
-
机器学习可以在批量历史数据上执行,然后可以将学习/模型应用于新的批量/实时数据
-
机器学习可以在实时数据上执行,并同时应用于实时数据
本章的剩余部分将详细讨论这两个主题。
可视化和分析
在建模时间完成批量学习,在运行时完成实时学习,预测——将模型应用于新数据的输出——必须存储在某种数据结构中,然后由用户进行分析。可视化工具和其他报告工具经常被用来提取和向用户展示信息。根据领域和用户的需求,分析和可视化可以是静态的、动态的或交互式的。
Lightning 是一个框架,使用不同的绑定 API(通过 REST 为 Python、R、Scala 和 JavaScript 语言)在 Web 上执行交互式可视化。
Pygal 和 Seaborn 是基于 Python 的库,它们帮助在 Python 中绘制所有可能的图表和图形,用于分析、报告和可视化。
批量大数据机器学习
批量大数据机器学习涉及两个基本步骤,如第二章《实际应用中的监督学习》、第三章《无监督机器学习技术》和第四章《半监督和主动学习》中所述,即从历史数据集中学习或训练数据,并将学习到的模型应用于未见过的未来数据。以下图展示了这两个环境以及完成这些任务的组件任务和一些技术/框架:
图 6:大数据和提供者的建模时间和运行时组件
我们将讨论在批量数据背景下进行机器学习的两个最著名的框架,并使用案例研究来突出执行建模的代码或工具。
H2O 作为大数据机器学习平台
H2O(参考文献[13])是一个领先的开源大数据机器学习平台,专注于将人工智能引入企业。该公司成立于 2011 年,拥有几位在统计学习理论和优化领域的杰出科学家作为其科学顾问。它支持多种编程环境。虽然 H2O 软件是免费提供的,但客户服务和产品的定制扩展可以购买。
H2O 架构
以下图展示了 H2O 的高级架构及其重要组件。H2O 可以访问来自各种数据存储的数据,例如 HDFS、SQL、NoSQL 和 Amazon S3 等。H2O 最流行的部署方式是使用之前讨论过的部署堆栈之一与 Spark 一起使用,或者在其自己的 H2O 集群中运行。
H2O 的核心是在内存中处理大数据的优化方式,以便可以有效地处理通过相同数据的迭代算法,并实现良好的性能。在监督学习和无监督学习中,重要的机器学习算法被特别实现以处理跨多个节点和 JVM 的水平可伸缩性。H2O 不仅提供了自己的用户界面,称为 flow,用于管理和运行建模任务,而且还具有不同的语言绑定和连接器 API,用于 Java、R、Python 和 Scala。
图 7:H2O 高级架构
大多数机器学习算法、优化算法和实用工具都使用了分叉-合并或 MapReduce 的概念。如图 8 所示,整个数据集在 H2O 中被视为一个数据框,并包含向量,这些向量是数据集中的特征或列。行或实例由每个向量中的一个元素并排排列组成。行被分组在一起形成一个称为块的处理单元。多个块在一个 JVM 中组合。任何算法或优化工作都是从最顶层的 JVM 发送信息到下一个 JVM 进行分叉,然后继续到下一个,以此类推,类似于 MapReduce 中的 map 操作。每个 JVM 在块中的行上执行任务,并最终在 reduce 操作中将结果流回:
图 8:使用分块进行 H2O 分布式数据处理
H2O 中的机器学习
下图显示了 H2O v3 支持的所有监督学习和无监督学习的机器学习算法:
图 9:H2O v3 机器学习算法
工具和用法
H2O Flow 是一个交互式 Web 应用程序,帮助数据科学家执行从导入数据到使用点击和向导概念运行复杂模型的各种任务。
H2O 以本地模式运行如下:
java –Xmx6g –jar h2o.jar
启动 Flow 的默认方式是将浏览器指向以下 URL:http://192.168.1.7:54321/
。Flow 的右侧捕获在概要标签下执行的每个用户操作。这些操作可以编辑并保存为命名的流程以供重用和协作,如图 10 所示:
图 10:浏览器中的 H2O 流
图 11显示了从本地文件系统或 HDFS 导入文件的界面,并显示数据集的详细摘要统计以及可以执行的操作。一旦数据被导入,它就在 H2O 框架中获得一个以.hex
为扩展名的数据框引用。摘要统计有助于理解数据的特征,如缺失、平均值、最大值、最小值等。它还有一个简单的方法将特征从一种类型转换为另一种类型,例如,具有少量唯一值的数值特征转换为 H2O 中称为enum
的分类/名义类型。
可以在数据集上执行的操作包括:
-
可视化数据。
-
将数据分割成不同的集合,如训练、验证和测试。
-
构建监督和无监督模型。
-
使用模型进行预测。
-
下载并导出各种格式的文件。
图 11:以框架、摘要和可执行操作导入数据
在 H2O 中构建监督或无监督模型是通过交互式屏幕完成的。每个建模算法都有其参数,分为三个部分:基本、高级和专家。任何支持超参数搜索以调整模型的参数旁边都有一个复选框网格,并且可以使用多个参数值。
一些基本参数,如training_frame、validation_frame和response_column,是每个监督算法共有的;其他参数特定于模型类型,例如 GLM 的求解器选择、深度学习的激活函数等。所有这些通用参数都在基本部分中。高级参数是允许模型器在必须覆盖默认行为时获得更多灵活性和控制的设置。其中一些参数在算法之间也是通用的——两个例子是分配折指数的方法选择(如果在基本部分中选择了交叉验证),以及选择包含权重的列(如果每个示例单独加权),等等。
专家参数定义了更复杂的元素,例如如何处理缺失值、需要更多算法理解的模型特定参数,以及其他神秘变量。在图 12中,GLM,一个监督学习算法,正在使用 10 折交叉验证、二项式(双类)分类、高效的 LBFGS 优化算法和分层采样进行交叉验证分割进行配置:
图 12:建模算法参数和验证
模型结果屏幕包含了对结果的详细分析,使用重要的评估图表,具体取决于所使用的验证方法。屏幕顶部是可能采取的操作,例如在未见数据上运行模型进行预测、下载模型为 POJO 格式、导出结果等。
一些图表是算法特定的,例如评分历史记录显示了在 GLM 中迭代过程中训练损失或目标函数如何变化——这使用户能够了解收敛速度以及迭代参数的调整。我们在验证数据中看到了 ROC 曲线和曲线下面积指标,以及增益和提升图表,分别给出了验证样本的累积捕获率和累积提升。
图 13 展示了 GLM 在 CoverType
数据集上 10 折交叉验证的 评分历史、ROC 曲线和 增益/提升 图表:
图 13:建模和验证 ROC 曲线、目标函数和提升/增益图表
验证输出的输出提供了详细的评估指标,如准确率、AUC、误差、错误、f1 指标、MCC(马修斯相关系数)、精确率和召回率,对于交叉验证中的每个验证折以及所有计算出的平均值和标准差。
图 14:验证结果和总结
预测操作使用未见过的保留数据运行模型来估计样本外性能。重要的指标,如错误、准确率、曲线下面积、ROC 图等,作为预测的输出给出,可以保存或导出。
图 15:运行测试数据、预测和 ROC 曲线
案例研究
在本案例研究中,我们使用 CoverType
数据集来展示 H2O、Apache Spark MLlib 和 SAMOA 机器学习库在 Java 中的分类和聚类算法。
商业问题
可从 UCI 机器学习仓库获取的 CoverType
数据集(archive.ics.uci.edu/ml/datasets/Covertype
)包含 581,012 个 30 x 30 m2 尺寸的森林土地的未缩放地图数据,并附带实际的森林覆盖类型标签。在此处进行的实验中,我们使用数据的归一化版本。包括两种分类类型的 one-hot 编码,每行总共有 54 个属性。
机器学习映射
首先,我们将问题视为一个分类问题,使用数据集中包含的标签执行多个监督学习实验。使用生成的模型,我们对未见过的保留测试数据集的森林覆盖类型进行预测。对于后续的聚类实验,我们忽略数据标签,确定要使用的聚类数量,然后报告使用 H2O 和 Spark MLLib 中实现的多种算法对应的成本。
数据收集
此数据集仅使用地图测量收集,没有使用遥感。它来源于最初由 美国森林服务局(USFS)和美国地质调查局(USGS)收集的数据。
数据采样和转换
训练和测试数据—数据集被分成两个集合,测试占 20%,训练占 80%。
土壤类型分类的表示由 40 个二元变量属性组成。值为 1 表示观测中存在土壤类型;值为 0 表示不存在。
野生动植物区域分类同样是一个分类属性,有四个二元列,其中 1 表示存在,0 表示不存在。
所有连续值属性在使用前都已归一化。
实验、结果和分析
在本案例研究的第一个实验集中,我们使用了 H2O 框架。
特征相关性和分析
尽管 H2O 没有显式的特征选择算法,但许多学习器如 GLM、随机森林、GBT 等,基于模型的训练/验证提供特征重要性指标。在我们的分析中,我们使用了 GLM 进行特征选择,如图 16 所示。有趣的是,特征高程与一些转换为数值/二进制分类特征(如Soil_Type2、Soil_Type4等)一起成为最具区分性的特征。许多土壤类型分类特征没有相关性,可以从建模角度删除。
本组实验中包含的学习算法有:广义线性模型 (GLM)、梯度提升机 (GBM)、随机森林 (RF)、朴素贝叶斯 (NB) 和 深度学习 (DL)。H2O 支持的深度学习模型是多层感知器 (MLP)。
图 16:使用 GLM 进行特征选择
测试数据的评估
使用所有特征的结果显示在表中:
算法 | 参数 | AUC | 最大准确率 | 最大 F1 | 最大精确率 | 最大召回率 | 最大特异性 |
---|---|---|---|---|---|---|---|
GLM | 默认 | 0.84 | 0.79 | 0.84 | 0.98 | 1.0(1) | 0.99 |
GBM | 默认 | 0.86 | 0.82 | 0.86 | 1.0(1) | 1.0(1) | 1.0(1) |
随机森林 (RF) | 默认 | 0.88(1) | 0.83(1) | 0.87(1) | 0.97 | 1.0(1) | 0.99 |
朴素贝叶斯 (NB) | Laplace=50 | 0.66 | 0.72 | 0.81 | 0.68 | 1.0(1) | 0.33 |
深度学习 (DL) | Rect,300, 300,Dropout | 0. | 0.78 | 0.83 | 0.88 | 1.0(1) | 0.99 |
深度学习 (DL) | 300, 300, MaxDropout | 0.82 | 0.8 | 0.84 | 1.0(1) | 1.0(1) | 1.0(1) |
移除在特征相关性评分中表现不佳的特征后的结果如下:
算法 | 参数 | AUC | 最大准确率 | 最大 F1 | 最大精确率 | 最大召回率 | 最大特异性 |
---|---|---|---|---|---|---|---|
GLM | 默认 | 0.84 | 0.80 | 0.85 | 1.0 | 1.0 | 1.0 |
GBM | 默认 | 0.85 | 0.82 | 0.86 | 1.0 | 1.0 | 1.0 |
随机森林 (RF) | 默认 | 0.88 | 0.83 | 0.87 | 1.0 | 1.0 | 1.0 |
朴素贝叶斯 (NB) | Laplace=50 | 0.76 | 0.74 | 0.81 | 0.89 | 1.0 | 0.95 |
深度学习 (DL) | 300,300, RectDropout | 0.81 | 0.79 | 0.84 | 1.0 | 1.0 | 1.0 |
深度学习 (DL) | 300, 300, MaxDropout | 0.85 | 0.80 | 0.84 | 0.89 | 0.90 | 1.0 |
表 1:包含所有特征的模型评估结果
结果分析
从结果分析中获得的主要观察结果非常有启发性,在此处展示。
-
特征相关性分析显示了海拔特征是一个高度区分性的特征,而许多转换为二进制特征的分类属性,如SoilType_10等,其相关性几乎为零或没有。
-
包含所有特征的实验结果,如表 1所示,清楚地表明,非线性集成技术随机森林(Random Forest)是最佳算法,这从包括准确率、F1、AUC 和召回率在内的多数评估指标中可以看出。
-
表 1也突出了这样一个事实:虽然较快的线性朴素贝叶斯(Naive Bayes)算法可能不是最佳选择,但属于线性算法类别的 GLM 表现出更好的性能——这表明特征之间存在一些相互依赖性!
-
如我们在第七章中看到的,深度学习算法通常需要大量的调整;然而,即使只有少数小的调整,深度学习(DL)的结果与随机森林(Random Forest)相比也是可以相提并论的,尤其是在使用 MaxDropout 的情况下。
-
表 2显示了从训练集中移除低相关性特征后所有算法的结果。可以看出,由于基于特征之间独立性的假设进行概率乘法,朴素贝叶斯(Naive Bayes)的影响最大,因此它获得了最大的利益和性能提升。大多数其他算法,如随机森林(Random Forest),如我们在第二章中讨论的,面向现实世界监督学习的实用方法,内置了特征选择,因此移除不重要的特征对它们的性能影响很小或没有影响。
Spark MLlib 作为大数据机器学习平台
Apache Spark 始于 2009 年,在加州大学伯克利分校的 AMPLab,于 2013 年在 Apache License 2.0 下捐赠给了 Apache 软件基金会。Spark 的核心思想是构建一个集群计算框架,以克服 Hadoop 的问题,特别是对于迭代和内存计算。
Spark 架构
如图 17所示的 Spark 堆栈可以使用任何类型的数据存储,如 HDFS、SQL、NoSQL 或本地文件系统。它可以在 Hadoop、Mesos 或独立部署。
Spark 最重要的组件是 Spark Core,它提供了一个框架,以高吞吐量、容错和可扩展的方式处理和操作数据。
建立在 Spark 核心之上的各种库,每个库都针对大数据世界中处理数据和进行数据分析所需的各种功能。Spark SQL 为我们提供了一种使用类似于 SQL 的查询语言在大数据存储中进行数据操作的语言,SQL 是数据库的通用语言。Spark GraphX 提供了执行图相关操作和基于图的算法的 API。Spark Streaming 提供了处理流处理中所需实时操作的 API,从数据操作到对流的查询。
Spark-MLlib 是一个机器学习库,拥有广泛的机器学习算法,可以执行从特征选择到建模的监督和未监督任务。Spark 有各种语言绑定,如 Java、R、Scala 和 Python。MLlib 在 Spark 引擎上运行具有明显的优势,尤其是在跨多个节点缓存数据以及在内存中运行 MapReduce 作业方面,从而与 Mahout 和其他大规模机器学习引擎相比,性能得到了显著提升。MLlib 还具有其他优势,如容错性和可伸缩性,无需在机器学习算法中显式管理。
图 17:Apache Spark 高级架构
Spark 核心组件如下:
-
弹性分布式数据集(RDD):RDD 是 Spark Core 知道如何分区和分布到集群以执行任务的不可变对象的基本集合。RDD 由“分区”组成,这些分区依赖于父 RDD 和关于数据放置的元数据。
-
在 RDD 上执行两种不同的操作:
-
转换:这些操作是延迟评估的,可以将一个 RDD 转换为另一个 RDD。延迟评估尽可能推迟评估,这使得一些资源优化成为可能。
-
操作:触发转换并返回输出值的实际操作
-
-
血缘图:描述特定任务的计算流程或数据流,包括在转换和操作中创建的不同 RDD,称为任务的血缘图。血缘图在容错中扮演着关键角色。
图 18:Apache Spark 血缘图
Spark 对集群管理是中立的,可以与 YARN 和 Mesos 等多个实现一起工作,以管理节点、分配工作和通信。转换和操作在集群中的任务分配是由调度器完成的,从创建 Spark 上下文的驱动节点开始,到如图 19 所示的许多工作节点。当与 YARN 一起运行时,Spark 允许用户在节点级别选择执行器的数量、堆大小和每个 JVM 的核心分配。
图 19:Apache Spark 集群部署和任务分配
MLlib 中的机器学习
Spark MLlib 拥有一个全面的机器学习工具包,提供的算法比写作时的 H2O 更多,如图 20 所示:
图 20:Apache Spark MLlib 机器学习算法
为 Spark 编写了许多扩展,包括 Spark MLlib,用户社区还在继续贡献更多包。您可以在 spark-packages.org/
下载第三方包或注册您自己的包。
工具和用法
Spark MLlib 除了 Java 之外,还为 Scala、Python 和 R 等语言提供了 API。当创建SparkContext
时,它会在端口4040
启动一个监控和仪表化 Web 控制台,使我们能够查看有关运行时的关键信息,包括计划的任务及其进度、RDD 大小和内存使用情况等。还有可用的外部分析工具。
实验、结果和分析
我们在这里解决的业务问题与之前使用 H2O 进行实验所描述的问题相同。我们总共使用了 MLlib 中的五种学习算法。第一个是使用从计算大量k值得到的成本(特别是平方和误差(SSE))确定的k值进行 k-Means 聚类,并选择曲线的“肘部”。确定最优的k值通常不是一个容易的任务;通常,为了选择最佳的k,会比较如轮廓等评估指标。尽管我们知道数据集中类的数量是7,但如果假设我们没有标记数据,看到此类实验的走向也是有益的。使用肘部方法找到的最优k值为 27。在现实世界中,业务决策可能经常指导k的选择。
在以下列表中,我们展示了如何使用 MLlib 套件中的不同模型来进行聚类分析和分类。代码基于 MLlib API 指南中提供的示例(spark.apache.org/docs/latest/mllib-guide.html
)。我们使用 CSV 格式的标准化 UCI CoverType
数据集。请注意,使用较新的spark.ml
包中的spark.sql.Dataset
更为自然,而spark.mllib
包则更紧密地与JavaRDD
协同工作。这为 RDD 提供了抽象,并允许对底层的转换进行优化。对于大多数无监督学习算法来说,这意味着数据必须进行转换,以便用于训练和测试的数据集默认包含一个名为 features 的列,该列包含观察到的所有特征作为向量。可以使用VectorAssembler
对象进行这种转换。源代码中给出了对 ML 管道的使用示例,这是一种将任务链式连接起来的方法,用于训练随机森林分类器。
k-Means
以下 k-Means 实验的代码片段使用了来自org.apache.spark.ml.clustering
包的算法。代码包括设置SparkSession
(Spark 运行时的句柄)的最小模板代码。请注意,在设置中指定了本地模式下的八个核心:
SparkSession spark = SparkSession.builder()
.master("local[8]")
.appName("KMeansExpt")
.getOrCreate();
// Load and parse data
String filePath = "/home/kchoppella/book/Chapter09/data/covtypeNorm.csv";
// Selected K value
int k = 27;
// Loads data.
Dataset<Row> inDataset = spark.read()
.format("com.databricks.spark.csv")
.option("header", "true")
.option("inferSchema", true)
.load(filePath);
ArrayList<String> inputColsList = new ArrayList<String>(Arrays.asList(inDataset.columns()));
//Make single features column for feature vectors
inputColsList.remove("class");
String[] inputCols = inputColsList.parallelStream().toArray(String[]::new);
//Prepare dataset for training with all features in "features" column
VectorAssembler assembler = new VectorAssembler().setInputCols(inputCols).setOutputCol("features");
Dataset<Row> dataset = assembler.transform(inDataset);
KMeans kmeans = new KMeans().setK(k).setSeed(1L);
KMeansModel model = kmeans.fit(dataset);
// Evaluate clustering by computing Within Set Sum of Squared Errors.
double SSE = model.computeCost(dataset);
System.out.println("Sum of Squared Errors = " + SSE);
spark.stop();
通过评估和绘制不同值的平方和误差,并选择曲线的肘部值,得到了最佳聚类数量值。这里使用的值是27。
带 PCA 的 k-Means
在第二个实验中,我们再次使用了 k-Means,但首先通过 PCA 减少了数据中的维度。在这里,我们使用了一个经验法则,即选择 PCA 参数的维度值,以确保在降维后至少保留了原始数据集 85%的方差。这从最初的 54 个特征产生了转换数据集中的 16 个特征,并且这个数据集被用于本实验和后续实验。以下代码显示了 PCA 分析的相关代码:
int numDimensions = 16
PCAModel pca = new PCA()
.setK(numDimensions)
.setInputCol("features")
.setOutputCol("pcaFeatures")
.fit(dataset);
Dataset<Row> result = pca.transform(dataset).select("pcaFeatures");
KMeans kmeans = new KMeans().setK(k).setSeed(1L);
KMeansModel model = kmeans.fit(dataset);
Bisecting k-Means (with PCA)
第三个实验使用了 MLlib 的 Bisecting k-Means 算法。这个算法类似于一种自上而下的层次聚类技术,其中所有实例最初都在同一个簇中,然后进行连续的分割:
// Trains a bisecting k-Means model.
BisectingKMeans bkm = new BisectingKMeans().setK(k).setSeed(1);
BisectingKMeansModel model = bkm.fit(dataset);
高斯混合模型
在下一个实验中,我们使用了 MLlib 的高斯混合模型(GMM),另一种聚类模型。该模型固有的假设是每个簇中的数据分布本质上是高斯分布,具有未知参数。这里指定了相同数量的簇,并且已使用默认值作为最大迭代次数和容忍度,这些值决定了算法何时被认为已收敛:
GaussianMixtureModel gmm = new GaussianMixture()
.setK(numClusters)
.fit(result);
// Output the parameters of the mixture model
for (int k = 0; k < gmm.getK(); k++) {
String msg = String.format("Gaussian %d:\nweight=%f\nmu=%s\nsigma=\n%s\n\n",
k, gmm.weights()[k], gmm.gaussians()[k].mean(),
gmm.gaussians()[k].cov());
System.out.printf(msg);
writer.write(msg + "\n");
writer.flush();
}
随机森林
最后,我们运行了随机森林,这是唯一可用的能够处理多类分类的集成学习器。在以下代码中,我们可以看到这个算法在训练之前需要执行一些预备任务。预处理阶段被组合成一个由 Transformers 和 Estimators 组成的管道。然后使用该管道来拟合数据。您可以在 Apache Spark 网站上了解更多关于管道的信息(spark.apache.org/docs/latest/ml-pipeline.html
):
// Index labels, adding metadata to the label column.
// Fit on whole dataset to include all labels in index.
StringIndexerModel labelIndexer = new StringIndexer()
.setInputCol("class")
.setOutputCol("indexedLabel")
.fit(dataset);
// Automatically identify categorical features, and index them.
// Set maxCategories so features with > 2 distinct values are treated as continuous since we have already encoded categoricals with sets of binary variables.
VectorIndexerModel featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexedFeatures")
.setMaxCategories(2)
.fit(dataset);
// Split the data into training and test sets (30% held out for testing)
Dataset<Row>[] splits = dataset.randomSplit(new double[] {0.7, 0.3});
Dataset<Row> trainingData = splits[0];
Dataset<Row> testData = splits[1];
// Train a RF model.
RandomForestClassifier rf = new RandomForestClassifier()
.setLabelCol("indexedLabel")
.setFeaturesCol("indexedFeatures")
.setImpurity("gini")
.setMaxDepth(5)
.setNumTrees(20)
.setSeed(1234);
// Convert indexed labels back to original labels.
IndexToString labelConverter = new IndexToString()
.setInputCol("prediction")
.setOutputCol("predictedLabel")
.setLabels(labelIndexer.labels());
// Chain indexers and RF in a Pipeline.
Pipeline pipeline = new Pipeline()
.setStages(new PipelineStage[] {labelIndexer, featureIndexer, rf, labelConverter});
// Train model. This also runs the indexers.
PipelineModel model = pipeline.fit(trainingData);
// Make predictions.
Dataset<Row> predictions = model.transform(testData);
// Select example rows to display.
predictions.select("predictedLabel", "class", "features").show(5);
// Select (prediction, true label) and compute test error.
MulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator()
.setLabelCol("indexedLabel")
.setPredictionCol("prediction");
evaluator.setMetricName("accuracy");
double accuracy = evaluator.evaluate(predictions);
System.out.printf("Accuracy = %f\n", accuracy);
使用 k-Means 和 Bisecting k-Means 的实验的均方误差在以下表中给出:
算法 | k | 特征 | SSE |
---|---|---|---|
k-Means | 27 | 54 | 214,702 |
k-Means(PCA) | 27 | 16 | 241,155 |
Bisecting k-Means(PCA) | 27 | 16 | 305,644 |
表 3:k-Means 的结果
GMM 模型被用来展示 API 的使用;它为每个簇输出高斯混合的参数以及簇权重。所有簇的输出可以在本书的网站上查看。
对于随机森林的情况,这些是不同树的数量运行的结果。这里使用了所有 54 个特征:
树的数量 | 准确率 | F1 度量 | 加权精度 | 加权召回率 |
---|---|---|---|---|
15 | 0.6806 | 0.6489 | 0.6213 | 0.6806 |
20 | 0.6776 | 0.6470 | 0.6191 | 0.6776 |
25 | 0.5968 | 0.5325 | 0.5717 | 0.5968 |
30 | 0.6547 | 0.6207 | 0.5972 | 0.6547 |
40 | 0.6594 | 0.6272 | 0.6006 | 0.6594 |
表 4:随机森林的结果
结果分析
如 表 3 所示,在 PCA 后使用较少维度时,成本略有增加,而簇的数量保持不变。随着 PCA 中 k 的变化,可能表明 PCA 情况下的更好 k。注意,在这个实验中,对于相同的 k,使用 PCA 导出的特征的 Bisecting K-Means 具有最高的成本。用于 Bisecting k-Means 的停止簇数简单地被选为基本 k-Means 确定的那个,但不必如此。对于 Bisecting k-Means,可以独立进行寻找最佳成本 k 的类似搜索。
在随机森林的情况下,当使用 15 棵树时,我们看到最佳性能。所有树都有三个深度。这个超参数可以变化以调整模型。尽管随机森林由于在训练阶段考虑了树之间的方差,因此不易过拟合,但将树的数量增加到最佳数量以上可能会降低性能。
实时大数据机器学习
在本节中,我们将讨论大数据机器学习的实时版本,其中数据以大量形式到达,并且同时以快速的速度发生变化。在这些条件下,机器学习分析不能按照传统的“批量学习与部署”实践进行 per (参考文献 [14])。
图 21:实时大数据机器学习的用例
让我们考虑一个案例,其中在短时间内有标记数据可用,我们对数据进行适当的建模技术,然后对生成的模型应用最合适的评估方法。接下来,我们选择最佳模型,并在运行时使用它对未见数据进行预测。然后,我们观察到,模型性能随着时间的推移显著下降。用新数据进行重复的练习显示出类似性能的退化!我们现在该怎么办?这种困境,加上大量数据,促使我们需要不同的方法:实时大数据机器学习。
与批量学习框架类似,大数据中的实时框架在数据准备阶段之前可能具有类似的组件。当数据准备中涉及的计算必须在流或流与批量数据组合上进行时,我们需要专门的计算引擎,例如 Spark Streaming。像流计算一样,机器学习必须在集群上工作,并在流上执行不同的机器学习任务。这给单机多线程流算法的实现增加了额外的复杂性。
图 22:实时大数据组件和提供商
SAMOA 作为实时大数据机器学习框架
在第五章“实时流机器学习”中,我们详细讨论了 MOA 框架。SAMOA 是用于在流上执行机器学习的分布式框架。
在撰写本文时,SAMOA 是一个孵化级开源项目,拥有 Apache 2.0 许可证,并与不同的流处理引擎(如Apache Storm、Samza和S4)有良好的集成。
SAMOA 架构
SAMOA 框架为可扩展的流处理引擎集提供几个关键流服务,现有实现适用于今天最受欢迎的引擎。
图 23:SAMOA 高级架构
TopologyBuilder
是一个充当工厂的接口,用于在 SAMOA 中创建不同的组件并将它们连接在一起。SAMOA 的核心在于构建数据流的处理元素。处理的基本单元由ProcessingItem
和Processor
接口组成,如图 24 所示。ProcessingItem
是一个封装的隐藏元素,而Processor
是核心实现,其中编码了处理流的逻辑。
图 24:SAMOA 处理数据流
流是另一个接口,它将各种处理器连接起来,作为由TopologyBuilder
创建的源和目的地。一个流可以有一个源和多个目的地。流支持源和目的地之间的三种通信形式:
-
所有: 在本通信中,所有来自源的消息都被发送到所有目的地
-
键: 在本通信中,具有相同键的消息被发送到相同的处理器
-
洗牌: 在本通信中,消息被随机发送到处理器
SAMOA 中的所有消息或事件都是ContentEvent
接口的实现,主要封装流中的数据作为值,并具有某种形式的键以实现唯一性。
每个流处理引擎都有一个作为插件的实现,用于所有关键接口,并与 SAMOA 集成。API 中展示了 Apache Storm 的实现,如 StormTopology、StormStream 和 StormProcessingItem 等,如图 25 所示。
Task 是 SAMOA 中的另一个工作单元,负责执行。所有分类或聚类评估和验证技术,如预 quential、holdout 等,都作为任务实现。
Learner 是用于在 SAMOA 中实现所有监督学习和无监督学习能力的接口。学习者可以是本地的或分布式的,并具有不同的扩展,如ClassificationLearner
和RegressionLearner
。
机器学习算法
图 25:SAMOA 机器学习算法
图 25展示了 SAMOA 拓扑的核心组件及其对不同引擎的实现。
工具和用法
我们继续使用之前相同的商业问题。启动covtype
数据集训练作业的命令行是:
bin/samoa local target/SAMOA-Local-0.3.0-SNAPSHOT.jar "PrequentialEvaluation -l classifiers.ensemble.Bagging
-s (ArffFileStream -f covtype-train.csv.arff) -f 10000"
图 25:袋装模型性能
当与 Storm 一起运行时,这是命令行:
bin/samoa storm target/SAMOA-Storm-0.3.0-SNAPSHOT.jar "PrequentialEvaluation -l classifiers.ensemble.Bagging
-s (ArffFileStream -f covtype-train.csv.arff) -f 10000"
实验、结果和分析
使用 SAMOA 作为大数据基于流的平台进行实验的结果在表 5中给出。
算法 | 最佳准确率 | 最终准确率 | 最终 Kappa 统计量 | 最终 Kappa 时间统计量 |
---|---|---|---|---|
Bagging | 79.16 | 64.09 | 37.52 | -69.51 |
Boosting | 78.05 | 47.82 | 0 | -1215.1 |
VerticalHoeffdingTree | 83.23 | 67.51 | 44.35 | -719.51 |
AdaptiveBagging | 81.03 | 64.64 | 38.99 | -67.37 |
表 5:使用 SAMOA 进行大数据实时学习实验结果
结果分析
从结果分析中,可以得出以下观察:
-
表 5显示,在几乎所有的指标中,基于流行的非线性决策树 VHDT 的 SAMOA 是最具表现力的算法。
-
自适应袋装算法比袋装算法表现更好,因为它在实现中采用了 Hoeffding 自适应树,这些树比基本的在线流袋装更稳健。
-
如预期的那样,在线提升算法由于其依赖弱学习者和缺乏适应性而排名最低。
-
图 25中的袋装图显示了随着示例数量的增加所实现的稳定趋势,这验证了普遍共识,即如果模式是平稳的,更多的示例会导致稳健的模型。
机器学习的未来
机器学习对商业、社会互动,以及我们日常生活的冲击是无可否认的,尽管这种影响并不总是立即显而易见。在不久的将来,它将无处不在,无法避免。根据麦肯锡全球研究院 2016 年 12 月发布的一份报告(参考文献 [15]),在主要行业部门,尤其是在医疗保健和公共部门,数据和分析存在着巨大的未开发潜力。机器学习是帮助利用这种潜力的关键技术之一。我们现在可用的计算能力比以往任何时候都要多。可用的数据也比以往任何时候都要多,而且我们拥有比以往任何时候都要便宜和更大的存储容量。
已经,对数据科学家的未满足需求已经促使全球大学课程发生了变化,并在 2012-2014 年期间导致美国数据科学家的工资每年增长 16%。机器学习可以解决广泛的问题,包括资源分配、预测、预测分析、预测维护以及价格和产品优化。
同一份麦肯锡报告强调了机器学习在包括农业、制药、制造、能源、媒体和金融等行业各种用例中的日益增长的作用,包括深度学习。这些场景涵盖了从预测个性化健康结果、识别欺诈交易、优化定价和调度、根据个体条件个性化作物、识别和导航道路、诊断疾病到个性化广告的各个方面。深度学习在自动化越来越多的职业方面具有巨大潜力。仅仅改善自然语言理解就可能导致全球工资产生 3 万亿美元的潜在影响,影响全球的客户服务和支持类工作。
图像和语音识别以及语言处理方面的巨大进步,得益于深度学习技术的显著进步,使得个人数字助理等应用变得司空见惯。本书开篇章节提到的 AlphaGO 战胜李世石的成功象征意义巨大,它是人工智能进步超越我们预测里程碑的一个生动例证。然而,这只是冰山一角。最近在迁移学习等领域的研究为更广泛智能系统的承诺提供了希望,这些系统能够解决更广泛的问题,而不仅仅是专门解决一个问题。通用人工智能,即 AI 能够发展客观推理、提出解决问题的方法并从其错误中学习,目前还相距甚远,但几年后,这个距离可能会缩小到我们目前的预期之外!日益增长的、相互促进的技术变革正在预示着一个令人眼花缭乱的未来,我们已经在周围看到了这种可能性。看起来,机器学习的角色将继续以前所未有的方式塑造那个未来。对此,我们几乎毫无疑问。
摘要
本书最后一章讨论了适应信息管理和分析领域在过去几十年中出现的最显著范式转变之一——大数据的机器学习。正如计算机科学和工程的其他许多领域所看到的那样,人工智能——特别是机器学习——从创新解决方案和适应大数据带来的众多挑战的专门社区中受益。
一种描述大数据的方式是通过其体积、速度、多样性和真实性。这要求有一套新的工具和框架来执行大规模有效分析的任务。
选择大数据框架涉及选择分布式存储系统、数据准备技术、批量或实时机器学习,以及可视化和报告工具。
可用的开源部署框架包括 Hortonworks 数据平台、Cloudera CDH、Amazon Elastic MapReduce 和 Microsoft Azure HDInsight。每个都提供了一个平台,其中包含支持数据采集、数据准备、机器学习、评估和结果可视化的组件。
在数据采集组件中,发布-订阅是 Apache Kafka (参考文献[8]) 和 Amazon Kinesis 提供的一种模型,它涉及一个在订阅者和发布者之间进行调解的代理。其他选择包括源-汇,SQL,消息队列以及其他自定义框架。
关于数据存储,有几个因素有助于为满足您的需求做出适当的选择。HDFS 提供了一个具有强大容错性和高吞吐量的分布式文件系统。NoSQL 数据库也提供高吞吐量,但通常在一致性方面提供较弱保证。它们包括键值、文档、列和图数据库。
数据处理和准备是流程中的下一步,包括数据清洗、抓取和转换。Hive 和 HQL 在 HDFS 系统中提供这些功能。SparkSQL 和 Amazon Redshift 提供类似的功能。实时流处理可通过 Storm 和 Samza 等产品获得。
在大数据分析的学习阶段,可以包括批量或实时数据。
存在着多种丰富的可视化和分析框架,可以从多个编程环境中访问。
在大数据领域,有两个主要的机器学习框架是 H2O 和 Apache Spark MLlib。两者都可以从各种来源访问数据,如 HDFS、SQL、NoSQL、S3 等。H2O 支持多种机器学习算法,可以在集群中运行。对于实时数据的机器学习,SAMOA 是一个具有全面流处理能力的的大数据框架。
机器学习在未来将扮演主导角色,对医疗保健、金融、能源以及实际上大多数行业都将产生广泛的影响。自动化范围的扩展将不可避免地对社会产生影响。计算能力、数据和存储成本的增加为机器学习应用开辟了新的广阔视野,这些应用有可能提高生产力、激发创新并极大地改善全球的生活水平。
参考文献
-
Matei Zaharia, Mosharaf Chowdhury, Michael J. Franklin, Scott Shenker, Ion Stoica:Spark:使用工作集的集群计算. HotCloud 2010
-
Matei Zaharia, Reynold S. Xin, Patrick Wendell, Tathagata Das, Michael Armbrust, Ankur Dave, Xiangrui Meng, Josh Rosen, Shivaram Venkataraman, Michael J. Franklin, Ali Ghodsi, Joseph Gonzalez, Scott Shenker, Ion Stoica:Apache Spark:一个用于大数据处理的统一引擎. Commun. ACM 59(11): 56-65 (2016)
-
Apache Hadoop:
hadoop.apache.org/
. -
Cloudera:
www.cloudera.com/
. -
Hortonworks:
hortonworks.com/
. -
Amazon EC2:
aws.amazon.com/ec2/
. -
Microsoft Azure:
azure.microsoft.com/
. -
Apache Flume:
flume.apache.org/
. -
Apache Kafka:
kafka.apache.org/
. -
Apache Sqoop:
sqoop.apache.org/
. -
Apache Hive:
hive.apache.org/
. -
Apache Storm:
storm.apache.org/
. -
H2O:
h2o.ai/
. -
Shahrivari S, Jalili S. 超越批量处理:迈向实时和流式大数据. 计算机. 2014;3(4):117–29.
附录 A. 线性代数
线性代数在机器学习中至关重要,它为我们提供了一系列特别适用于数据操作和从数据中提取模式的有用工具。此外,当数据必须像在许多机器学习中那样批量处理时,使用“向量形式”作为传统循环结构的替代,在实现优化、数据预处理或分析中的任何操作时,可以获得巨大的运行时效率。
在以下内容中,我们只考虑实数域。因此,向量代表一个n个实数值的数组。矩阵
是一个具有m行和n列实数值的二维数组。
这里介绍了线性代数基础的一些关键概念。
向量
向量x(小写,粗体,按惯例;等价于)可以被视为n-维空间中的一个点。按惯例,当我们说向量时,我们指的是列向量。列向量的转置是一个具有相同元素数量的行向量,排列在单行中。
向量标量积
也称为点积,标量积定义为等长向量的乘积。该操作的结果是一个标量值,通过求向量对应元素的乘积之和得到。因此,给定向量x和y:
点积xTy表示为:
矩阵
矩阵是一个二维数字数组。每个元素可以通过其行和列位置进行索引。因此,一个 3 x 2 矩阵:
矩阵转置
交换矩阵中的列和行产生转置。因此,A的转置是一个 2 x 3 矩阵:
矩阵加法
矩阵加法定义为具有相同形状的两个矩阵的逐元素相加。设A和B为两个m x n矩阵。它们的和C可以表示如下:
Ci,j = Ai,j + Bi,j
标量乘法
与标量相乘产生一个矩阵,其中每个元素都按标量值缩放。这里A乘以标量值d:
矩阵乘法
如果矩阵A的列数等于矩阵B的行数,则两个矩阵A和B可以相乘。如果A的维度为m x n,B的维度为n x p,则乘积AB的维度为m x p:
矩阵乘积的性质
对加法的分配律:A(B + C) = AB + AC
结合律:A(BC) = (AB)C
非交换性:AB ≠ BA
向量点积是交换的:xTy = yTx
乘积的转置是转置的乘积:(AB)T = ATBT
线性变换
在线性代数中,矩阵与向量的乘积具有特殊的重要性。考虑一个 3 x 2 矩阵 A 与一个 2 x 1 向量 x 的乘积,产生一个 3 x 1 向量 y:
(C)
(R)
考虑前面矩阵-向量乘积的两种观点是有用的,即列图(C)和行图(R)。在列图中,乘积可以看作是矩阵列向量的线性组合,而行图可以看作是矩阵行与向量 的点积。
矩阵逆
矩阵与其逆的乘积是单位矩阵。因此:
如果存在矩阵逆,则可以用来解由前面的向量-矩阵乘积方程表示的联立方程组。考虑一个方程组:
x1 + 2x2 = 3
3x1 + 9x2 = 21
这可以表示为一个涉及矩阵-向量乘积的方程:
我们可以通过将两边乘以矩阵逆来求解变量 x1 和 x2。
矩阵逆可以通过不同的方法计算。读者建议观看斯特兰格教授的麻省理工学院讲座:bit.ly/10vmKcL。
特征分解
矩阵可以被分解为因子,这些因子可以给我们提供关于矩阵表示的变换的宝贵见解。特征值和特征向量是特征分解的结果。对于给定的方阵 A,一个特征向量是一个非零向量,当乘以矩阵时,它被转换为其自身的缩放版本。标量乘数是特征值。一个特征向量的所有标量倍数也是特征向量:
A v = λ v
在前面的例子中,v 是一个特征向量,λ 是特征值。
矩阵 A 的特征值方程由以下给出:
(A — λ I)v = 0
特征值的非零解由特征多项式方程的根给出,该方程的阶数为 n,由行列式表示:
然后可以通过解 Av = λ v 来找到特征向量 v。
一些矩阵,称为可对角化矩阵,可以完全由它们的特征向量和特征值构建。如果 Λ 是具有矩阵 A 的特征值的主对角线的对角矩阵,而 Q 是其列是 A 的特征向量的矩阵:
那么 A = Q Λ Q-1。
正定矩阵
如果一个矩阵只有正特征值,则称为 正定矩阵。如果特征值为正或零,则称为 正半定矩阵。对于正定矩阵,以下说法是正确的:
xTAx ≥ 0
奇异值分解 (SVD)
SVD 是任何尺寸为 n x p 的矩形矩阵 A 的分解,表示为三个矩阵的乘积:
U 被定义为 n x n,S 是一个对角 n x p 矩阵,V 是 p x p。U 和 V 是正交矩阵;即:
S 的对角值称为 A 的奇异值。U 的列称为 A 的左奇异向量,而 V 的列称为 A 的右奇异向量。左奇异向量是 ATA 的正交归一特征向量,右奇异向量是 AAT 的正交归一特征向量。
SVD 表示将原始数据扩展到一个坐标系中,使得协方差矩阵是一个对角矩阵。
附录 B. 概率
这里简要介绍了概率中的基本概念。
概率公理
科尔莫哥洛夫概率公理可以用可能事件样本空间 S、E1、E2、E3、…En 和事件 E 的实值概率 P(E) 来表述。公理如下:
-
P(E) ≥ 0 for all E ϵ S
-
P(S) = 1
-
这些公理共同表明,概率不能是负数——不可能事件具有零概率——样本空间之外的事件不可能发生,因为它是在考虑的可能性宇宙,以及两个互斥事件中任意一个发生的概率等于它们各自概率之和。
贝叶斯定理
在给定证据 X 的条件下,事件 E 的概率与该事件先验概率和证据的似然性成正比。这就是贝叶斯定理:
P(X) 是归一化常数,也称为 X 的边缘概率。P(E) 是先验,P(X|E) 是似然。P(E|X) 也称为后验概率。
以后验和先验概率比的形式表达的贝叶斯定理被称为贝叶斯法则。
密度估计
从从总体中随机抽取的样本数据中估计随机变量的隐藏概率密度函数称为密度估计。高斯混合和核密度估计是特征工程、数据建模和聚类中使用的例子。
给定随机变量 X 的概率密度函数 f(X),可以找到与 X 的值相关的概率如下:
密度估计可以是参数化的,其中假设数据来自已知的分布族,f(x) 通过估计分布的参数来估计,例如,在正态分布的情况下,估计 µ 和 σ²。另一种方法是非参数化的,其中不对观测数据的分布做出假设,并允许数据确定分布的形式。
均值
随机变量的长期平均值称为期望或均值。样本均值是对观测数据的相应平均值。
对于离散随机变量,均值由以下公式给出:
例如,掷一个公平骰子时,出现点数的平均值是 3.5。
对于具有概率密度函数 f(x) 的连续随机变量,其均值是:
方差
方差是随机变量与其均值之间差的平方的期望。
在离散情况下,根据之前讨论的均值定义,以及概率质量函数 p(x),方差是:
在连续情况下,如下所示:
一些连续分布没有均值或方差。
标准差
标准差是衡量数据相对于其均值分散程度的一个指标。它是方差的平方根,与方差不同,它以与数据相同的单位表示。离散和连续随机变量的标准差在此给出:,
-
离散情况:
-
连续情况:
高斯标准差
从更大的总体中随机抽取的样本的标准差是对总体标准差的有偏估计。基于特定的分布,对这个有偏估计的校正可能不同。对于高斯或正态分布,方差通过 的值进行调整。
根据前面给出的定义,有偏估计 s 如下:
在前面的公式中, 是样本均值。
使用贝塞尔校正的无偏估计如下:
协方差
在两个随机变量的联合分布中,随机变量偏离各自均值的乘积的期望值称为协方差。因此,对于两个随机变量 X 和 Y,方程如下:
= E[XY] – μx μy
如果两个随机变量是独立的,那么它们的协方差为零。
相关系数
当协方差通过两个随机变量的标准差乘积进行归一化时,我们得到相关系数 ρ[X,Y],也称为皮尔逊积矩相关系数:
相关系数只能取介于 -1 和 1 之间的值。+1 的系数表示随机变量之间完美的线性增加关系。-1 表示完美的线性减少关系。如果两个变量相互独立,则皮尔逊系数为 0。
二项分布
具有参数 n 和 p 的离散概率分布。一个随机变量是一个二元变量,在单次试验中,其结果概率由 p 和 1 – p 给出。概率质量函数给出了在 n 次独立试验中 k 次成功的概率。
参数:n, k
PMF:
其中:
这就是二项系数。
均值:E[X] = np
方差:Var(X) = np(1 – p)
泊松分布
泊松分布给出了在给定时间段或空间区域内发生事件的次数的概率。
参数 λ,是给定区间内平均发生次数。在该区间内观察到 k 事件的概率质量函数为
PMF:
均值:E[X] = λ
方差:Var(X) = λ
高斯分布
高斯分布,也称为正态分布,是一种连续概率分布。其概率密度函数如下表示,以均值和方差为参数:
均值:µ
标准差:σ
方差:σ²
标准正态分布是均值等于 0 且标准差等于 1 的情况。标准正态分布的概率密度函数如下给出:
中心极限定理
中心极限定理表明,当你有几个独立且同分布的随机变量,且其分布具有明确的均值和方差时,大量这些观测值的平均值(或总和)近似服从正态分布,无论父分布如何。此外,极限正态分布具有与父分布相同的均值,方差等于基础方差除以样本大小。
给定一个随机样本 X1, X2, X3 … Xn,其中 µ = E[Xi] 和 σ2 = Var(Xi),样本均值:
大约服从正态分布
在中心极限定理的几个变体中,放宽了独立性或相同分布的约束,但仍然收敛到正态分布。
误差传播
假设存在一个随机变量 X,它是多个观测值的函数,每个观测值都有自己的分布。在给定 X 组成量的测量值的情况下,关于 X 的均值和方差可以说明什么?这就是误差传播的问题。
假设 x 是通过观察变量 u,v 等确定的量:
x = f(u, v, ...)
让我们假设:
x 的不确定性可以用 u,v 等的方差来表示:
从 x 的方差的泰勒展开中,我们得到以下结果:
这里, 是协方差。
同样,我们可以确定均值的传播误差。给定 N 个测量值,每个测量值为 x[i],其不确定性由 si 表示,可以写成以下形式:
其中:
这些方程假设协方差为 0。
假设 si = s – 即,所有观测值都有相同的误差。
然后,。
由于
因此,。