无监督学习与生成式人工智能(MEAP)(一)

原文:zh.annas-archive.org/md5/ef4ba0ae2a37f1fc608875bd4cfb7156

译者:飞龙

协议:CC BY-NC-SA 4.0

第一章:机器学习简介

“世界上只有模式,模式之上的模式,影响其他模式的模式。被模式隐藏的模式。模式中的模式。” - 查克·帕拉尼克

我们喜欢模式。无论是我们的业务还是我们的生活,我们都会发现模式,并且(通常)倾向于坚持它们。我们有自己喜欢购买的杂货,使用的电信运营商和通话套餐,关注的新闻文章,电影类型和音轨 - 这些都是我们喜好模式的例子。我们热爱模式,而且比模式更喜欢的是发现它们,整理它们,也许习惯于它们!

有一句俗语流传开来 - “数据是新的电力”。数据确实宝贵;这一点无人能否认。但纯粹的数据将毫无用处。我们必须清洗数据,分析和可视化数据,然后我们才能从中获得见解。数据科学、机器学习和人工智能正在帮助我们揭示这些模式 - 从而使我们在活动和业务中能够做出更具洞察力和平衡的决策。

在这本书中,我们将解决一些这样的奥秘。我们将研究一种被称为无监督学习的机器学习分支。无监督学习解决方案是正在改变行业面貌的最有影响力的方法之一。它们被应用于银行和金融、零售、保险、制造业、航空、医学科学、电信等几乎每个行业。

在整本书中,我们讨论了无监督学习的概念 - 算法的基本构建块,它们的细节,背景过程和数学基础。我们审视了这些概念,研究了最佳实践,分析了常见的错误和陷阱,并以案例研究为基础的方法来补充学习。与此同时,我们正在编写解决这些问题的实际 Python 代码。所有的代码都附有逐步解释和注释。

本书分为三个部分。第一部分探讨了无监督学习的基础知识,并涵盖了更简单的概念,如 k 均值聚类、层次聚类、主成分分析等。这一部分为你未来的旅程温和地做了准备。如果你已经精通这些主题,可以直接开始阅读本书的第二部分。建议你快速阅读这些章节,以便刷新概念。

第二部分处于中级水平。我们从关联规则算法如 apriori、ECLAT 和序列规则挖掘开始。然后我们加快步伐,研究更复杂的算法和概念 - 光谱聚类、GMM 聚类、t-SNE、多维缩放(MDS)等。然后我们在下一章节处理文本数据。

第三部分也是最后一部分是高级内容。我们正在讨论像受限玻尔兹曼机、自编码器、生成对抗网络等复杂主题。我们还在书的最后一章中考察了端到端模型开发,包括模型部署、最佳实践和常见陷阱。

当您完成本书时,您将对基于无监督技术的机器学习、各种算法、算法依赖的数学和统计基础、业务用例、Python 实现以及遵循的最佳实践有很好的理解。

本书适合希望深入了解无监督学习算法的学生和研究人员。它适合追求数据科学职业的专业人士,他们希望了解遵循的最佳实践和常见挑战的解决方案。内容非常适合希望在与团队和客户交流时保持信心的经理和领导。最重要的是,适合有好奇心的人,他们打算接受有关无监督学习算法的教育,并开发 Python 经验来解决案例研究。

建议您具有基本的编程理解,比如 C ++、Java、Objective-C 等面向对象的语言。我们将在整本书中使用 Python,所以如果您熟悉 Python,肯定会有所帮助。对数学和几何的基本理解将有助于可视化结果,并且对数据相关用例的一些了解将有助于与业务用例联系起来。最重要的是,全书各章节都需要保持开放的心态来吸收知识。

第一章旨在向您介绍机器学习的概念。在这一开篇章节中,我们将涵盖以下主题:

  1. 数据、数据类型、数据管理和质量

  2. 数据分析、机器学习、人工智能和深度学习

  3. 机器学习的基本知识

  4. 不同类型的机器学习算法

  5. 可用的技术工具包

  6. 总结

让我们首先了解我们拥有的最小颗粒——“数据”作为第一个主题。欢迎来到第一章,祝你一切顺利!

1.1 数据、数据类型、数据管理和质量

我们从一切的主角“数据”开始。数据可以被称为为执行任何类型的分析或研究而收集的事实和统计数据。但是数据有自己的特性、属性、质量措施和管理原则。它被存储、导出、加载、转换和测量。

我们现在将研究所有这些内容——从数据的定义开始。然后我们将继续讨论不同类型的数据、它们各自的示例以及使数据有用且质量良好的属性是什么。

1.1.1 什么是数据

“数据”是无处不在的。使用移动网络打电话 - 你正在产生数据。预订即将到来的假期的机票和酒店 - 正在创建数据。进行银行交易,浏览社交媒体和在线购物网站,购买保险政策,或购买汽车 -任何地方都会产生数据。它从一种形式转变为另一种形式,被储存、清理、管理和分析。

正式地说 - 数据是一组事实、观察、测量、文字、数字、图像和视频。它可能是干净的或不干净的,有序的或无序的,包含混合数据类型的,或者完全纯粹的和历史的或实时的。

图 1.1 我们如何将原始数据转化为信息、知识,最终洞见,可以在业务中用来推动决策和行动

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据本身是没有用的,直到我们清理它、整理它、分析它并从中得出见解。我们可以在(图 1.1)中可视化这种转变。原始数据转换为信息,当我们可以在其中找到区别时。当我们相关术语并*“串联数据”*时,同一段信息变成了知识。洞察力是我们能找到主要中心和显著点的阶段。一个洞察力必须是可操作的,简明扼要和直接的。例如,如果一个电信运营商的客户保留团队被告知那些 9 天内没有打电话的客户较之打电话的客户流失的几率要大 30%,这将是一个有用的洞察力,他们可以加以工作并尝试解决。同样,如果一个制造工厂中的线路技术员被告知使用 Mould ABC 比使用 Mould PQR 导致的瑕疵多 60%,他们就会避免使用这种组合。对于企业团队来说, 洞察力非常有用,因此他们可以采取纠正措施。

我们现在知道什么是数据。让我们研究各种类型的数据及其属性,深入了解数据。

1.1.2 不同类型的数据

数据是我们进行的所有交易中生成的,无论是在线还是线下,正如我们在本章的开始讨论的那样。我们可以把数据大致分类如下图 1.2 所示:

图 1.2 数据可以划分为定量和定性类别,再进行进一步的细分

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 定性数据是一种无法测量或称重的数据类型,例如口味、颜色、气味、健身、名称等。它们只能以主观方式观察。正式地说,当我们对某物进行分类或对其进行分类时,生成的数据是定性的。例如,彩虹中的颜色,国家中的城市,产品的质量,性别等。它们也被称为categorical变量。定性数据可以进一步细分为二进制、名义和序数数据集。

  2. 二进制数据, 顾名思义, 只有两个互斥的类。例如, 是 / 否, 干燥 / 湿润, 硬 / 软, 好/坏, 真/假等。

  3. 名义数据可描述为分类的数据类型,但它没有任何顺序或顺序。例如,一个国家使用不同的语言,一道彩虹中的颜色,客户可用的服务类型,一个国家中的城市等。

  4. 顺序数据与名义数据类似,只是我们可以按顺序排列它。例如,快速/中等/慢,积极/中立/消极等。

  5. 定量数据:所有可以测量、称重、量化、记录等的数据点都是定量数据。例如,身高、收入、客户数量、需求量、面积、体积等。它们是最常见的数据形式,也允许对它们进行数学和统计操作。定量数据进一步细分为离散和连续:

  6. 离散数据是精确的、直截了当的,且为整数。例如,飞机上的乘客数量或城市的人口不能是小数。

  7. 连续数据点可以取任何值,通常在一个范围内。例如,身高可以取小数值,或者产品价格不一定是整数。

任何数据点通常都会落入上述讨论的类别中。这些类别基于变量及其类型。还可以使用来源和用途进行更多的逻辑分组,这在解决业务问题时非常有意义。这种分组允许我们设计针对数据类型定制的解决方案。

根据来源和用途的不同,我们还可以将数据分为两大类:非结构化数据和结构化数据。

  1. 结构化数据:可以轻松表示为行列结构的数据集是结构化数据集。例如,零售店中 5 位客户的交易可以存储如下所示的表格(表 1.1):
表 1.1 结构化数据集的示例,具有金额、日期、城市、商品等属性。
客户 ID交易日期金额(美元)物品数量付款方式城市
10012020 年 6 月 1 日1005现金新德里
10022020 年 6 月 2 日1016纽约
10032020 年 6 月 3 日1027伦敦
10042020 年 6 月 4 日1038现金都柏林
10052020 年 6 月 5 日1049现金东京

在上表中,对于每个唯一的客户 ID,我们有交易日期、花费金额、购买物品数量、付款方式和交易所在城市。这种数据类型可以扩展到员工详细信息、通话记录、银行交易等。

注意

分析和模型构建中使用的大多数数据是结构化的。结构化数据更容易以图表和图形的形式存储、分析和可视化。

我们有很多针对结构化数据的算法和技术 - 在日常现实世界的语言中,我们主要指的是结构化数据。

  1. 非结构化数据:非结构化数据可以是文本、音频、图像或视频。非结构化数据及其相应来源的示例如下图 1.3 所示,我们在其中解释了非结构化数据的主要类型:文本、图像、音频和视频以及它们的示例:
图 1.3 非结构化数据及其各种类型和示例。这些数据通常很难分析,并且通常需要基于深度学习的算法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

值得注意的是,我们的计算机和处理器只能理解二进制数字。因此,这些非结构化数据点仍然需要表示为数字,以便我们可以对其进行数学和统计计算。例如,一幅图像由像素组成。如果是彩色图像,每个像素将具有 RGB(红、绿、蓝)值,而每个 RGB 可以取值范围为(0-255)。因此,我们可以将图像表示为矩阵,进而进行更多的数学计算。类似地,文本、音频和视频也可以被表示。

注意

大多数基于深度学习的解决方案,如 CNN 和 RNN,都用于处理非结构化数据。我们将在本书的后期阶段处理文本和图像数据。

非结构化数据的表示如下例所示(见图 1.4)。我们展示了一张吸尘器的图片。如果将图像的一部分表示为矩阵,将会是这样的。这仅用于说明目的,而不是实际值。

图 1.4 一个示例非结构化数据的图像可以表示为一个矩阵以进行分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

同样,我们可以有文本、音频或视频数据的表示。由于规模庞大和维度众多,非结构化数据处理和建模复杂,因此大多数基于深度学习的模型能够胜任。这些深度学习模型构成了基于人工智能的解决方案的基础。

这些是数据的广义类型。我们可以有更多的类别,如比率或标度,可以用来定义一个变量与另一个变量的关系。所有这些数据点(无论是结构化还是非结构化)都是根据它们在现实生活中生成的方式来定义的。

所有这些数据点都必须被捕获、存储和管理。有很多工具可用于管理数据,我们将在适当的时候讨论其中的一些。但在此之前,让我们先研究一个最关键但往往不被过多谈论的主题 - 数据质量

1.1.3 数据质量

“垃圾进,垃圾出” - 这个原则总结了良好质量数据的重要性。如果数据不干净、可用、正确和相关,我们将无法解决手头的业务问题。但是,“良好质量”是什么意思呢?我们在下面的图 1.5 中展示了数据质量的主要组成部分,让我们逐一探讨它们。

图 1.5 数据质量至关重要,优质数据的属性如图所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

优质数据的主要属性有:

  1. 完整性:我们期望我们的数据集是完整的,不缺少任何值。例如,如果我们正在处理一年的销售数据,良好的数据将具有所有 12 个月的所有值。那么它将是一个完整的数据源。数据集的完整性确保我们没有漏掉重要的变量或数据点。

  2. 有效性:数据的有效性是指其符合我们用例中存在和正在分析的属性、特征和变化的程度。有效性表明我们捕获的观察和测量是否可靠和有效。例如,如果研究的范围是 2015-2019 年,那么使用 2014 年的数据将是无效的。

  3. 准确性:准确性是数据正确性的属性。如果我们有不准确的数据,我们将生成不准确的见解,行动将是错误的。一个好的做法是通过生成 KPI(关键绩效指标)来开始项目,并将它们与业务报告的数字进行比较,以检查我们手头的数据的真实性。

  4. 代表性:这是数据中最重要的属性之一。但通常也是最被低估的。数据的代表性意味着所使用的数据真正捕捉到业务需求,而不是有偏见的。如果数据集存在偏见或代表性不够,生成的模型将无法对新的和未见过的数据进行预测,整个工作将付诸东流。

  5. 可用性:数据的不可用性是我们经常面临的挑战。数据可能无法为业务问题提供,然后我们面临是否继续使用案例的困境。有时我们面临操作挑战,无法访问数据库或面临权限问题,或者数据可能根本不可用于某个特定变量,因为它没有被捕获。在这种情况下,我们必须使用现有的数据,并使用替代变量。例如,想象一下我们正在解决一个需求生成的问题。我们想要预测在即将到来的销售季节期间可以预期在特定商店的顾客人数。但我们没有记录过去几个月访问的客户数量。然后我们可以使用收入作为替代字段,并为我们合成缺失的数据点。

  6. 一致性:在这里,我们检查数据点在系统和界面之间是否一致。不应该出现一个系统报告不同的收入数字,而另一个系统显示完全不同的值的情况。面对这种问题时,我们根据我们手头的数据生成相应的 KPI,并向业务团队寻求指导。

  7. 及时性:这意味着我们在此时拥有所有所需的数据。如果数据集目前不可用,但将来可能会变得可用,那么最好等待到那时。

  8. 完整性:我们拥有的数据表和变量彼此关联和相互关联。例如,员工的详细信息可能分布在多个表中,这些表使用员工 ID 相互关联。数据完整性解决了这一要求,并确保表之间和各个实体之间的所有这些关系是一致的。

数据的良好质量至关重要。在务实的日常业务中,我们经常无法获得高质量的数据。由于多种挑战,很难在系统中找到良好、干净、可访问、一致、代表性和完整的数据。

质量的降低可能是由于数据捕获和收集、导出或加载、所进行的转换等过程中的挑战所导致的。下面列出了一些问题:

  1. 我们可能会在某些列中得到整数作为名称,或者得到特殊字符如“#$!&”,或者得到空值、空白或 NaN(不是一个数字)作为一些值。

  2. 记录中的重复也是我们面临的问题之一。

  3. 异常值是我们经常需要处理的问题之一。例如,假设一个在线零售商的平均日交易量为 1000。有一天,由于服务器问题,没有进行交易。这是一个异常值情况。又比如,有一天,交易数量是 1,000,000。这又是一个异常值的例子。

  4. 然后有关于一天中的时间和一周中的日子的季节性变化和运动 - 所有这些都应该在数据集中足够具有代表性。

  5. 日期格式的不一致会导致在我们尝试合并多个数据源时出现多种挑战。来源 1 可能使用 DD/MM/YYYY,而另一个可能使用 MM/DD/YYYY。这在数据加载步骤中要加以注意。

所有这些异常和质量问题都必须得到彻底解决和清理。我们将在整本书中解决这些数据问题,并分享应遵循的最佳实践。

注意

您的原始数据的质量以及在清理过程中表现出的严谨性 - 定义了您最终分析的影响和解决方案的成熟度。

我们现在已经定义了数据的主要属性。我们现在将研究用于数据工程和管理的广泛过程和技术。

1.1.4 数据工程和管理

强大的数据工程流程和成熟的数据管理实践是成功的机器学习模型解决方案的先决条件。请参考下面的图 1.6,在其中描述了从数据捕获、数据管道和数据加载的过程直到准备好进行分析的点的端到端数据旅程。

图 1.6 数据工程为数据分析铺平了道路。它涉及数据加载、转换、丰富、清理、准备等过程,从而产生了准备好进行分析的数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在数据工程步骤中,数据经过清洗、整理、重塑、转换和摄入。通常情况下,我们有一个服务器,最终的数据存储在那里,准备好进行访问。最常用的过程是创建一个 ETL(导出,转换,加载)过程。然后我们使数据准备好进行分析。我们创建新的变量,处理空值,使用方法丰富数据,最后我们继续到分析/建模阶段。

提示

了解数据工程的基础知识是一个不错的主意,以补充关于数据科学的知识,因为两者是相辅相成的。

因此,我们已经学习了什么是数据,以及好数据的特点。数据被用于分析、建模、可视化、仪表板和洞察力的生成。很多时候,我们发现在业务中数据分析、数据科学、机器学习、数据挖掘、人工智能、商业智能、大数据等术语被相当互换地使用。澄清它们是一个不错的主意 – 这是下一节的主题。我们会讨论到为每个特定功能所提供的大量工具。我们还将了解软件工程在整个过程中的作用。

1.2 数据分析、机器学习、人工智能和商业智能

数据及其重要性在市场上开辟了新的机会,并创造了大量的工作机会。与此同时,机器学习和人工智能是相对较新的领域,因此在工作范围上存在较少的标准化和区分。这导致这些领域的定义和区分不太清晰。我们正在研究这些领域 – 它们在哪些地方有重叠,它们在哪些地方不同,以及一个领域如何赋予另一个领域动力。可以通过下面的图表来可视化(图 1.7):

每个功能相互赋予动力,并相互补充。

图 1.7 各个领域是如何相互关联的,以及它们如何相互依赖的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据挖掘和数据工程通过提供分析所需的数据来启动它。它还导出、转换、清理和加载,以便所有相关的功能可以使用。商业智能和可视化使用这些数据生成报告和仪表板。数据分析使用数据生成洞察和趋势。数据科学建立在数据分析、统计学、商业智能、统计学、数据可视化、机器学习和数据挖掘的基础上。机器学习创建统计和数学模型。人工智能进一步推动了能力。

机器学习使用传统编码。编码是用传统语言完成的,因此计算机科学和软件工程的所有逻辑和规则在机器学习中也是有效的。机器学习帮助我们理解我们否则无法理解的数据。在这个方面,它是一个了不起的解决方案。它可以与历史趋势相关联。机器学习最吸引人的优点是其能够处理视频、音频、图像、文本或传感器生成的复杂数据集等非常复杂和高维的数据点。它使我们能够超越表面的看法。现在人工智能可以实现以前被认为完全不可能的壮举。比如自动驾驶汽车、聊天机器人像人类一样对话、语音转文本和翻译成其他选择的语言、自动评分文章、图片标题等等。

现在我们清楚了各个领域之间的差异以及它们之间的相互联系,以及机器学习与传统软件工程的区别。这是我们讨论的主题的基础,进一步探讨了机器学习及其各个组成部分,不同类型的机器学习算法以及它们各自的用例。

1.3 机器学习的要领

想象一下。如果一个孩子要学会如何打开门把手,我们会向她展示几次确切的步骤。孩子试图打开它,但失败了。再试一次,又失败了。但在随后的每次尝试中,孩子都在改进方法。过了一段时间,孩子就能打开门把手了。或者当我们试图学会开车时,我们会犯错误,我们从中学习,我们改进。机器学习的工作方式类似——统计算法查看历史数据并找到模式和见解。该算法揭示了关系和异常、趋势和偏差、相似性和差异,然后将可操作的结果返回给我们。

正式来说,机器学习可以被称为一种计算机算法的分支或研究,它通过历史数据生成见解并帮助做出数据驱动的决策。这些算法基于统计和数学基础,因此具有合理的逻辑解释。机器学习算法需要编码,可以使用任何可用的语言和工具进行,如 Python、R、SPSS、SAS、MATLAB、Weka、Julia、Java 等。它还需要对业务领域有一定的理解。

注意

语言只是达到目的的手段。即使在不同的语言中使用,所有语言对机器学习算法生成的结果都是相似的。

所以每当你在网上购物买裙子时,网站为你推荐配饰,或者你在预订机票时,旅行运营商根据你的需求和计划为你展示一份定制的优惠 – 机器学习都在背后。它学习了你的偏好并将其与你的历史趋势进行比较。它还在寻找你与行为几乎相同的其他客户的相似之处。基于所有这些分析,算法向你做出了智能的推荐。相当迷人,对吧?

许多时候我们会问这个问题,为什么我们需要机器学习,为什么它能超越人类智慧?原因是,我们人类只能同时分析两个或者也许三个维度。但是机器学习算法可以同时处理 50、60 或者也许是 100 个维度。它可以处理任何类型的数据,无论是结构化的还是非结构化的,并且可以帮助自动化任务。因此它生成的模式和见解对于人类大脑来说是相当难以可视化的。

与任何其他项目一样,机器学习需要一个专家团队,他们密切合作,并互补彼此的技能。如下图 1.8 所示,机器学习项目需要以下角色:

  • 业务利益相关者和主题专家(SME): 他们为项目定义业务问题。他们拥有解决方案,对要求有清晰的理解,并且有一个明确的可衡量目标。他们在团队混淆时进行纠正,并作为业务流程和运营的深度了解的专家。他们是营销经理、产品所有者、流程工程师、质量专家、风险分析师、投资组合负责人等。
注意

业务利益相关者从第一天起与团队紧密联系是至关重要的。

  • 运营团队: 这个团队由 Scrum Master、项目经理、业务分析师等组成。该团队的角色可以与典型的项目管理团队相比较,其跟踪进度,维护记录,报告日常活动,并保持整个项目在正确的轨道上。他们创建用户故事,并充当业务团队和数据团队之间的桥梁。
图 1.8 数据科学项目所需的团队及其彼此之间的相互作用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 数据团队: 创建解决方案、进行编码并以模型、仪表板、报告和见解的形式生成输出的核心团队是数据团队。它包括三个主要支柱:数据工程、UI/可视化团队和数据科学团队。他们的职能如下:

  • 数据工程团队负责构建、维护、集成和接入所有数据点。他们定期进行数据刷新,并充当数据的主要保管者。他们使用 ETL、SQL、AWS、Kafka 等。

  • UI/可视化团队构建仪表板、报告、交互式模块和 Web 应用程序。他们使用 SQL 和 Tableau。Qlik、Power BI 等。

  • 数据科学团队负责所有数据分析和模型构建任务。他们发现模式和见解,测试假设并生成最终输出,最终将被所有人消费。最终输出可以是一个机器学习模型,该模型将用于解决业务问题。在不可能使用机器学习模型的情况下,团队可能生成对业务有用的可操作见解。该团队需要 SQL、Python、R、SAS、SPSS 等来完成他们的工作。

我们已经了解了数据科学项目的典型团队结构。我们将不会检查数据科学项目中的广泛步骤。

数据科学项目的运行方式与其他任何项目都一样,有截止日期、阶段、测试、阶段等。原材料是数据,经过各个阶段进行清洗、分析和建模。

我们在下面(图 1.9)看到了一个数据科学项目阶段的示例图。

图 1.9 数据科学项目与其他项目一样,有阶段和截止日期,依赖关系和过程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

项目从项目的业务问题定义开始。业务问题必须简洁、清晰、可衡量和可实现。下表(表 1-2)显示了一个糟糕的业务问题和一个好的业务问题的示例。

表 1.2 如何定义业务问题使其清晰、简洁和可衡量的示例
不明确的业务问题示例好的业务问题示例
增加产量优化各种成本项(A、B、C 和 D)并确定最佳组合,以便在接下来的 6 个月内将成本降低 1.2%
降低成本
在一个月内将收入增加 80%从过程中的各种缺陷因素(X、Y、Z)中,识别出最重要的因素,以便在接下来的 3 个月内将缺陷率降低 1.8%
自动化整个流程

然后我们进入数据发现阶段,在此阶段我们列出所有数据源并将它们托管。识别和访问所有各种数据集,如客户详情、购买历史、社交媒体数据、投资组合等。在此步骤中,确定要使用的数据表,并且大多数情况下,我们会创建一个数据库供我们工作、测试和学习。

我们进行数据预处理。它涉及清理数据,如去除空值、异常值、重复项、垃圾值等。前一步和这一步可能占据项目时间的 60-70%。

在探索性数据分析阶段我们创建一些报告并生成初步见解。这些见解与业务利益相关者讨论,并征求他们的指导进行调整。

数据现在已准备好进行建模。测试了很多版本的解决方案。根据需求选择最佳版本。主要根据准确率和统计指标(如精确率和召回率)来选择模型。我们将在本书的后面章节中探讨选择最佳模型的过程以及精确率和召回率这样的术语。

最终模型被选择,现在我们准备在生产环境中部署模型,它将处理未知数据。

这是一个机器学习项目的大致步骤。和其他项目一样,它有一个代码存储库,最佳实践,编码标准,常见错误,陷阱等等,我们将在整本书中讨论这些内容。

现在我们将转向一个重要的主题,即机器学习算法的类型,我们现在正在讨论它。

1.4 机器学习算法的类型

机器学习模型正在影响决策,并遵循一种统计方法来解决业务问题。它使用历史数据并分析和建模以生成预测算法。可用的历史数据和要解决的业务问题使我们能够将机器学习算法广泛分为四个类别:有监督学习,无监督学习,半监督学习和强化学习,如下图 1.10 所示。现在我们正在详细讨论这四种类型,重点是无监督学习,这也是本书的主题。

图 1.10 机器学习算法可以分为有监督学习算法,无监督学习算法,半监督学习算法和强化学习算法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.4.1 有监督学习

顾名思义,有监督学习算法有一个“指导”或“监督”来指导我们朝着预测未来的业务目标前进。

严格来说,有监督模型是使用输入数据和期望的输出一起来预测未来的统计模型。输出是我们希望预测的值,被称为目标变量,用于进行预测的数据被称为训练数据。目标变量有时被称为标签。数据中存在的各种属性或变量被称为独立变量。历史数据点或训练示例中包含这些独立变量和相应的目标变量。有监督学习算法为未来的未知数据做出预测。解决方案的准确性取决于训练和从标记的历史数据中学到的模式。描述该概念的示例将在下一节中介绍。

监督学习问题被用于需求预测、信用卡欺诈检测、客户流失预测、保费估算等等。它们在零售、电信、银行和金融、航空、保险等行业被广泛使用。

监督学习算法可以进一步分为回归算法和分类算法。我们将首先处理回归问题。

回归算法

回归算法是监督学习算法,即它们需要被预测的目标变量。这些算法用于预测连续变量的值。例如,收入、降雨量、交易数量、生产产量等等。在监督分类问题中,我们预测一个分类变量,比如是否会下雨(是/否)、信用卡交易是否欺诈等等。这是分类和回归问题之间的主要区别。

让我们通过一个例子来理解回归问题。如果我们假设一个人的体重只取决于身高,而不取决于其他参数如性别、种族、饮食等。在这种情况下,我们希望根据身高预测一个人的体重。数据集可能如下所示,对应的数据图会如图 1.11 所示。

回归模型将能够找到数据中的固有模式并拟合描述关系的数学方程。然后它可以将身高作为输入并预测体重。这里身高是自变量,体重是因变量或我们想要预测的标签。

图 1.11 数据和身高与体重之间关系的绘图,用于回归问题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有许多算法可用于回归问题,主要的算法如下所示:

  1. 线性回归

  2. 决策树

  3. 随机森林

  4. K 近邻

  5. 提升算法

  6. 神经网络

我们可以使用任何算法来解决这个问题。我们将通过使用线性回归来更深入地探索解决这个问题。

线性回归算法通过假设因变量和目标变量之间存在线性关系来建模它们之间的关系。线性回归算法会得出一个问题的数学方程,如方程(1-1)所示。

(方程式 1.1)

权重 = β[0] * 身高 + β[1]

一般来说,线性回归用于拟合描述因变量和自变量之间关系的数学方程,如(1-2)所示。

(方程式 1.2)

Y = β0 + β1 x1 + β2x2 + ….+ε

Y 是我们想要预测的目标变量。

  • x[1] 是第一个自变量

    • x[2] 是第二个自变量

    • ε 是方程中的误差项

  • β[0] 是方程的截距

简单的线性回归问题的可视化如图 1.12 所示。在这里,我们有自变量 x 和因变量 Y,其中 x 是独立变量,Y 是目标变量。线性回归问题的目标是找到最佳拟合线,能够解释数据中存在的随机性。

图 1.12 需要建模的原始数据在左侧。使用回归,识别出最佳拟合线

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个方程用于对未知数据进行预测。线性回归也有变体,如简单线性回归、多元线性回归、非线性回归等。根据手头的数据,我们选择正确的算法。复杂的数据集可能需要各种变量之间的非线性关系。

我们讨论的下一个回归算法是基于树的解决方案。对于基于树的算法,如决策树、随机森林等,算法将从顶部开始,然后像“if-else”块一样迭代地分裂,以创建节点和子节点,直到达到终端节点。可以通过图 1.13 更好地理解。在决策树图中,我们从顶部开始,根节点,然后分裂直到达到终点,即终端节点。

图 1.13 决策树有一个根节点,在分裂后我们得到一个决策节点,终端节点是最终节点,不能进一步分裂

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

决策树非常容易理解和实施,并且训练速度快。它们的可用性在于它们足够直观,适合所有人理解。

还有其他著名的回归算法,如 k 近邻、梯度提升和基于深度学习的解决方案。根据业务问题和相应的准确性,我们更喜欢一个回归算法而不是另一个。

要理解回归使用案例的影响,行业中实施了一些与业务相关的使用案例:

  1. 一个机场运营团队正在评估人员需求,并希望估计预期的乘客流量。这个估计将帮助团队为未来制定计划。它将导致所需资源的优化。回归算法可以帮助预测乘客数量。

  2. 零售商想要了解即将到来的销售季节的预期需求,以便为各种商品规划库存。这将导致成本节约并避免断货。回归算法可以帮助进行这种规划。

  3. 制造厂希望提高现有各种模具和原材料使用的产量。回归解决方案可以建议最佳模具组合,并预测预期产量。

  4. 一家银行向其客户提供信用卡。考虑新客户的信用额度是如何计算的。基于客户的属性,如年龄、职业、收入和以往的交易历史 - 回归算法可以帮助推荐客户级别的信用额度。

  5. 一个保险公司希望利用历史索赔来为其客户制定一个保险费率表。风险可以根据有关驾驶员详细信息、车辆信息等的历史数据来评估。回归肯定可以帮助解决这类问题。

回归问题是监督学习问题的基础,而且在工业界被广泛使用。它们与分类算法一起,是我们正在讨论的大多数预测问题的首选解决方案。

分类算法

简而言之,分类算法用于预测作为因变量的分类变量的值。这个目标变量可以是二元的(是/否,好/坏,欺诈/真实,通过/失败等)或多类的(肯定/否定/中性,是/否/不知道等)。分类算法将通过为目标变量生成概率分数,确定目标事件是否会发生。

在模型已经通过历史数据进行训练之后,分类算法将为未见数据集生成一个概率分数,可用于做出最终决定。根据目标变量中存在的类数,我们的业务决策将有所不同。

让我们看一个分类问题的用例。

想象一下。一个电信运营商正面临着其不断减少的订户基础的问题。现有订户数量正在减少,电信运营商希望制止这种订户流失。为此,设想了一种机器学习模型。

在这种情况下,用于模型构建的历史数据或训练数据可以看起来像下表所示(表 1-3)。这些数据点仅用于说明,不是详尽无遗的。还有其他许多重要变量可用。

表 1.3 电信运营商的结构化数据集示例,显示了多个数据属性
ID收入(美元)服务期限(年)平均费用月使用量(天)流失(是/否)
10011001.10.1010Y
10022004.10.0925N
10033005.20.0528N
10042000.90.2511Y
10051000.50.4512Y

在上面的示例中,数据集包括订户的过去使用数据。最后一列(流失)显示了该订户是否流失出系统。就像订户#1001 流失了,而 1002 没有。因此,业务问题是,我们希望基于此历史数据构建一个机器学习模型,并预测新的未见客户是否会流失。

这里,“流失”状态(是/否)是目标变量。也被称为因变量。像收入、持续时间、平均成本、月度使用量等其他属性是用来创建机器学习模型的自变量。历史数据称为训练数据。在模型训练后,训练好的监督学习模型将为新客户生成预测概率。

对于分类问题,有很多可用的算法,主要列举如下:

  1. 逻辑回归

  2. 决策树

  3. 随机森林

  4. K 最近邻

  5. 朴素贝叶斯

  6. 支持向量机

  7. 提升算法

  8. 神经网络

我们将讨论一种最流行的分类算法之一,称为逻辑回归。逻辑回归使用 logit 函数来建模分类问题。如果我们正在解决二元分类问题,它将是二元逻辑回归,否则是多元逻辑回归。

与线性回归类似,逻辑回归也拟合一个方程,不同之处在于它使用 S 形函数生成事件发生与否的概率分数。

S 形函数是具有特征“S”形曲线或 S 形曲线的数学函数。S 形函数的数学方程是:

S(x) = 1/(1 + e^x),可以重写为 S(x) = ex/(ex + 1)

逻辑回归使用 S 形函数。逻辑回归问题中使用的方程是:

log (p/1-p) = β[0] + β[1] x[1]

其中 p:事件发生的概率

  • β[0]:截距项

    • β[1]:自变量 x[1] 的系数
  • log(p/1-p)称为 logit,(p/1-p)称为比率

如下图 1.14 所示,如果我们尝试为概率函数拟合线性回归方程,效果不佳。我们想要获得概率分数(即介于 0 和 1 之间的值)。线性回归不仅会返回介于 0 和 1 之间的值,还会返回大于 1 或小于 0 的概率分数。因此,我们有了右侧的 S 形函数,它为我们生成了仅在 0 和 1 之间的概率分数。

图 1.14 线性回归模型无法胜任(左),因此我们有了逻辑回归进行分类。线性回归还可以生成大于 1 或小于 0 的概率分数,这在数学上是不正确的。而 S 形函数仅生成 0 和 1 之间的概率分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

逻辑回归算法是最广泛使用的分类问题技术之一。它易于训练和部署,并且通常是我们启动任何监督分类学习项目时的基准算法。

基于树的算法,如决策树和随机森林,也可以用于分类问题。根据需求还可以使用其他算法。

我们简要研究了监督学习算法。我们现在将在下一节讨论无监督学习算法 - 本书的主要主题,然后转移到半监督学习算法。

1.4.2 无监督算法

想象一下,你被给了一些如下图图 1.15 所示的纸标签。任务是使用一些相似性来排列它们。现在有多种方法来解决这个问题。您可以使用颜色,形状或大小。在这里,我们没有任何标签可以指导我们进行这种排列。这是无监督算法的区别。

图 1.15 使用不同参数可以将各种形状聚合在一起的示例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正式地说,无监督学习仅采用输入数据,然后在其中找到模式,而不引用目标变量。因此,无监督学习算法会根据数据集中的模式的存在或缺失做出反应。

无监督学习因此被用于模式检测,探索数据集中的洞见和了解其结构,分割以及异常检测。

我们可以通过下面的 (图 1.16) 来理解无监督学习算法。左侧的图显示了以向量空间图表示的原始数据点。右边是使用无监督学习算法进行的聚类。

图 1.16 无监督学习算法在左侧的数据中发现模式,并在右侧生成簇。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

无监督算法的用例有:

  1. 一个零售集团希望更好地了解客户。任务是提高客户的粘性,收入,访问次数,购物篮大小等。在这里可以使用无监督学习进行客户细分。根据客户的属性,如收入,访问次数,上次访问日期,加入年龄,人口属性等。细分将导致可以个性化定位的簇。结果将是改善客户体验,增加客户生命周期价值等。

  2. 网络提供商需要创建异常检测系统。历史数据将用作异常数据。无监督学习算法将能够找到模式,并且算法将提供异常值。显著的异常将是需要解决的异常。

  3. 一个医疗产品公司希望查找其患者图像数据中是否存在任何潜在模式。如果有任何模式和因素,这些患者可以得到更好的治疗,也许需要不同的方法。无监督学习可以帮助处理图像数据,从而更好地处理患者。

  4. 数字营销公司希望了解传入客户数据中的“未知因素”,如社交媒体互动、页面点击、评论、星级等。这种理解将有助于改善客户的推荐和整体购买体验。

无监督学习算法在发现模式时提供了灵活性和性能。它们可用于各种数据 - 结构化数据、文本或图像或文本。

无监督学习算法的数量比监督学习少。主要的无监督学习算法有:

  1. 聚类算法

  2. k-means 聚类

  3. 分层聚类

  4. DB Scan 聚类

  5. 光谱聚类

  6. 主成分分析

  7. 奇异值分解

  8. 关联规则

  9. t-SNE(t 分布随机邻域嵌入)

  10. 自动编码器

我们将在接下来的章节中详细介绍所有这些算法。我们将审查数学概念、隐藏过程、Python 实现以及整本书的最佳实践。

让我们通过一个案例研究来理解。

零售商希望深入了解其消费者群体。然后希望通过使用属性(如人物、以前的购买、回应、外部数据等)对整个客户数据集进行分段。

对于用例,在无监督学习项目中遵循的步骤如下图 1.17 所示。

步骤 1:我们通过定义业务问题来启动项目。我们希望更好地了解客户群体。客户分割方法可以是一个好的解决方案。我们想要使用数学 KPI(关键绩效指标)区分的分段。

图 1.17 从数据源到部署就绪的最终解决方案的无监督学习算法步骤

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 2:这是数据发现阶段。识别和访问所有各种数据集,如客户详细信息、购买历史、社交媒体数据、投资组合等。在这一步中确定要使用的数据表。然后所有数据表通常加载到一个共同的数据库中,我们将用来分析、测试和学习。

步骤 3:现在我们可以访问数据了。下一步是清理数据并使其可用。

我们将处理所有空值、NAN、垃圾值、重复项等。

步骤 4:一旦数据清理干净并准备好使用,我们将对其进行探索性数据分析。通常,在探索性分析期间,我们识别模式、循环、异常、最大-最小范围、标准差等。EDA 阶段的输出将是见解和理解。我们还将生成一些图表和图表,如下图 1.18 所示:

图 1.18 数据探索性分析图表示例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 5:我们现在将开始无监督的方法。我们想要实现聚类方法,因此我们可以尝试几种聚类方法,如 k 均值,层次聚类等。基于他们的各种属性,聚类算法将产生客户的同质化分段。

在案例研究中,我们将使用过去 2-3 年的数据,这是训练数据。由于我们使用的是无监督方法,这里没有目标变量。该算法将根据他们的交易模式、人口统计模式和购买偏好将行为相似的客户段合并起来。在图 1.19 中会呈现如下形式:

图 1.19 聚类算法的输出,在此我们可以使用各种属性对客户进行分段

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 6:我们现在将检查各种算法的表现,换句话说,我们将比较每种算法的准确性。选择的最终聚类算法将产生客户的同质化分段,可以针对并提供定制优惠。

步骤 7:我们将与业务利益相关者讨论结果。有时,利用业务眼光,我们会合并或拆分一些细分市场。

步骤 8:将解决方案部署到生产环境中,我们准备好处理新的未见过的数据集了。

这些是无监督问题中的广泛步骤。算法的创建和选择是一项繁琐的任务。我们将在书中详细研究它。

到目前为止,我们已经讨论了监督和无监督问题。接下来,我们将转向半监督算法,它位于监督和无监督算法的并列位置。

1.4.3 半监督算法

半监督学习是两种方法的中间路径。半监督方法的主要原因是缺乏完整的标记数据集进行训练。

正式地说,半监督方法同时使用监督和无监督方法 - 监督用于对数据点进行分类,无监督用于将它们分组。

在半监督学习中,我们最初使用监督算法对较少数量的标记数据点进行训练。然后,我们使用它来标记或伪标记新的数据点。两个数据集(标记和伪标记)被合并在一起,我们进一步使用这个数据集进行分析。

半监督算法在数据集部分可用的情况下使用,例如医疗行业中的图像。如果我们通过分析患者的图像来创建癌症检测解决方案,可能不会有足够的训练图像样本集。在这种情况下,半监督方法可能会有所帮助。

现在我们将讨论机器学习中的最后一类,称为强化学习。

1.4.4 强化学习

想象一下你正在与计算机下棋。就像这样:

第一轮:你在 5 步后获胜

第二轮:你在 8 步后获胜

第三轮:你在 14 步后获胜

第四轮:你赢了,共进行了 21 步

第五轮:计算机获胜!

这里发生的是,算法根据每次交互进行自我训练,并进行纠正/改进。

形式上,强化学习解决方案是自我维持的解决方案,它们使用一系列试错来进行自我训练。一个序列跟着另一个序列。强化学习的核心是奖励信号。如果动作是积极的,那么奖励就是积极的,表示继续下去。如果动作是消极的,奖励将惩罚该活动。因此,解决方案将始终纠正自己并向前移动,从而通过迭代改进自己。

自动驾驶汽车是强化学习算法的最佳例子。它们会检测何时左转或右转,何时移动以及何时停止。现代视频游戏也使用强化学习算法。强化学习使我们能够突破技术的障碍,并想象以前被认为是不可能的事情。

这样一来,我们就涵盖了不同类型的机器学习算法。它们共同利用数据的真正力量,对我们的生活产生了持久的影响。

但解决方案的核心是技术,我们尚未讨论过。我们现在将转向制作这些解决方案所需的技术堆栈。

1.5 技术工具包

以下工具用于项目的不同方面:

  1. 数据工程:Hadoop,Spark,Scala,Java,C++,SQL,AWS Redshift,Azure

  2. 数据分析:SQL,R,Python,Excel

  3. 机器学习:SQL,R,Python,Excel,Weka,Julia,MATLAB,SPSS,SAS

  4. 可视化:Tableau,Power BI,Qlik,COGNOS

  5. 模型部署:docker,flask,Amazon S3

  6. 云服务:Azure,AWS,GCP

在这本书中,我们将使用 Python 进行工作。建议您在系统上安装最新版本的 Python。建议使用 Python 版本(3.5+)。我们将使用 Jupyter Notebook,因此建议您在系统上安装 Anaconda。

注意

所有代码和数据集将在 GitHub 存储库中签入。您应该复制它们并尝试重现结果。

最常见的问题是:R 和 Python 哪个更好?两者都是出色的语言。两者都被广泛使用。但是在 TensorFlow、Keras 等人工智能库引入后,Python 稍微占优势了一些。

通过这一点,我们结束了对技术的讨论。技术与概念一起使机器学习算法为我们工作。我们将在整本书中探讨所有这些更精细的方面。

祝贺!您已经完成了您迈向学习无监督机器学习技术的第一步。是时候结束并转向摘要了。

1.6 总结

机器学习和人工智能确实是开创性的。它们正在改变我们的出行方式,我们点餐,我们规划,我们购买,我们看医生或订购处方 - 它们无处不在地产生影响。机器学习确实是一种强大的能力,正在为未来铺平道路,并且在模式识别、异常检测、定制和自动化任务方面表现比现有技术栈要好得多。自动驾驶,癌症检测,欺诈识别,人脸识别,图像字幕和聊天机器人是机器学习和人工智能超越传统技术的几个例子。现在是进入该领域的最佳时机。该领域吸引了几乎所有业务功能的投资。该领域为整个光谱创造了大量的就业机会。确实令人难以置信和令人印象深刻!

与此同时,该领域缺乏经过训练的专业人才 - 数据分析师、数据工程师、可视化专家、数据科学家和数据从业者。他们现在都是稀有品种。该领域需要定期培养新人才,他们将成为明天的领袖,并将做出数据驱动的决策。但是我们只是初步了解了数据的力量 - 还有很长的路要走。

在本书的引言章节中,我们向您介绍了机器学习和数据科学的概念。我们比较了各种流程,数据科学项目的步骤以及所需的团队。我们重点考虑了无监督学习算法的类型和各自的用例。

在下一章中,我们将更深入地探讨无监督学习中聚类的概念。我们将讨论所有的数学和统计基础、实用案例研究、Python 实现。第二章涉及更简单的聚类算法 - K-means 聚类、层次聚类和 DBSCAN。在本书的后续章节中,我们将研究更复杂的聚类主题,如 GMM 聚类、时间序列聚类、模糊聚类等。

您现在可以进入问题部分了!

问题

Q1:为什么机器学习如此强大,以至于现在被大量使用?

Q2:机器学习算法有哪些不同类型,它们之间有何不同?

Q3:机器学习项目中的步骤是什么?

Q4:数据工程的作用是什么,为什么它很重要?

Q5:机器学习有哪些可用工具?

第二章:聚类技术

在这第二章中,我们将涵盖以下主题:

  • 行业中的聚类技术及其显著用例

  • 可用的各种聚类算法

  • K 均值、层次聚类和 DBSCAN 聚类

  • 在 Python 中实现算法

  • 聚类分析案例研究

“简单是最终的精妙” – 列奥纳多·达·芬奇

大自然崇尚简单,教导我们走同样的路。大多数时候,我们的决定都是简单的选择。简单的解决方案更容易理解,耗时更少,更容易维护和思考。机器学习世界也不例外。一个优雅的机器学习解决方案不是最复杂的可用算法,而是解决业务问题的一个。一个强大的机器学习解决方案易于理解,并且实施起来实用。聚类解决方案通常更容易被理解。

在上一章中,我们定义了无监督学习,并讨论了可用的各种无监督算法。随着我们在本书中的工作,我们将涵盖每一种算法;在这第二章中,我们将专注于其中的第一个:聚类算法。

我们将首先定义聚类,然后学习不同类型的聚类技术。我们将检查每种算法的数学基础、准确度测量以及优缺点。我们将使用 Python 代码在数据集上实现其中三种算法,以补充理论知识。本章结束时,我们将探讨聚类技术在实际业务场景中的各种用例,为进入实际业务世界做准备。这种技术在整本书中都在使用,我们首先学习概念,然后实现实际代码以提高 Python 技能,并深入研究实际的业务问题。

本章我们将学习基本的聚类算法,包括 K 均值聚类、层次聚类和 DBSCAN 聚类。这些聚类算法通常是我们研究聚类时的起点。在本书的后面章节中,我们将探讨更复杂的算法,如谱聚类、高斯混合模型、时间序列聚类、模糊聚类等。如果你对 K 均值聚类、层次聚类和 DBSCAN 有很好的理解 - 你可以跳到下一章。但建议你读完本章一次 - 你可能会发现一些有用的东西来更新你的概念!

让我们首先了解一下“聚类”是什么意思。祝你在掌握基于无监督学习的聚类技术的旅程中一切顺利!

2.1 技术工具箱

本章我们将使用 Python 的 3.6+版本。我们期望你对 Python 和代码执行有基本的了解。建议你复习面向对象编程和 Python 概念。

本书始终使用 Jupyter 笔记本执行代码。Jupyter 在执行和调试方面提供了灵活性,因此被广泛使用。它非常用户友好,可以在任何平台或操作系统上使用。所以,无论你使用 Windows、Mac OS 还是 Linux,Jupyter 都可以正常工作。

所有数据集和代码文件都已经检入到 Github 代码库中(github.com/vverdhan/UnsupervisedLearningWithPython/tree/main/Chapter2)。你需要安装以下 Python 库来执行代码 – numpy, pandas, matplotlib, scipy, sklearn。CPU 足够执行,但如果遇到一些计算延迟,并且想加快执行速度,切换到 GPU 或 Google 协作平台(colab)。Google 协作平台为机器学习解决方案提供免费计算。建议你了解更多关于谷歌协作平台以及如何用它来训练机器学习算法的内容。

现在,我们将在下一节开始聚类。

2.2 聚类

想象一下这样的情景。一群孩子被要求将房间中的物品分成不同的部分。每个孩子都可以使用自己的逻辑。有人可能根据重量来分类物品,其他孩子可能使用材料,而另一些人可能同时使用重量、材料和颜色。排列组合很多,取决于用于分组的 参数。在这里,一个孩子根据所选择的逻辑对物品进行分组或 clustering

正式来说,clustering 用于将具有相似属性的对象分组到同一段中,具有不同属性的对象分到不同段中。结果的聚类在自身之间具有相似性,而它们在彼此之间更加异质。我们可以通过下图(图 2.1)更好地理解它。

图 2.1 聚类是将具有相似属性的对象分组到逻辑段中。分组是基于不同观测共享的相似性特征,因此它们被分组到一组中。在这里,我们使用形状作为聚类的变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

聚类分析不是单个算法或解决方案,而是用于解决实际业务场景中的问题的机制。它们是无监督学习下的一类算法。这是一个迭代过程,遵循逻辑方法和定性业务输入。它导致对数据的深入理解、其中的逻辑模式、模式发现和信息检索。作为一种无监督方法,聚类不需要目标变量。它通过分析数据集中的潜在模式来进行分段,这些模式通常是多维的,因此难以用传统方法分析。

理想情况下,我们希望聚类算法具有以下特点:

  • 输出的聚类应该易于解释和理解,可用且应该具有商业意义。聚类数目不应该太少或太多。例如,如果我们只有 2 个聚类,分割就不够清晰和明确。或者如果我们有 20 个聚类,处理将变得很有挑战性。

    • 算法不应过于敏感于异常值、缺失值或数据集中的噪声。通常来说,一个好的解决方案应该能够处理多种数据类型。

    • 一个好的解决方案对于用于聚类目的的输入参数需要较少的领域理解。这允许具有较少领域理解的分析师训练聚类算法。

    • 算法应该独立于输入参数的顺序。如果顺序很重要,那么聚类就会对顺序产生偏见,因此会给过程增加更多的混乱。

  • 随着我们持续生成新的数据集,聚类必须能够适应新的训练示例,并且不应该是一个耗时的过程。

众所周知,聚类输出将取决于用于分组的属性。在下面所示的(图 2.2)中,对于相同的数据集,可以有两个逻辑分组,而且两者都是同样有效的。因此,明智地选择用于聚类的属性或变量通常取决于手头的业务问题。

图 2.2 使用不同的属性进行聚类会得到相同数据集的不同聚类结果。因此,选择正确的属性集定义我们将实现的最终结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除了用于聚类的属性之外,所使用的实际技术也会产生很大影响。研究人员已经开发了相当多(事实上超过 80 个)的聚类技术。对于感兴趣的观众,我们在附录中提供了所有聚类算法的列表。我们将在下一节开始学习不同的聚类技术。

2.2.1 聚类技术

聚类可以通过各种算法实现。这些算法使用不同的方法来定义对象之间的相似性。例如,基于密度的聚类,基于中心点的聚类,基于分布的方法等。甚至在衡量对象之间距离时,也有多种技术,如欧氏距离,曼哈顿距离等。选择距离测量方法会导致不同的相似度分数。我们将在后面的部分研究这些相似度测量参数。

在高层次上,我们可以确定两种广义的聚类方法:硬聚类软聚类(见图 2.3)。当决定非常明确一个对象属于某个类或簇时,称为硬聚类。在硬聚类中,算法非常确定对象的类。另一方面,软聚类为对象被归属于某个特定簇分配了可能性得分。因此,软聚类方法不会将对象放入一个簇中,而是一个对象可以属于多个簇。有时软聚类也被称为模糊聚类。

图 2.3 硬聚类具有明显的簇,而在软聚类的情况下,数据点可以属于多个簇,我们得到数据点属于簇的可能性分数。左边的第一个图是硬聚类,右边的图是软聚类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以如下图所示广义地将聚类技术进行分类:

表 2.1 聚类方法的分类、简要描述和示例
序号聚类方法方法的简要描述示例
1基于质心的聚类到指定质心的距离k-means
2基于密度的模型数据点在向量空间的密集区域内连接DBSCAN, OPTICS
3基于连接性的聚类距离连接性是行动方式分层聚类, BIRCH
4分布模型建模基于统计分布高斯混合模型
5深度学习模型无监督的基于神经网络的自组织映射

表 2.1 中描述的方法并不是唯一可用的方法。我们可以有基于图的模型、重叠的聚类、子空间模型等。

通常,工业中使用的六种流行的聚类算法如下:

  1. K 均值聚类(带有诸如 k-中值、k-中心点之类的变种)

  2. 凝聚式聚类或者分层聚类

  3. DBSCAN (基于密度的空间应用聚类)

  4. 光谱聚类

  5. 高斯混合模型或 GMM

  6. BIRCH(平衡迭代减少 & 使用层次聚类)

还有多种其他可用的算法,如 Chinese whisper,canopy 聚类,SUBCLU,FLAME 等。我们在本章中学习前三种算法以及书中后续章节中的一些高级算法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 快速测验-回答这些问题以检查你的理解… 答案在书的末尾

  1. DBSCAN 聚类是基于质心的聚类技术。TRUE or FALSE.

  2. 聚类是一种监督学习技术,具有固定的目标变量。TRUE or FALSE.

  3. 硬聚类和软聚类有什么区别?

在下一节中,我们将开始学习基于质心的聚类方法,其中我们将学习 k-means 聚类。

2.3 基于质心的聚类

基于重心的算法根据对象到聚类重心的距离来衡量它们的相似性。距离是针对聚类的特定数据点到重心的距离来衡量的。距离越小,相似度越高。我们可以通过接下来的图 2.4 来理解这个概念。右侧的图表示了每个聚类组的相应重心。

注意

要更清楚地了解重心和其他数学概念,请参考末尾的附录。

图 2.4 基于重心的聚类方法为各自的聚类创建一个重心,并根据到重心的距离来衡量相似度。在这种情况下,我们有 5 个重心。因此,这里有五个不同的聚类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在聚类中,距离起着核心作用,因为许多算法将其用作度量相似性的度量。在基于重心的聚类中,距离是在点之间和重心之间进行衡量的。有多种方法来度量距离。最常用的是下面列出的:

  1. 欧几里德距离:它是最常用的距离度量。它表示空间中两点之间的直线距离,是两点之间的最短路径。如果我们想计算点 P[1]和 P[2]之间的距离,其中 P[1]的坐标为(x[1], y[1]),P[2]的坐标为(x[2], y[2]),那么欧几里德距离由下面的(方程式 2.1)给出。几何表示如图 2.5 所示
(方程式 2.1)

距离 = √(y[2] – y[1])² + (x[2] – x[1])²

如果你想复习几何概念(坐标几何),请参考附录。
  1. 切比雪夫距离:以俄罗斯数学家帕夫努蒂·切比雪夫的名字命名,它被定义为两点之间的距离,以便它们的差异在任何坐标维度上的最大值。数学上,我们可以在下面的(方程式 2.2)中表示切比雪夫距离,并在(图 2.5)中显示:
(方程式 2.2)

距离[切比雪夫] = max (|y[2] – y[1]|, |x[2] – x[1]|)

  1. 曼哈顿距离:曼哈顿距离是一个非常简单的概念。它只是计算网格路径上两点之间的距离,因此距离是沿着右角轴测量的。因此,有时它也被称为城市街区距离或出租车度量。数学上,我们可以在(方程式 2.3)中表示曼哈顿距离,并如图 2.5 所示:
(方程式 2.3)

距离[曼哈顿] = (|y[2] – y[1]| + |x[2] – x[1]|)

曼哈顿距离以 L1 范数形式而欧几里德距离以 L2 范数形式。您可以参考附录详细学习 L1 范数和 L2 范数。如果数据集中有大量的维度或变量,曼哈顿距离比欧几里德距离更好。这是由于本书第三章将要学习的维度诅咒

  1. 余弦距离:余弦距离用于测量向量空间图中两点之间的相似性。在三角学中,0 度的余弦是 1,90 度的余弦是 0。因此,如果两个点彼此相似,则它们之间的角度将为零,因此余弦将为 1,这意味着这两个点彼此非常相似,反之亦然。从数学上讲,余弦相似性可以表示为(公式 2.4)。如果我们想要测量向量 A 和 B 之间的余弦值,则余弦是
(公式 2.4)

距离 [余弦] = (A . B) / (||A|| ||B||)

如果您想刷新向量分解的概念,请参考附录。
图 2.5 欧氏距离、曼哈顿距离、切比雪夫距离和余弦相似度是主要使用的距离度量。请注意,使用这些度量标准时,两个点之间的距离是不同的。在欧氏距离中,直接距离被测量为左侧第一张图所示的两点之间的距离。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有其他距离度量标准,如汉明距离、Jaccard 距离等。在我们实际的业务问题中,通常使用欧氏距离,但有时也会使用其他距离度量标准。

注意

上述距离度量标准对其他聚类算法也适用。建议您使用本书中的 Python 代码测试不同的距离度量标准,并比较性能。

现在我们已经了解了各种距离度量标准,我们将继续学习 k-means 聚类,这是最广泛使用的算法。

2.3.1 K-means 聚类

k-means 聚类是一种简单直接的方法。它可以说是最广泛使用的聚类方法,用于分段数据点并创建非重叠聚类。我们必须指定我们希望创建的聚类数“k”作为输入,算法将将每个观察结果关联到 k 个聚类中的一个。

注意

有时人们会将 k-means 聚类与 k 最近邻分类器(knn)混淆。虽然两者之间存在一定的关系,但 knn 用于分类和回归问题。

这是一种相当优雅的方法,它从一些初始的聚类中心开始,然后迭代地将每个观察结果分配给最接近的中心。在这个过程中,中心点被重新计算为聚类中的点的平均值。让我们通过下面的图表(图 2.6)逐步学习所使用的方法。为了简单起见,我们假设数据集中有三个聚类。

步骤 1:让我们假设我们有如下所示的所有数据点。

图 2.6 步骤 1 代表原始数据集。在步骤 2 中,算法初始化三个随机质心,因为我们已经给定了三个聚类的输入数。在步骤 3 中,质心的所有相邻点都被分配到同一个聚类中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二步:初始时随机初始化了三个中心,如三个方块所示-蓝色、红色和绿色。这个三是我们希望最后的簇的数量。

第三步:计算所有数据点到中心的距离,并将点分配给最近的中心。注意,由于它们最接近相应的中心,点的颜色变为蓝色、红色和绿色。

第四步:在这一步中,重新调整了三个中心。中心被重新计算为该簇中点的平均值,如图 2.7 所示。我们可以看到,在第四步中,与第三步相比,三个方块的位置发生了变化。

图 2.7 是在第 4 步重新计算质心。在第 5 步中,数据点再次被重新分配新中心。在第 6 步中,根据新的计算结果,质心再次进行调整。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第五步:再次重新计算所有数据点到新中心的距离,并将点重新分配给最近的中心。请注意,在这一步中,两个蓝色数据点变成了红色,而一个红点变成了绿色。

第六步:中心再次进行调整,与第四步类似。

图 2.8 是重新计算质心,并且这个过程一直持续到无法进一步改善聚类为止。然后过程停止,如第 8 步所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第七步:数据点再次被分配到新的簇中,如前图(图 2.8)所示。

第八步:该过程将继续,直到达到收敛。换句话说,该过程将继续,直到不再重新分配数据点。因此,我们无法进一步改进聚类,已实现最终聚类。

k-means 聚类的目标是确保簇内变化尽可能小,而簇之间的差异尽可能大。换句话说,同一簇的成员彼此最相似,而不同簇的成员则不相似。一旦结果不再改变,我们可以得出结论,已达到局部最优,聚类可以停止。因此,最终的簇在内部是同质的,而在彼此之间是异质的。

有两点需要注意:

  1. 由于 k-means 聚类是随机初始化中心点,因此它只能找到局部最优解,而非全局最优解。因此,建议多次迭代解决方案,并从所有结果中选择最佳输出。迭代意味着多次重复该过程,因为在每次迭代中,随机选择的质心将不同。

  2. 我们必须输入我们希望的最终簇数“k”,它会显著改变输出。与数据规模相比,如果 k 值非常小,结果将是多余的簇,因为没有任何用处。换句话说,如果相对于庞大的数据具有非常小的 k 值,具有不同特征的数据点将被混合在几个群中。具有非常高的 k 值将创建微不同的簇。此外,具有非常高数量的簇将难以在长期内管理和更新。让我们通过一个例子来研究。如果一个电信运营商有 100 万订阅者,那么如果我们将簇数设为 2 或 3,得到的簇的规模将非常大。它还可能导致将不同的客户分类到相同的段中。另一方面,如果我们将簇数设为 50 或 60,由于簇数庞大,输出变得难以管理、分析和维护。

使用不同的“k”值,我们会得到不同的结果,因此我们需要了解如何为数据集选择最佳簇数。现在,让我们研究如何测量聚类解决方案的准确性的过程。

2.3.2 测量聚类的准确性

聚类的一个目标是找到最干净的簇。理论上(虽然不理想),如果我们有与观察数量相同的簇数,结果将完全准确。换句话说,如果有 100 万客户,最纯净的聚类将有 100 万个簇 - 每个客户在一个单独的簇中。但这并不是最佳方法,也不是一种实用的解决方案。聚类旨在在一个簇中创建相似观察结果的组,并且我们使用相同的原理来衡量解决方案的准确性。

  1. 簇内平方和(WCSS)或聚合:这个指标衡量数据点相对于它们距离簇质心的距离的变异性。这个指标是每个数据点距离簇的质心的平均距离,对每个数据点重复。如果值太大,表明数据扩散很大,而较小的值表示数据点非常相似和均匀,因此簇是紧凑的。

有时,这个簇内距离也被称为该簇的惯性。它简单地是所有距离的总和。惯性值越低,簇就越好。

图 2.9 簇内距离与簇间距离 - 两者都用于衡量最终簇的纯度和聚类解决方案的性能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 聚类间平方和:此度量用于衡量所有聚类质心之间的距离。为了得到它,我们测量所有聚类的质心之间的距离,并将其除以聚类的数量以获得平均值。它越大,聚类越好,表明聚类是异质的,并且彼此可以区分,正如我们在(图 2.9)中所表示的那样。

  2. 轮廓系数是衡量聚类成功的指标之一。它的取值范围从-1 到+1,数值越高越好。它衡量了数据点与其所属聚类中其他数据点相似程度,与其他聚类相比。作为第一步,对于每个观察值——我们计算与同一聚类中所有数据点的平均距离,我们称之为 x[i]。然后我们计算与最近聚类中所有数据点的平均距离,我们称之为 y[i]。然后我们通过下面的方程(方程 2.5)计算系数

(方程 2.5)

轮廓系数 = (y[i] - x[i])/ max(y[i],x[i])

如果系数的值为-1,则意味着观察点位于错误的聚类中。

如果为 0,则该观察点与相邻聚类非常接近。

如果系数的值为+1,则意味着该观察点与相邻聚类之间存在距离。

因此,我们期望获得系数的最高值以获得良好的聚类解决方案。

  1. Dunn 指数也可用于衡量聚类的效果。它使用了点 2 和点 3 中定义的聚类间距离和聚类内距离测量,并由下面的方程(方程 2.6)给出
(方程 2.6)

Dunn 指数 = min(聚类间距离)/max(聚类内距离)

显然,我们会努力最大化 Dunn 指数的值。为了实现这一点,分子应尽可能大,意味着聚类之间相距较远,而分母应尽可能低,表明聚类非常健壮且紧密排列。

现在我们已经检验了衡量算法性能的方法。我们现在将转向寻找 k-means 聚类的最佳“k”值。

2.3.3 寻找最佳的“k”值

选择最优的聚类数量并不容易。正如我们之前所说,最好的聚类是当聚类数量等于观察数量时——但是正如我们在上一节中所学到的,这在实际中是不可能的。但是我们必须将聚类数量“k”作为算法的输入提供。

图 2.10 肘方法寻找最优聚类数量。红色圆圈表示转折点。但最终的聚类数量取决于业务逻辑,通常根据业务知识合并/拆分聚类。维护聚类的便利性在其中也扮演了至关重要的角色

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

或许找到“k”的最优值最广泛使用的方法是Elbow Method。在这种方法中,我们计算不同“k”值的簇内平方和或 WCSS。该过程与上一节中讨论的相同。然后,将 WCSS 绘制在图表上,针对不同的“k”值。在我们观察到一个弯曲或肘部的地方,如(图 2.10)所示,它就是数据集的最优簇数。注意(图 2.10)中描绘的锋利边缘。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 测验 - 回答这些问题来检查你的理解。书的结尾有答案。

  1. K-means 聚类不需要作为输入的簇数- 真 或 假

  2. Knn 和 k-means 聚类是一回事 - 真 或 假

  3. 描述一种可能的找到最优“k”值的过程

但这并不意味着这是我们建议用于业务问题的最终簇数。根据落入每个簇的观测数量,几个簇可能被合并或分解成子簇。我们还考虑创建簇所需的计算成本。簇的数量越多,计算成本和所需时间就越大。

我们也可以使用前面讨论过的 Silhouette Coefficient 找到最优的簇数。

注意:

探讨合并几个簇或拆分几个簇的业务逻辑是至关重要的。最终,解决方案必须在实际的业务场景中实施。

通过这个,我们已经研究了 k-means 聚类的点点滴滴 - 数学概念和过程,各种距离度量以及确定最佳 k 值。现在我们将研究 k-means 算法为我们提供的优势。

2.3.4 k-means 聚类的优缺点

k-means 算法是一个非常流行和广泛实施的聚类解决方案。该解决方案提供以下优势:

  • 与其他算法相比,它简单易懂且相对容易实现。距离测量计算使得即使是非统计背景的用户也很容易理解。

    • 如果维度的数量很大,k-means 算法比其他聚类算法更快,创建的簇更紧凑。因此,如果维度的数量相当大,则更倾向于使用它。

    • 它很快适应新的观察结果,并且能够非常好地概括各种形状和大小的簇。

  • 解决方案通过一系列重新计算的迭代产生结果。大多数情况下使用欧氏距离度量,这使得计算成本较低。它还确保算法一定会收敛并产生结果。

K-means 在现实生活中的业务问题中被广泛使用。尽管 k-means 聚类有明显的优点,但我们确实面临着算法的某些挑战:

  • 选择最佳聚类数目并不容易。我们必须将其作为输入提供。使用不同的“k”值,结果会完全不同。选择最佳“k”值的过程在上一节中已经探讨过。

    • 解决方案取决于质心的初始值。由于质心是随机初始化的,因此每次迭代的输出都将不同。因此,建议运行多个解决方案的版本并选择最佳的一个。

    • 该算法对异常值非常敏感。它们可能会破坏最终结果,因此在开始聚类之前,我们必须处理异常值。我们还可以实现 k 均值算法的其他变体,如k-modes聚类,以应对异常值的问题。我们将在后续章节讨论处理异常值的方法。

  • 由于 k 均值聚类的基本原理是计算距离,因此该解决方案不直接适用于分类变量。换句话说,我们不能直接使用分类变量,因为我们可以计算数字值之间的距离,但不能对分类变量进行数学计算。为了解决这个问题,我们可以使用独热编码将分类变量转换为数字变量,这是我们在本章末尾讨论的内容之一。

尽管存在这些问题,k 均值聚类是最常用的聚类解决方案之一,因其简单性和易于实现。还有一些不同版本的 k 均值算法,如 k-medoids、k-中位数等,有时用于解决所面临的问题。

  1. 如其名,k-中位数聚类是基于数据集中位数而不是 k 均值中心的。这增加了计算时间,因为只有在数据排序之后才能找到中位数。但与此同时,k 均值对异常值很敏感,而 k 中位数对它们的影响较小。

  2. 接下来,我们有k-medoids 聚类作为 k 均值算法的变体之一。Medoids 与均值类似,只是它们始终来自同一数据集,并且在难以获得均值的情况下实施,比如图像。Medoid 可以被认为是簇中最核心的点,与簇中的所有其他成员最不相似。K-medoids 选择实际观测值作为中心,而不是 k 均值,其中质心甚至可能不是数据的一部分。与 k 均值聚类算法相比,它对异常值的敏感性较低。

还有其他版本,如 kmeans++、小批量 k 均值等。一般来说,在工业界,大多数聚类解决方案都使用 k 均值。如果结果不理想或计算时间太长,您可以探索其他选项,如 kmeans++、小批量 k 均值等。此外,使用不同的距离测量指标可能会为 k 均值算法产生不同的结果。

本节结束了我们对 k-means 聚类算法的讨论。是时候进入实验室,开发真正的 Python 代码了!

2.3.5 使用 Python 实现 k-means 聚类

我们现在将为 k-means 聚类创建一个 Python 解决方案。在这种情况下,我们使用了链接中的数据集

github.com/vverdhan/UnsupervisedLearningWithPython/tree/main/Chapter2

这个数据集包含了四种车型的特征信息。基于车辆的特征,我们将把它们分成不同的群。

第 1 步: 将库和数据集导入到一个数据框中。在这里,vehicles.csv 是输入数据文件。如果数据文件不在与 Jupyter 笔记本相同的文件夹中,您需要提供文件的完整路径。Dropna 用于删除可能存在的缺失值。

import pandas as pd
vehicle_df = pd.read_csv('vehicle.csv').dropna()

第 2 步: 对数据进行一些初始检查,比如形状、信息、前五行、类别分布等。这是为了确保我们已经加载了完整的数据集,并且在加载数据集时没有损坏。Shape命令将给出数据中的行数和列数,info将描述所有变量及其类型,head将显示前 5 行。value_counts显示class变量的分布。换句话说,value_counts返回唯一值的计数。

vehicle_df.shape
vehicle_df.info()
vehicle_df.head()
pd.value_counts(vehicle_df['class'])

第 3 步: 让我们为变量“class”生成两个图表。数据集中的汽车示例更多,而对于公共汽车和货车,数据是平衡的。我们使用 matplotlib 库来绘制这些图表。图表的输出如下所示。

import matplotlib.pyplot as plt
%matplotlib inline
pd.value_counts(vehicle_df["class"]).plot(kind='bar')
pd.value_counts(vehicle_df['class']).hist(bins=300)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 4 步: 现在我们将检查数据集中是否有任何缺失的数据点。我们的数据集中没有缺失的数据点,因为我们已经处理过了。

vehicle_df.isna().sum()
注意

我们将在后面的章节中讨论处理缺失值的方法,因为删除缺失值通常不是最好的方法。

第 5 步: 现在我们将对数据集进行标准化。对于聚类来说,标准化数据集是一个很好的实践。这是很重要的,因为不同的维度可能处于不同的尺度,如果某个维度的值自然上比其他维度的值要大得多,那么一个维度可能会在距离计算中占据主导地位。下面使用zscoreStandardScaler()函数来实现。请参考书的附录,了解zscoreStandardScaler()函数之间的区别。

vehicle_df_1 = vehicle_df.drop('class', axis=1)
from scipy.stats import zscore
vehicle_df_1_z = vehicle_df_1.apply(zscore)
from sklearn.preprocessing import StandardScaler
import numpy as np
sc = StandardScaler()
X_standard = sc.fit_transform(vehicle_df_1)

第 6 步: 我们现在要快速查看数据集,生成一个散点图。该图显示了我们在上一步中创建的X_standard的所有数据点的分布。

plt.scatter(X_standard[:,0], X_standard[:,1])
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 7: 我们现在将执行 k-means 聚类。首先,我们必须使用肘部法选择最佳聚类数。从 sklearn 库中,我们导入 KMeans。在一个 for 循环中,我们对聚类值从 1 到 10 进行迭代。换句话说,算法将创建 1、2、3、4 到 10 个聚类,然后生成结果供我们选择最优 k 值。

在下面的代码片段中,模型对象包含了在上一步生成的 X_standard 上适配的 KMeans 算法的输出。这里,欧几里得距离被用作距离度量。

from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
clusters=range(1,10)
meanDistortions=[]
for k in clusters:
    model=KMeans(n_clusters=k)
    model.fit(X_standard)
    prediction=model.predict(X_standard)
    meanDistortions.append(sum(np.min(cdist(X_standard, model.cluster_centers_, 'euclidean'), axis=1)) / X_standard
                           .shape[0])
plt.plot(clusters, meanDistortions, 'bx-')
plt.xlabel('k')
plt.ylabel('Average distortion')
plt.title('Selecting k with the Elbow Method')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 8: 正如我们所观察到的,最佳聚类数为 3. 这是一个尖锐转折点,在图表中清晰可见。我们将使用 3 个聚类数进行 k-means 聚类。尽管这里的数字 3 没有特别之处,但它最适合这个数据集,我们也可以使用 4 或 5 个聚类数。random_state 是一个用于确定质心初始化的参数。我们将其设置为一个值以使随机性变得确定性。

kmeans = KMeans(n_clusters=3, n_init = 15, random_state=2345) 
kmeans.fit(X_standard)

步骤 9: 获取聚类的质心

centroids = kmeans.cluster_centers_
centroids

步骤 10: 现在我们将使用质心,以便它们可以按列进行分析。

centroid_df = pd.DataFrame(centroids, columns = list(X_standard) )

步骤 11: 我们现在将创建一个仅用于创建标签的 dataframe,然后将其转换为分类变量。

dataframe_labels = pd.DataFrame(kmeans.labels_ , columns = list(['labels']))
dataframe_labels['labels'] = dataframe_labels['labels'].astype('category')

步骤 12: 在这一步中,我们将两个 dataframes 进行连接

dataframe_labeled = vehicle_df_1.join(dataframe_labels)

步骤 13: 执行 group by 操作以创建用于分析的数据框

dataframe_analysis = (dataframe_labeled.groupby(['labels'] , axis=0)).head(1234)
dataframe_labeled['labels'].value_counts()  

步骤 14: 现在,我们将为我们定义的聚类创建可视化。这是使用 mpl_toolkits 库完成的。逻辑很容易理解。数据点根据相应的标签着色。其余的步骤与调整标签、标题、刻度等有关的细节。由于在绘图中不可能绘制所有的 18 个变量,我们选择了 3 个变量来显示在图中。

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 6))
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=20, azim=60)
kmeans.fit(vehicle_df_1_z)
labels = kmeans.labels_
ax.scatter(vehicle_df_1_z.iloc[:, 0], vehicle_df_1_z.iloc[:, 1], vehicle_df_1_z.iloc[:, 3],c=labels.astype(np.float), edgecolor='k')
ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Length')
ax.set_ylabel('Height')
ax.set_zlabel('Weight')
ax.set_title('3D plot of KMeans Clustering on vehicles dataset')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们也可以用多个其他值对上述代码进行测试。我们已经创建了使用不同值的代码。出于空间考虑,我们将不同值的测试代码放在了 github 位置。

在上面的例子中,我们首先对数据集进行了小型的探索性分析。

注意

探索性数据分析(EDA)是实现稳健机器学习解决方案和成功项目的关键。在随后的章节中,我们将为数据集创建详细的 EDA。

接下来是确定最佳聚类数,本例中为三。然后我们实施了 k-means 聚类。您应该迭代不同的初始化 k-means 解决方案并比较结果,迭代不同的 k 值,并可视化以分析数据点的移动。在本章后面,我们将使用 Python 创建层次聚类的相同数据集。

基于质心的聚类是最推荐的解决方案之一,因为其逻辑较少,易于实现,灵活性高且易于维护。每当我们需要聚类作为解决方案时,大多数情况下我们都会从创建一个作为基准的 k 均值聚类解决方案开始。该算法非常受欢迎,通常是聚类的首选解决方案之一。然后我们会测试并迭代其他算法。

这标志着对基于质心的聚类算法的讨论结束。我们现在将继续前进,讨论连接性解决方案,并在下一节中讨论层次聚类。

2.4 基于连接性的聚类

“物以类聚”是连接性聚类中遵循的原则。核心概念是-彼此连接的对象相似。因此,根据这些对象之间的连接性,它们被组合成簇。图 2.11 中展示了这种表示的一个示例,我们可以迭代地对观察进行分组。例如,我们从所有事物开始,分成生物和非生物等等。这种表示最好使用右侧的图表展示,称为Dendrogram

图 2.11 层次聚类利用迭代地对相似对象进行分组。右侧是聚类的可视化表示,称为树状图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于存在树状结构,连接性聚类有时被称为层次聚类。

层次聚类很好地符合人类直觉,因此我们容易理解它。与 k 均值聚类不同,在层次聚类中,我们不必输入最终聚类的数量,但该方法确实需要一个终止条件,即聚类应何时停止。同时,层次聚类不建议聚类的最佳数量。从生成的层次结构/树状图中,我们必须自己选择最佳的聚类数。在接下来的部分中,当我们为其创建 Python 代码时,我们将更多地探讨它。

层次聚类可以通过图 2.12 来理解,如下所示。这里第一个节点是根节点,然后迭代地分裂成节点和子节点。每当一个节点不能再进一步分裂时,它被称为终端节点或叶子

图 2.12 层次聚类具有一个根节点,分裂为节点和子节点。不能再进一步分裂的节点称为叶子。在自底向上的方法中,将合并叶子节点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于将观察结果合并成簇的过程或逻辑不止一个,我们可以生成大量的树状图,如下所示的(Equation 2.7):

(Equation 2.7)

树状图数量 = (2n-3)!/[2^((n-2)) (n-2)!]

其中 n 是观察数或叶子数。所以如果我们只有 2 个观察,我们只能有 1 个树状图。如果有 5 个观察,我们可以有 105 个树状图。因此,根据观察数,我们可以生成大量的树状图。

根据用于创建观察值分组的过程,层次聚类可以进一步分类,我们将在下面探讨这一点。

2.4.1 层次聚类的类型

基于分组策略,层次聚类可以细分为两种类型:聚合聚类和分裂聚类。

序号聚合方法分裂方法
1自底向上方法自顶向下方法
2每次观察都会创建自己的群集,然后随着算法的进行而进行合并我们从一个群集开始,然后观察被迭代地分割以创建类似树状的结构
3采用贪婪方法进行合并(下面描述了贪婪方法)采用贪婪方法进行分割
4观察会找到最佳配对进行合并,当所有观察都与彼此合并时,流程完成一开始会取全部观察,然后根据分裂条件进行分割,直到所有观察都被用完或达到终止条件
图 2.13 中层次聚类的步骤。从左到右是聚合聚类(节点的分裂),从右到左是分裂聚类(节点的合并)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们先探讨贪婪方法的含义。贪婪方法或贪婪算法是指在每一步都会做出最佳选择,而不考虑对未来状态的影响。换句话说,我们活在当下,并从当下可用的选择中选择最佳选项。当前选择与未来选择无关,算法会在以后解决子问题。贪婪方法可能不会提供最优解,但通常在合理时间内会提供接近最优解的局部最优解。层次聚类在合并或分割节点时遵循这种贪婪方法。

我们现在将审查层次聚类方法中的步骤:

第一步: 如上图(图 2.13)所示,假设我们的数据集中有五个观察值– 1, 2, 3, 4 和 5。

第二步: 在这一步中,观察 1 和 2 被分为一组,4 和 5 被合并成一组。3 没有被合并到任何一组中。

第三步: 现在,在这一步中,我们将前一步中 4,5 的输出和观察 3 分为一个群集。

第四步: 步骤 3 的输出与 1,2 的输出结合成为一个单一的群集。

在这种方法中,从左到右,我们有一种自下而上的方法,而从右到左则是一种自上而下的方法。在自下而上的方法中,我们正在合并观测结果,而在自上而下的方法中,我们正在分割观测结果。我们可以同时使用自下而上或自上而下的方法进行层次聚类。分割性聚类是一种详尽的方法,有时可能比其他方法花费更多时间。

与 k-means 聚类类似,在这里用于测量距离的距离度量标准起着重要作用。我们知道并了解如何测量数据点之间的距离,但是有多种方法来定义该距离,我们现在正在研究这些方法。

2.4.2 距离测量的链接标准

我们知道我们可以使用欧氏距离、曼哈顿距离或切比雪夫距离等距离度量标准来衡量两个观测之间的距离。同时,我们可以采用各种方法来定义该距离。根据这个输入标准,得到的聚类结果将不同。定义距离度量标准的各种方法包括:

  • 最近邻或单链接 使用不同聚类中两个最近点之间的距离。计算不同聚类中最近邻的距离,并用于确定下一个分裂/合并。通过对所有成对进行穷举搜索来完成。

    • 最远邻或完全链接 是最近邻方法的相反。在这里,我们不是考虑最近邻,而是专注于不同聚类中的最远邻。换句话说,我们确定聚类之间的距离是通过两个对象之间的最大距离计算的。

    • 群体平均链接 计算两个不同聚类中所有可能的对象对之间距离的平均值。

  • Ward 链接 方法旨在最小化合并为一体的聚类的方差。

在我们为层次聚类开发实际代码时,我们可以使用这些距离度量的选项,并比较准确度以确定数据集的最佳距离度量。在算法训练期间,算法将合并最小化所选择的链接标准的观测。

注意

算法的这些输入被称为超参数。这些是我们向算法提供的参数,以根据我们的要求生成结果。超参数的一个例子是 k-means 聚类中的“k”。

我们可以在下面的图 2.14 中可视化各种链接。

图 2.14(i)单链接是最近邻(ii)完全链接是最远邻(iii)群体平均是聚类之间距离的平均值

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过这个,我们已经理解了层次聚类中的工作机制。但我们仍然没有解决使用层次聚类确定最优聚类数量的机制,我们正在研究这个问题。

2.4.3 最佳聚类数量

回想一下,在 k 均值聚类中,我们必须将聚类的数量作为算法的输入。我们使用肘部法确定最佳聚类数量。在层次聚类中,我们不必向算法指定聚类的数量,但仍然必须确定我们希望拥有的最终聚类数量。我们使用树状图来解决这个问题。

假设我们总共有 10 个数据点显示在图 2.15 底部。聚类会迭代地合并,直到我们得到一个最终聚类在顶部。树状图的高度,在两个聚类相互合并时表示向量空间图中的两个聚类之间的相应距离。

图 2.15 树状图用于确定最佳聚类数量。X 和 Y 之间的距离大于 A&B 和 P&Q,因此我们选择该位置作为切割点来创建聚类,并选择聚类数量为 5。x 轴表示聚类,y 轴表示两个聚类之间的距离(不相似度)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从树状图中,聚类的数量由水平线切割的垂直线数量决定。最佳聚类数量由树状图中被水平线切割的垂直线数量给出,使得它与最高的垂直线相交。或者如果切割从垂直线的一端移动到另一端,那么所覆盖的长度是最大的。树状图利用聚类的分支显示各个数据点之间的关系密切程度。在树状图中,位于相同高度水平的聚类比位于不同高度水平的聚类之间更密切相关。

在图 2.15 中显示的示例中,我们展示了三个潜在的切割点 - AB,PQ 和 XY。如果我们在 AB 上方切割,将导致两个非常宽泛的聚类,而在 PQ 下方切割,将导致九个聚类,这将变得难以进一步分析。

这里,X 和 Y 之间的距离大于 A&B 和 P&Q。因此,我们可以得出结论,X 和 Y 之间的距离最大,因此我们可以将其确定为最佳切割。该切割在五个不同点相交,因此我们应该有五个聚类。因此,树状图中切割的高度类似于 k 均值聚类中的 k 值。在 k 均值聚类中,“k”确定聚类的数量。在层次聚类中,最佳切割确定我们希望拥有的聚类数量。

类似于 k 均值聚类,最终的聚类数量并不仅取决于算法的选择。商业眼光和实用逻辑在确定最终聚类数量方面起着至关重要的作用。回顾一下,聚类的重要属性之一是它们的可用性,我们在之前的第 2.2 节中已经讨论过。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 小测验——回答这些问题来检验你的理解力。答案在书的结尾。

  1. 层次聚类中使用的贪婪方法是什么?

  2. 完全连接法用于查找最接近邻居的距离——正确还是错误?

  3. 群组联接与瓦德联接有什么区别?

  4. 描述找到“k”最优值的过程

我们已经讨论了层次聚类的背景以及如何确定聚类。现在我们将讨论我们在层次聚类中面临的优势和挑战。

2.4.4 层次聚类的优缺点

层次聚类是一种强大的聚类技术,也很受欢迎。类似于 K 均值,它也使用距离作为衡量相似性的度量。同时,该算法也存在一些挑战。我们正在讨论层次聚类的利与弊。层次聚类的优势包括:

  • 也许我们在层次聚类中最大的优势就是结果的可重现性。回顾一下,在 K 均值聚类中,过程始于对中心点的随机初始化,因而会得到不同的结果。而在层次聚类中,我们可以重现结果。

    • 在层次聚类中,我们不需要输入要对数据进行分段的聚类数。

    • 实施是容易实现和理解的。由于它遵循类似树的结构,因此可以向非技术背景的用户解释清楚。

  • 生成的树状图可以通过可视化来解释数据并产生非常好的理解。

与此同时,我们在使用层次聚类算法时面临一些挑战:

  • 层次聚类最大的挑战是收敛所需的时间。K 均值的时间复杂度是线性的,而层次聚类是二次的。举例来说,如果我们有“n”个数据点,那么对于 K 均值聚类,时间复杂度将是 O(n),而对于层次聚类,则是 O(n³)。
如果你想学习 O(n),可以参考本书的附录。
  • 由于时间复杂度为 O(n³),这是一个耗时的任务。此外,计算所需的内存至少是 O(n²),使得层次聚类成为一个非常耗时和内存密集型的过程。即使数据集是中等大小,这也是一个问题。如果我们使用高端处理器,则计算可能不是一个挑战,但对于普通计算机来说可能会成为一个问题。

    • 有时树状图的解释可能会有主观性,因此在解释树状图时需要谨慎。解释树状图的关键是注重任何两个数据点连接的高度。由于不同的分析人员可能会解释出不同的切割点并试图证明他们的方法,因此解释可能存在主观性。因此,建议在数学的光线下解释结果,并将结果与现实世界的业务问题相结合。

    • 层次聚类无法撤销其之前所做的步骤。如果我们觉得某个连接不正确,应该撤销,但目前还没有机制可以移除连接。

  • 该算法对异常值和混乱的数据集非常敏感。异常值、NULL、缺失值、重复项等使数据集变得混乱。因此,结果可能不正确,也不是我们预期的。

尽管存在种种挑战,层次聚类是最常用的聚类算法之一。通常,我们为同一数据集创建 k-means 聚类和层次聚类,以比较两者的结果。如果建议的簇的数量和各自簇的分布看起来相似,我们对所使用的聚类方法更有信心。

我们已经涵盖了对层次聚类的理论理解。现在是行动的时候,跳入 Python 进行编码。

使用 Python 的层次聚类案例研究

现在,我们将为层次聚类创建一个 Python 解决方案,使用与 k-means 聚类相同的数据集。

步骤 1-6: 加载所需的库和数据集。为此,请按照我们在 k-means 算法中所遵循的步骤 1 到 6 进行操作。

步骤 7: 接下来,我们将使用三种链接方法(平均、Ward 和完全)创建层次聚类。然后对簇进行绘图。该方法的输入是 X_Standard 变量、使用的链接方法和距离度量。然后,使用 matplotlib 库,我们绘制树状图。在代码片段中,只需将方法从“average”更改为“ward”和“complete”,就可以得到相应的结果。

from scipy.cluster.hierarchy import dendrogram, linkage
Z_df_average = linkage(X_standard, 'average', metric='euclidean')
Z_df_average.shape
plt.figure(figsize=(30, 12))
dendrogram(Z_df_average)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 8: 现在,我们想要选择我们希望拥有的簇的数量。为此目的,让我们通过对最后 10 个合并的簇进行子集划分来重新创建树状图。我们选择了 10,因为这通常是一个最佳选择,建议您也尝试其他值。

dendrogram(
    Z_df_complete,
    truncate_mode='lastp',    p=10,)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 9: 我们可以观察到,最优距离是 10。

步骤 10: 将数据聚类到不同的组中。通过使用上一节描述的逻辑,最优簇的数量被确定为四个。

from scipy.cluster.hierarchy import fcluster
hier_clusters = fcluster(Z_df_complete, max_distance, criterion='distance')
hier_clusters
len(set(hier_clusters)) 

步骤 11: 使用 matplotlib 库绘制不同的簇。

plt.scatter(X_standard[:,0], X_standard[:,1], c=hier_clusters)  
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 12: 对于不同的距离值,簇的数量会改变,因此图表会呈现不同的样子。我们展示了距离为 5、15、20 的不同结果,并且每次迭代生成的簇的数量也不同。在这里,我们可以观察到,当我们从左到右移动时,对于不同距离值,我们得到完全不同的结果。在选择距离值时,我们必须要谨慎,有时候,我们可能需要多次迭代才能得到最佳值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,我们可以观察到,使用分层聚类,我们已将数据从图 2 下面的左侧分割到右侧。左侧是原始数据的表示,而右侧是聚类数据集的表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分层聚类是一种强大的方法,也是一种高度推荐的方法。与 k-means 一起,它为基于聚类的解决方案建立了良好的基础。大多数情况下,至少这两种技术在我们创建聚类解决方案时会被考虑。然后,我们会继续尝试其他方法。

这标志着对基于连通性的聚类算法的讨论的结束。我们现在将前进到基于密度的解决方案,并在下一节讨论 DBSCAN 聚类。

2.5 基于密度的聚类

我们在早期章节中学习了 k-means。回想一下它如何使用基于质心的方法将聚类分配给每个数据点。如果一个观测值是异常值,异常值将质心拉向自己,并像正常观测值一样分配到一个聚类中。这些异常值不一定为聚类带来信息,并且可能会不成比例地影响其他数据点,但仍然被作为聚类的一部分。此外,如图 2.16 所示,使用 k-means 算法获取任意形状的聚类是一项挑战。基于密度的聚类方法为我们解决了这个问题。

图 2.16 DBSCAN 非常适用于不规则形状的聚类。通过 k-means,我们通常会得到球形聚类,而 DBSCAN 可以为我们解决这个问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在基于密度的聚类算法中,我们解决了所有这些问题。在基于密度的方法中,将那些与数据集的其他部分相比具有更高密度的区域标识为聚类。换句话说,在表示数据点的向量空间图中 - 一个聚类由高密度点的相邻区域或邻近区域定义。该聚类将被低密度点的区域与其他聚类分开。在稀疏区域或分隔区域中的观测被视为数据集中的噪音或异常值。密度基础聚类的几个示例显示在(图 2.16)中。

我们提到了两个术语 - “邻域”和“密度”。为了理解基于密度的聚类,我们将在下一节中学习这些术语。

2.5.1 邻域和密度

想象我们在一个向量空间中表示数据观测。我们有一个点 P。现在我们为这个点 P 定义邻域。表示如下所示:图 2.17。

图 2.17 数据点在向量空间图中的表示。在右侧,我们有一个点 P,绘制的圆是半径 ε。因此,对于 ε > 0,点 P 的邻域由距离点 P 小于等于 ε 的点集定义。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们从上面的图 2.17 中可以看出的那样,对于一个点 P,我们已经为其定义了 ε - 邻域,这些点与 P 等距。在二维空间中,它由一个圆表示,在三维空间中它是一个球体,在 n 维空间中它是以 P 为中心和半径 ε 的 n-球体。这定义了邻域的概念。

现在,让我们来探讨术语密度。回想密度是质量除以体积(质量/体积)。质量越大,密度越高,质量越低,密度越低。反之,体积越小,密度越高,体积越大,密度越低。

在上文的背景下,质量是邻域中的点数。在下面的图 2.18 中,我们可以观察到 ε 对数据点或质量的数量的影响。

图 2.18 对半径 ε 的影响,左侧的点数比右侧多。因此,右侧的质量较低,因为它包含较少的数据点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当涉及到体积时,在二维空间的情况下,体积是 πr²,而对于三维的球体,它是 4/3 πr³。对于 n 维度的球体,我们可以根据维度的数量计算相应的体积,这将是 π 乘以一个数值常数的维度数次方。

所以,在图 2.18 中显示的两种情况下,对于一个点“P”,我们可以得到点(质量)和体积的数量,然后我们可以计算相应的密度。但是这些密度的绝对值对我们来说没有任何意义,而是它们与附近区域的相似性(或不同)如何。它用于对具有相似密度的点进行聚类。换句话说,处于同一邻域并具有相似密度的点可以被归为一个簇。

在理想情况下,我们希望拥有具有最大数量点的高密度簇。在下面图 2.19 中显示的两种情况下,我们有一个左侧显示较少密集簇,右侧显示高密集簇。

图 2.19 密集簇优于较少密集簇。理想情况下,我们希望从聚类中获得具有最大数据点数量的密集簇。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上面的讨论中,我们可以得出结论:

  1. 如果我们增加 ε 的值,我们将得到更大的体积,但不一定会得到更多的点(质量)。这取决于数据点的分布。

  2. 同样,如果我们减小 ε 的值,我们将得到更小的体积,但不一定会得到更少的点(质量)。

这些是我们遵循的基本要点。因此,在选择簇时,选择具有高密度并覆盖最大数量邻近点的簇是至关重要的。

因此,我们已经总结了密度聚类的概念。这些概念是我们接下来讨论的 DBSCAN 聚类的基石!

2.5.2 DBSCAN 聚类

具有噪声的基于密度的空间聚类应用,或者称为 DBSCAN 聚类,是高度推荐的基于密度的算法之一。它对密集人口区域紧密打包的数据观察进行聚类,但不考虑低密度区域的异常值。与 k 均值不同,我们不需要指定簇的数量,该算法能够识别不规则形状的簇,而 k 均值通常提出球形簇。与层次聚类类似,它通过连接数据点工作,但是只有满足密度标准或阈值的观察。更多内容可以在我们下面描述的步骤中了解。

注意:

DBSCAN 是由 Martin Ester, Hans-Peter Kriegal, Jörg Sander 和 Xiaowei Xu 于 1996 年提出的。该算法于 2014 年在 ACM SIGKDD 获得了时间测试奖。可以在[http://citeseerx.ist. psu.edu/viewdoc/summary?doi=10.1.1.71.1980](viewdoc.html)中查阅论文。

DBSCAN 基于我们在上一节讨论的邻域概念。我们现在将深入研究 DBSCAN 的工作方法和构建模块。

DBSCAN 聚类的实质

我们现在将对 DBSCAN 聚类的核心构建模块进行检查。我们知道这是一个基于密度的聚类算法,因此邻域概念在这里适用。

假设我们有一些数据观察结果需要进行聚类。我们还要找到一个数据点“P”。然后,我们可以轻松地定义两个超参数术语:

  1. P 周围邻域的半径,即我们在上一节中讨论的ε

  2. 我们希望在 P 的邻域内至少有 minPts 个点,或者换句话说,需要至少有一定数量的点来创建一个密集区域。这被称为minPts。这是我们可以通过在 minPts 上应用阈值来输入的参数之一。

基于以上概念,我们可以将观察结果分为三大类 - 核心点、边界点或可达点和异常值:

  1. 核心点:如果至少有 minPts 个点与它的ε距离以内(包括 x 本身),则任何数据点“x”都可以被称为核心点,如下面的(图 2.20)所示。它们是我们聚类的构建模块,因此被称为核心点。我们为每个点使用相同的半径值(ε),因此每个邻域的体积保持不变。但是点的数量会有所变化,因此质量会有所变化。因此密度也会发生变化。由于我们使用 minPoints 设置阈值,我们正在对密度进行限制。因此,我们可以得出结论,核心点满足最低密度阈值要求。需要注意的是,我们可以选择不同的ε和 minPts 值来迭代和微调簇。
图 2.20 核心点显示为方形,边界点显示为填充圆,而噪声显示为未填充圆。这三者共同是 DBSCAN 聚类的构建模块

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 边界点或可达点:在簇中不是核心点的点称为边界点,如图 2.20 中的填充圆所示。

如果点“y”距离核心点 x 的距离在ε范围内,则点“y”直接从 x 可达。一个点只能从核心点到达,这是必须遵循的主要条件或规则。只有核心点才能到达非核心点,反之不成立。换句话说,非核心点只能被其他核心点到达,它无法到达其他任何点。在图 2.20 中,边界点表示为黑色圆圈。

为了更好地理解过程,我们必须理解密度可达连接性这个术语。如下图 2.21 所示,我们有两个核心点 X 和 Y。我们可以直接从 X 到 Y。点 Z 不在 X 的邻域内,但是在 Y 的邻域内。所以,我们不能直接从 X 到达 Z。但是我们可以确实从 X 通过 Y 到达 Z,换句话说,使用 Y 的邻域,我们可以从 X 到达 Z。我们不能从 Z 到达 Z,因为 Z 是边界点,并且如前所述,我们不能从边界点出发。

图 2.21 中的 X 和 Y 是核心点,我们可以从 X 到 Y。虽然 Z 不在 X 的直接邻域内,但我们仍然可以通过 Y 从 X 到达 Z。这是密度连接点的核心概念。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 离群值:所有其他点都是离群值。换句话说,如果它不是核心点或不是可达点,则它是离群值,如上图 2.20 中的未填充圆所示。它们不被分配任何簇。

现在我们已经定义了 DBSCAN 的构建模块。我们现在将在下一节中继续介绍 DBSCAN 的流程。

DBSCAN 聚类的步骤

现在我们已经定义了 DBSCAN 的构建模块。我们将现在检查 DBSCAN 中遵循的步骤:

  1. 我们首先为ε和创建簇所需的最小点数(minPts)分配值。

  2. 我们首先选择一个随机点,比如说“P”,该点尚未被分析并分配任何簇。

  3. 然后我们分析 P 的邻域。如果它包含足够数量的点,即高于 minPts,则满足开始一个簇的条件。如果是这样,我们将点 P 标记为核心点。如果一个点不能被识别为核心点,我们将为其分配离群值噪声的标签。我们应该注意到这一点后来可以成为不同簇的一部分。然后我们回到步骤 2。

  4. 一旦找到了这个核心点“P”,我们就开始通过添加所有从 P 直接可达的点来创建这个簇,然后通过添加更多从 P 直接可达的点来增加这个簇的大小。然后我们通过迭代所有这些点来将所有点添加到簇中,这些点可以使用邻域包含。如果我们将一个离群值点添加到簇中,则离群值点的标签将更改为边界点。

  5. 这个过程会一直持续,直到密度聚类完成。然后我们找到一个新的未分配点并重复这个过程。

  6. 一旦所有点都被分配到一个簇或称为异常值,我们就停止我们的聚类过程。

在过程中进行迭代。一旦聚类结束,我们就利用业务逻辑来合并或拆分一些簇。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 小测验 - 回答这些问题来检查你的理解。答案在本书末尾

  1. 将 DBSCAN 聚类的重要性与 kmeans 聚类进行比较和对比。

  2. 非核心点可以到达核心点,反之亦然 - 真或假?

  3. 解释邻域和 minPts 的重要性。

  4. 描述找到“k”的最优值的过程

现在我们清楚了 DBSCAN 聚类的过程。在创建 Python 解决方案之前,我们将检查 DBSCAN 算法的优缺点。

DBSCAN 聚类的优缺点

DBSCAN 具有以下优点:

  • 与 k-means 不同,我们不需要为 DBSCAN 指定簇的数量。

    • 该算法对不干净的数据集是一种相当强大的解决方案。与其他算法不同,它可以有效地处理异常值。

    • 我们也可以确定不规则形状的簇。可以说,这是 DBSCAN 聚类的最大优势。

  • 算法只需要半径和 minPts 的输入。

DBSCAN 面临以下挑战:

  • 使用 DBSCAN 时,聚类的差异有时并不明显。根据处理观察的顺序,一个点可以改变其簇。换句话说,如果边界点 P 可以被多个簇访问,P 可以属于任一簇,这取决于处理数据的顺序。

    • 如果数据集不同区域的密度差异很大,则确定 ε 和 minPts 的最佳组合将变得困难,因此,DBSCAN 将无法生成有效结果。

    • 使用的距离度量在包括 DBSCAN 在内的聚类算法中发挥了非常重要的作用。可以说,最常用的度量是欧几里得距离,但如果维度的数量相当大,则计算将变得很困难。

  • 该算法对 ε 和 minPts 的不同取值非常敏感。有时,找到最优值成为一项挑战。

我们现在将为 DBSCAN 聚类创建一个 Python 解决方案。

DBSCAN 聚类的 Python 解决方案

我们将使用与 k-means 和层次聚类相同的数据集。

第 1-6 步: 加载库和数据集,直到 k-means 算法的第 6 步。

第 7 步: 导入额外的库

from sklearn.cluster import DBSCAN 
from sklearn.preprocessing import StandardScaler 
from sklearn.preprocessing import normalize 
from sklearn.neighbors import NearestNeighbors

第 8 步: 我们正在使用 minDist 和半径的值来拟合模型。

db_default = DBSCAN(eps = 0.0375, min_samples = 6).fit(X_standard) 
labels = db_default.labels_

第 9 步: 不同的簇数为 1。

list(set(labels))

第 10 步: 我们在这里得不到任何聚类的结果。换句话说,由于我们没有提供 minPts 和 ε 的最优值,所以聚类没有任何逻辑结果。

步骤 11: 现在,我们将找出ε的最佳值。为此,我们将计算每个点的最近点距离,然后对结果进行排序和绘制。无论何时弯曲程度最大,它就是ε的最佳值。对于 minPts,通常 minPts ≥ d+1,其中 d 是数据集中的维数。

neigh = NearestNeighbors(n_neighbors=2)
nbrs = neigh.fit(X_standard)
distances, indices = nbrs.kneighbors(X_standard)
distances = np.sort(distances, axis=0)
distances = distances[:,1]
plt.plot(distances)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

建议你阅读链接中的文章,进一步研究如何为 DBSCAN 选择半径的值iopscience.iop.org/article/10.1088/1755-1315/31/1/012012/pdf

步骤 12: 最佳值为 1.5,正如上面观察到的缺陷点所示。我们将使用它,并将 minPts 设置为 5,通常视为标准。

db_default = DBSCAN(eps=1.5, min_samples=5)
db_default.fit(X_standard)
clusters = db_default.labels_

步骤 13: 现在我们可以观察到我们得到了不止一个簇。

list(set(clusters))

步骤 14: 让我们绘制这些簇。

colors = ['blue', 'red', 'orange', 'green', 'purple', 'black', 'brown', 'cyan', 'yellow', 'pink']
vectorizer = np.vectorize(lambda x: colors[x % len(colors)]) 
plt.scatter(X_standard[:,0], X_standard[:,1], c=vectorizer(clusters))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们使用了 DBSCAN 创建了一个解决方案。建议你比较来自所有三种算法的结果。在现实世界的情景中,我们测试使用多种算法的解决方案,用超参数进行迭代,然后选择最佳解决方案。

基于密度的聚类是相当高效且在一定程度上非常有效的解决方案。如果怀疑簇的形状是不规则的,强烈建议使用它。

通过这些内容,我们结束了对 DBSCAN 聚类的讨论。在下一节中,我们将解决一个关于聚类的业务用例。在案例研究中,重点不太在技术概念上,而更多地在商业理解和解决方案生成上。

2.6 使用聚类的案例研究

现在我们将定义一个使用聚类作为解决方案之一的案例研究。案例研究的目标是让你了解实际的商业世界。这种基于案例研究的方法也在与工作相关的面试中使用,在面试阶段会讨论一个案例。因此,强烈建议你了解我们如何在实际的商业场景中实施机器学习解决方案。

一个案例研究通常涉及一个商业问题,可用的数据集,可以使用的各种解决方案,面临的挑战以及最终选择的解决方案。我们还讨论在实际商业中实施解决方案时遇到的问题。

所以,让我们开始使用无监督学习进行聚类的案例研究。在案例研究中,我们关注解决案例研究所采取的步骤,而不是技术算法,因为对于特定问题可能存在多个技术解决方案。

商业背景:我们考虑的行业可能是零售、电信、银行金融保险、航空、医疗保健。基本上,任何涉及客户的业务(几乎所有业务都有客户)。对于任何业务,目标都是为业务产生更多收入,最终增加业务的整体利润。为了增加收入,业务希望拥有越来越多的新客户。业务也希望现有的消费者购买更多,更经常购买。因此,业务始终努力让消费者参与其中,让他们感到满意,并增加他们与自己的交易价值。

为了实现这一目标,业务应该彻底了解消费者群体,了解他们的偏好、口味、价格点、对类别的喜好等。一旦业务详细审查并理解了消费者群体,那么:

  • 产品团队可以根据消费者的需求改进产品特性。

    • 定价团队可以通过将产品价格与客户的首选价格对齐来改进产品价格。价格可以根据客户定制,或者提供忠诚度折扣。

    • 市场营销团队和客户关系团队(CRM)可以通过定制的优惠向消费者推广。

    • 团队可以挽回那些即将流失或停止购买业务的消费者,可以增加他们的消费、增加粘性并增加客户生命周期价值。

  • 总的来说,不同的团队可以根据生成的对消费者的理解来调整其提供的内容。最终消费者会更加幸福,更加投入,更加忠诚于业务,从而使消费者参与更加富有成果。

因此,业务必须深入研究消费者的数据,并生成对基础的理解。客户数据可能看起来像下一节中所示的样子。

用于分析的数据集:我们以服装零售商(H&M、优衣库等)为例。拥有忠诚计划的零售商保存客户的交易明细。各种(不是详尽)数据来源如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以有存储详细信息的商店细节,如商店 ID、商店名称、城市、地区、员工数量等。我们可以有项目层次结构表,其中包含价格、类别等项目的所有详细信息。然后我们可以有客户人口统计详细信息,如年龄、性别、城市和客户与我们过去的销售的交易历史的详细信息。显然,通过联合这些表,我们将能够创建一个将所有详细信息放在一个地方的主表。

注意

建议您培养良好的 SQL 技能。几乎所有与数据相关的领域都需要它——无论是数据科学、数据工程还是数据可视化,SQL 都是无处不在的。

我们在下面展示了一个主表的例子。它不是变量的详尽列表,变量的数量可能比下面的这些要多得多。主表中包括一些原始变量,如收入、发票等,以及衍生变量,如平均交易金额和平均购物篮大小等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还可以以电信运营商为例。在这种情况下,我们将分析的属性包括用户使用情况、通话率、收入、在网络上停留的天数、数据使用等。因此,根据手头的业务领域,数据集可能会发生变化。

一旦我们获取到数据集,通常我们会从中创建衍生属性。例如,平均交易金额属性是总收入除以发票数量。除了已有的原始变量之外,我们会创建这样的属性。

建议的解决方案:对于这个问题可能有多种解决方案,我们以下描述其中的一些:

  1. 我们可以创建一个仪表盘来展示主要的关键绩效指标(KPI)。它将允许我们分析历史数据并根据分析结果采取必要的行动。但这个解决方案更多是报告性质的,包括我们已经熟悉的趋势和 KPI。

  2. 我们可以使用在前几节解决方案中使用的一些技术进行数据分析。这将解决问题的一部分,而且同时考虑多个维度是困难的。

  3. 我们可以创建预测模型来预测客户在未来几个月是否会购物或在接下来的 X 天内流失,但这并不能完全解决问题。要明确,这里的流失指的是客户在接下来的 X 天内不再与零售商购物。在这里,持续时间 X 根据业务领域的不同而有所差异。例如,在电信领域,X 的时间会比保险领域短。这是因为人们每天都在使用手机,而在保险领域,大部分客户可能一年只支付一次保费。因此,与保险业务相比,客户的互动较少。

  4. 我们可以创建客户分割解决方案,根据客户的历史趋势和属性将客户分组。这是我们用来解决这个业务问题的解决方案。

问题的解决方案:回想一下第一章中的图 1.9,我们讨论了机器学习算法中的步骤。一切都始于定义业务问题,然后进行数据发现、预处理等。对于以上案例研究,我们将采用类似的策略。我们已经定义了业务问题;数据发现已经完成,我们已经完成了数据的探索性数据分析和预处理。我们希望使用聚类创建一个分割解决方案。

步骤 1: 我们从确定要提供给聚类算法的数据集开始。我们可能已经创建了一些派生变量,处理了一些缺失值或异常值等。在案例研究中,我们想要知道交易、发票、购买商品的最小/最大/平均值等。我们对性别和年龄分布感兴趣。我们也想知道这些变量之间的相互关系,比如女性客户是否比男性客户更多地使用在线模式。所有这些问题都作为这一步的一部分得到回答。

在 Github 存储库中提交了一个 Python Jupyter 笔记本,提供了探索性数据分析(EDA)和数据预处理的详细步骤和代码。快去看看吧!

步骤 2: 我们使用 k 均值聚类和层次聚类创建第一个解决方案。对于每个算法,通过更改超参数进行迭代。在案例研究中,我们将选择访问次数、总收入、购买的不同类别、在线/离线交易比率、性别、年龄等作为聚类参数。

步骤 3: 选择算法的最终版本以及相应的超参数。根据业务理解进一步分析聚类。

步骤 4: 更常见的情况是,根据观察的大小和它们所包含属性的性质,对聚类进行合并或分割。例如,如果总客户群有 100 万人,要对 100 个人的聚类采取行动将非常困难。同时,要管理 70 万人的聚类同样也很困难。

步骤 5: 然后,我们分析最终得到的聚类。检查变量的聚类分布,理解它们的区别因素,并为聚类赋予逻辑名称。我们可以期待在下面的(图 3-)中看到这样的聚类输出。

在下面示例的聚类中,我们描述了消费模式、对之前活动的反应、生命周期阶段和整体参与度等几个维度。还展示了每个维度的相应子细分。聚类将是这些维度的逻辑组合。实际的维度可能会更多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面显示的细分可以用于多个领域和业务。参数和属性可能会改变,业务背景不同,可用数据的范围可能会有所不同,但总体方法保持相似。

除了上一节中看到的少数应用之外,我们现在正在研究一些用例:

  1. 市场研究利用聚类将消费者分组为市场细分。然后可以更好地分析这些组的偏好。产品摆放可以改进,定价可以更紧密,地理选择将更加科学。

  2. 在生物信息学和医疗行业,聚类可用于将基因分组为不同的类别。基因组可以被划分为不同的组,并且可以通过分析组的属性来进行比较。

  3. 它被用作在创建使用监督学习解决方案的算法之前的有效数据预处理步骤。它还可以通过关注属于一个聚类的数据点来减少数据大小。

  4. 它被用于跨结构化和非结构化数据集的模式检测。我们已经研究了结构化数据集的情况。对于文本数据,它可以用于对类似类型的文档、期刊、新闻等进行分类。我们还可以利用聚类来处理并为图像开发解决方案。我们将在后续章节中研究文本和图像的无监督学习解决方案。

  5. 由于算法基于相似性度量,因此可以用于将传入的数据集分段为欺诈或真实数据,这可以用来减少犯罪活动的数量。

聚类的使用案例相当多。我们只讨论了其中一些突出的案例。它是一种改变工作方法并在数据周围生成大量见解的算法之一。它被广泛应用于电信、零售、银行保险、航空等领域。

与此同时,该算法也存在一些问题。接下来我们将在下一节中讨论我们在聚类中常见的问题。

2.7 聚类中面临的常见挑战

聚类并不是一个完全直截了当、没有任何挑战的解决方案。与世界上任何其他解决方案类似,聚类也面临着自己的一些问题。我们正在讨论我们在聚类中面临的最常见的挑战,它们包括:

  1. 有时,数据的数量非常大且有许多维度可用。在这种情况下,难以管理数据集。计算能力可能是有限的,而且像任何项目一样,时间是有限的。为了解决这个问题,我们可以:

  2. 通过使用监督学习回归方法或决策树算法等方法找到最重要的变量,尝试通过减少维度数量。

  3. 通过使用主成分分析(PCA)或奇异值分解(SVD)等方法来减少维度数量。

  4. 嘈杂的数据集:“垃圾进了,垃圾出”-这个陈词滥调对于聚类也是真实的。如果数据集混乱,会引发很多问题。问题可能包括:

  5. 缺失值,即 NULL、NA、?、空白等。

  6. 数据集中存在异常值。

  7. 数据集中存在类似#€¶§^等垃圾值。

  8. 数据中存在错误的输入。例如,如果将名称输入到收入字段中,那就是一个错误的输入。

我们将在每个章节讨论解决这些问题的步骤和过程。在本章中,我们正在研究 - 如何处理分类变量

  1. 分类变量:回想一下,在讨论中我们讨论过 k-means 无法使用分类变量的问题。我们正在解决这个问题。

要将分类变量转换为数值变量,我们可以使用独热编码。该技术在下图(Figure 2.)中显示的变量 city 有唯一值 LondonNewDelhi。我们可以观察到已创建了两个额外的列,用于填充值为 0 或 1。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是使用独热编码并不能始终保证有效和高效的解决方案。想象一下,如果上述例子中的城市数量是 100,那么数据集中将会有 100 个额外的列,而且其中大部分值都将填充为零。因此,在这种情况下,建议对几个值进行分组。

  1. 距离度量:使用不同的距离度量可能会得到不同的结果。虽然没有“一刀切”,但大多数情况下,欧几里德距离被用于测量距离。

  2. 对聚类的解释是非常主观的。通过使用不同的属性,可以对相同的数据集进行完全不同的聚类。正如前面讨论的那样,重点应该放在解决手头的业务问题上。这是选择超参数和最终算法的关键。

  3. 耗时:由于同时处理了许多维度,有时算法的收敛需要很长时间。

但是尽管面临所有这些挑战,聚类仍然是一种广泛认可和使用的技术。我们在最后一节中讨论了聚类在现实世界中的应用案例。

这标志着本章关于聚类的讨论结束。让我们用一些总结思考来结束本章。

2.8 总结思考

无监督学习不是一项易事。但它肯定是一项非常有吸引力的工作。它不需要任何目标变量,解决方案自身识别模式,这是无监督学习算法最大的优点之一。并且这些实现已经在商业世界产生了巨大的影响。在本章中,我们研究了一类称为聚类的解决方案。

聚类是一种无监督学习解决方案,用于模式识别、探索性分析和数据点的分割。组织机构广泛使用聚类算法,并继续深入了解消费者数据。可以提供更好的价格、提供更相关的优惠、提高消费者参与度,并改善整体客户体验。毕竟,满意的消费者是任何企业的目标。不仅可以对结构化数据使用聚类,还可以对文本数据、图像、视频和音频使用聚类。由于其能够使用大量维度在多个数据集中找到模式,聚类是想要一起分析多个维度时的解决方案。

在本书的第二章中,我们介绍了基于无监督的聚类方法的概念。我们研究了不同类型的聚类算法——k 均值聚类、层次聚类和 DBSCAN 聚类,以及它们的数学概念、各自的用例以及优缺点,重点放在为相同数据集创建实际 Python 代码上。

在接下来的章节中,我们将研究像 PCA 和 SVD 这样的降维技术。将对技术的构建模块、它们的数学基础、优点和缺点、用例以及实际的 Python 实现进行讨论。

现在您可以进入问题部分了!

实用的下一步和建议阅读材料
  1. 从链接获取在线零售数据(www.kaggle.com/hellbuoy/online-retail-customer-clustering)。这个数据集包含了一个总部位于英国的零售商在 2010 年 12 月 1 日至 2011 年 12 月 9 日期间发生的所有在线交易。应用本章描述的三种算法,确定公司应该针对哪些客户以及为什么。

  2. 从链接获取 IRIS 数据集(www.kaggle.com/uciml/iris)。它包括三种鸢尾花品种,每种 50 个样本,具有一些花的特性。使用 kmeans 和 DBSCAN 并比较结果。

  3. 探索 UCI 的聚类数据集(archive.ics.uci.edu/ml/index.php

  4. 研究关于 kmeans 聚类、层次聚类和 DBSCAN 聚类的以下论文

a) Kmeans 算法:

i. www.ee.columbia.edu/~dpwe/papers/PhamDN05-kmeans.pdf

ii. www.researchgate.net/publication/271616608_A_Clustering_Method_Based_on_K-Means_Algorithm

iii. ieeexplore.ieee.org/document/1017616

b) 层次聚类

i. ieeexplore.ieee.org/document/7100308

ii. papers.nips.cc/paper/7200-hierarchical-clustering-beyond-the-worst-case.pdf

iii. papers.nips.cc/paper/8964-foundations-of-comparison-based-hierarchical-clustering.pdf

c) DBSCAN 聚类

i. arxiv.org/pdf/1810.13105.pdf

ii. citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.121.9220

2.9 摘要

  • 我们讨论了一种称为聚类的无监督学习技术。通过聚类,我们找出数据集中的潜在模式,并找出数据中的自然分组。

    • 我们了解到,聚类在各行业中都被用于各种目的,包括零售、电信、金融、制药等。聚类解决方案被用于客户分割和营销分割,以更好地理解客户群体,从而进一步提高对客户的定位。

    • 我们学习并理解了基于方法论的多种聚类技术。一些示例包括 k 均值聚类、层次聚类、DBSCAN、模糊聚类等。

    • 我们详细介绍了 K 均值聚类、层次聚类和 DBSCAN 聚类算法。

    • 我们学习了 k 均值(kmeans)是基于聚类的质心,而层次聚类是一种凝聚式聚类技术。DBSCAN 是一种基于密度的聚类算法。

    • 我们还详细讨论了这些聚类算法的优缺点。例如,对于 k 均值,我们必须指定聚类的数量,层次聚类非常耗时,而 DBSCAN 的输出取决于观测数据处理的顺序。

  • 我们介绍了用于测量聚类技术准确性的方法,包括 WCSS(组内平方和)、轮廓系数和 Dunn 指数。

    我们为每种技术实现了基于 Python 的解决方案。主要使用的库是 sklearn。

  • 在本章末尾,我们提供了实际案例研究来补充学习。

第三章:降维

本章内容包括

  • 维数灾难及其缺点

  • 不同的降维方法

  • 主成分分析(PCA)

  • 奇异值分解(SVD)

  • PCA 和 SVD 的 Python 解决方案

  • 降维的案例研究

“知识是事实的累积过程;智慧则在于它们的简化。”– 马丁·H·菲舍尔

我们在生活中面临复杂的情况。生活给我们提供了多种选择,我们从中选择一些可行的选项。这种筛选的决定基于每个选项的重要性、可行性、效用和预期利润。符合条件的选项随后被选中。一个完美的例子就是选择度假目的地。基于天气、旅行时间、安全、食物、预算等多种选项,我们选择了一些地方作为下一个假期的目的地。在本章中,我们正在学习同样的东西–如何在数据科学和机器学习世界中减少选项的数量。

在上一章中,我们涵盖了主要的聚类算法。我们还在那里进行了一个案例研究。在这些真实案例的数据集中,有很多变量。有时,数据中可能有超过 100 个变量或维度。但并非所有变量都重要;并非所有变量都显著。数据集中有很多维度被称为“维数灾难”。为了进行进一步的分析,我们从所有维度或变量中选择了一些。在这一章中,我们将学习降维的必要性,各种降维技术,以及各自的优缺点。我们将深入研究主成分分析(PCA)和 SVD(奇异值分解)的概念,它们的数学基础,并用 Python 实现。延续上一章的结构,我们将在最后探讨电信行业的一个真实案例研究。在后面的章节中,我们还将探索其他高级的降维技术,比如 t-SNE 和 LDA。

聚类和降维是无监督学习的主要类别。上一章我们学习了主要的聚类方法,而本章将涵盖降维。有了这两种解决方案,我们将在无监督学习领域取得很大的进展。但是还有更多的高级话题需要涵盖,这些是本书后面章节的内容。

让我们先了解一下“维数灾难”是什么意思。

3.1 技术工具包

我们将使用与上一章相同的 Python 3.6+版本。Jupyter Notebook 在本章中也将被使用。

所有数据集和代码文件都位于 GitHub 存储库中(github.com/vverdhan/UnsupervisedLearningWithPython/tree/main/Chapter3)。您需要安装以下 Python 库才能执行numpypandasmatplotlibscipysklearn等。由于您在上一章中已经使用了相同的软件包,所以无需再安装它们。CPU 足以执行,但如果遇到一些计算问题,请切换到 GPU 或 Google Colab。如果在安装这些包中遇到任何问题,请参考本书的附录。

现在,让我们开始在以下部分进一步了解“维数灾难”。

3.2 维数灾难

继续使用我们先前介绍的度假目的地示例。目的地的选择取决于许多参数 - 安全性、可用性、餐食、夜生活、天气、预算、健康等等。有太多的参数需要决定,这是一个令人困惑的想法。我们通过一个现实生活的例子来理解。

想象一下:一家零售商想要在市场上推出一款新的鞋类产品。为此,需要选择一个目标客户群体,这个客户群体将通过电子邮件、通讯等方式进行接触。业务目标是引诱这些客户购买新发布的鞋类产品。从整个客户群体中,可以基于诸如客户年龄、性别、消费能力、首选类别、平均开销、购物频率等变量选择目标客户群体。这么多变量或维度使我们在基于有效的数据分析技术进行客户筛选时受到困扰,需要同时分析过多参数,检验每个参数对客户购物概率的影响,因此这个任务变得非常繁琐和困惑。这是真实世界的数据科学项目中我们所面临的维数灾难问题。我们还可以在另一种情况下遇到维度灾难现象,即当观察值的数量小于变量的数量时。考虑一个数据集,其中观察值的数量为 X,而变量的数量超过了 X,这种情况下我们就面临维度灾难。

通过可视化是理解任何数据集的简单方法。让我们在一个向量空间图中可视化一个数据集。如果数据集中只有一个属性或特征,我们可以用一个维度表示它。如图 3.1(i)所示。例如,我们可能希望只用一个维度来捕捉一个物体的高度。如果我们有两个属性,我们需要两个维度,如图 3.1(ii)所示,在这种情况下,为了得到一个物体的面积,我们将需要长度和宽度。如果我们有三个属性,例如,为了计算需要长度、宽度和高度的体积,它需要一个三维空间,如图 3.1(iii)所示。这个需求将根据属性的数量而继续增长。

图 3.1 (i) 只需要一个维度来表示数据点,例如,表示物体的高度 (ii) 我们需要两个维度来表示一个数据点。每个数据点可以对应一个物体的长度和宽度,用于计算面积 (iii) 三个维度用于展示一个点。这里,需要长度、宽度和高度来获得物体的体积。这个过程根据数据中存在的维度数量而继续。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在想象一下,如果我们总共有 20 个要分析的数据点。如果我们只有一个属性,我们可以将它表示为 x[1]、x[2]、x[3]、x[4]、x[5] …. x[20],因此,20 维空间足以表示这些点。在第二个例子中,我们需要两个维度,我们将需要(x[1,]y[1])、(x[2,]y[2])、(x[3,]y[3])、(x[4,]y[4])、(x[5,]y[5])…… (x[20,]y[20]),换句话说是 2020 = 400 维空间。对于三维空间,我们将表示一个点为(x[1,]y[1,]z[1])、(x[2,]y[2,]z[2])、(x[3,]y[3,]z[3])、(x[4,]y[4,]z[4])、(x[5,]y[5,]z[5])…… (x[20,]y[20,]z[20]),我们将需要 2020*20 = 800 维空间。这个过程将继续下去。

因此,我们很容易得出结论,随着维度数量的增加,所需的空间量会大幅增加。这被称为维度灾难。这个术语是由理查德·E·贝尔曼引入的,用来指代数据集中有太多变量的问题——其中一些是重要的,而很多可能不太重要。

还有另一个众所周知的理论,即休斯现象如图 3.2 所示。一般来说,在数据科学和机器学习中,我们希望有尽可能多的变量来训练我们的模型。观察到,监督学习分类器算法的性能会增加到一定的极限,随着最适数量的变量达到顶峰。但是,使用相同数量的训练数据,并增加维度数量,监督分类算法的性能会下降。换句话说,如果变量对解决方案的准确性没有贡献,最好不要将其包含在数据集中,并应将这些变量从数据集中删除。

图 3.2 Hughes 现象显示,随着维度数量的增加,机器学习模型的性能会在初期得到提升。但是随着进一步增加,模型的性能会下降。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

维度数量的增加对机器学习模型的影响如下:

  • 由于模型处理了更多的变量,数学复杂度也会增加。例如,在上一章讨论的 k 均值聚类方法中,当变量数量更多时,各个点之间的距离计算将变得更加复杂。因此,整体模型会更加复杂。

    • 在较大维度空间生成的数据集相对于较少变量来说可能更加稀疏。数据集将变得更稀疏,因为有些变量将会有缺失值、NULL 等。因此,空间更为空,数据集更加稀疏,少数变量与之相关联的值更少。

    • 随着模型复杂度的增加,所需的处理时间也会增加。系统在处理如此多维度的情况下将感到压力。

  • 整体解决方案变得更加复杂和难以理解和执行。回顾第一章中我们讨论过的监督学习算法。由于维度数量较高,我们可能会在监督学习模型中面临过拟合问题。

当监督学习模型在训练数据上有很好的准确度,但在未知数据上准确度较低时,这就被称为过拟合。过拟合是一个麻烦,因为机器学习模型的目的是在未知数据上表现良好,而过拟合则违背了这一目的。

让我们将事物与一个现实世界的例子联系起来。考虑一个保险公司提供不同类型的保险政策,如人寿保险、车辆保险、健康保险、家庭保险等。该公司希望利用数据科学并执行聚类用例来增加客户群和销售的总保单数量。他们拥有客户的详细信息,如年龄、性别、职业、保单金额、历史交易、持有的保单数量、年收入、保单类型、历史违约次数等。同时,让我们假设还捕捉到是否客户是左撇子还是右撇子、穿黑鞋还是棕鞋、使用的洗发水品牌、头发颜色和最喜欢的餐厅等变量。如果我们将所有变量包括在数据集中,那么结果数据集中的变量总数将会相当高。对于 k-means 聚类算法,距离计算将变得更加复杂,处理时间将增加,整体解决方案将变得相当复杂。

还有一点必须注意,并非所有的维度或变量都是重要的。因此,从我们拥有的所有变量中筛选出重要的变量至关重要。记住,自然总是倾向于简单的解决方案!在上述讨论的情况下,像头发颜色和最喜欢的餐厅等变量很可能不会影响结果。因此,我们最好减少维度以简化复杂性并减少计算时间。同时,还必须注意,降维并不总是需要的。它取决于数据集的类型和我们希望解决的业务问题。在本章后续部分的案例研究中,我们将进一步探讨这个问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 小测验 - 回答这些问题来检查你的理解。答案在书的最后。

  1. 维度灾难指的是数据规模很大。TRUE 或 FALSE。

  2. 在数据集中拥有大量变量将始终提高解决方案的准确性。TRUE 或 FALSE。

  3. 数据集中有大量变量会如何影响模型?

我们已经确定,拥有许多维度对我们来说是一个挑战。我们现在正在研究各种减少维度的方法。

3.3 维度减少方法

在上一节中,我们研究了拥有非常高维数据的缺点。维度较少可能会导致数据结构更简单,这将提高计算效率。同时,我们应该小心减少变量的数量。降维方法的输出应该足够完整以代表原始数据,不应导致任何信息损失。换句话说,如果原本我们有 500 个变量,我们将它降低到 120 个显著变量,那么这 120 个变量应该足够强大,能几乎捕捉到所有信息。让我们通过一个简单的例子来理解。

想象一下:我们希望预测下个月一个城市会接收到多少降雨量。该城市的降雨预测可能取决于一段时间内的温度、风速测量、压力、距离海洋的距离、海拔等。如果我们想要预测降雨,这些变量是有意义的。同时,例如城市中电影院的数量、城市是否是国家的首都或城市中红色汽车的数量可能不会影响降雨的预测。在这种情况下,如果我们不使用城市中电影院的数量来预测降雨量,那么它将不会降低系统的性能。解决方案很有可能仍然能够表现良好。因此,在这种情况下,通过放弃这样的变量不会丢失任何信息,当然,我们可以将其从数据集中删除。另一方面,移除温度或距离海洋的变量很可能会对预测产生负面影响。这是一个非常简单的例子,用于强调减少变量数量的必要性。

维度或变量数量可以通过手动和基于算法的方法的组合来减少。但在详细研究它们之前,我们应该了解一些数学术语和组件,然后再继续,下面我们将对此进行讨论。

3.3.1 数学基础

有很多数学术语是必须掌握的,以便全面了解降维方法。

我们正在尝试减少数据集的维度。数据集只是一个值矩阵——因此很多概念与矩阵操作方法、它们的几何表示以及对这些矩阵进行变换有关。数学概念在本书的附录数学基础中进行了讨论。您还需要理解特征值和特征向量。这些概念将在整本书中被重复使用,因此它们已经放在附录中供快速查阅。在继续之前,建议您先阅读这些内容。现在我们将探讨一些手动的降维方法,然后再转向基于算法的方法。

3.4 手动降维方法

为了解决维度灾难,我们希望减少数据集中的变量数量。可以通过从数据集中移除变量来实现减少。或者,一个非常简单的解决方案是合并那些可以逻辑分组或用共同的数学运算表示的变量。

例如,如下表 3.1 所示,数据可以来自零售商店,不同的客户产生了不同的交易。我们将获得每个客户一段时间内的销售额、发票数和购买的商品数量。在下表中,客户 1 产生了两张发票,总共购买了 5 件商品,并产生了 100 的销售额。

如果我们希望减少变量的数量,我们可以将三个变量合并为两个变量。在这里,我们引入了变量 ATV(平均交易价值)和 ABS(平均篮子大小),其中 ATV = 销售额/发票数,ABS = 商品数量/发票数。

因此,在第二个表中,对于客户 1,我们有 ATV 为 50,ABS 为 2.5。因此,变量的数量已经从三个减少到两个。该过程只是一个示例,展示了如何可以结合各种变量。这并不意味着我们应该用 ATV 替换销售额作为一个变量。

表 3.1 在第一张表中,我们有销售额、发票和商品数量作为变量。在第二个表中,它们被合并为创建新变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个过程可以继续减少变量的数量。同样地,对于一个电信用户,我们将拥有一个月内手机通话的分钟数。我们可以将它们相加,创建一个单一的变量 - 一个月内使用的分钟数。上面的例子是非常基础的,用于起步。使用手动过程,我们可以采用另外两种常用的方法 - 手动选择和使用相关系数。

3.4.1 手动特征选择

继续上一节中讨论的降雨预测示例 - 数据科学家可能能够去掉一些变量。这将基于对手头的业务问题和相应数据集的深刻理解。然而,这是一个潜在的假设,即数据科学家能够充分理解数据集,并对业务领域有深刻理解。大部分时间,业务利益相关者将能够指导这样的方法。同样重要的是,变量是独特的,并且不存在太多的依赖性。

如下表 3.2 所示,我们可以删除一些对于预测降雨可能没有用的变量。

表 3.2 在第一个表中,我们有数据集中所有的变量。使用业务逻辑,一些可能没有太多用处的变量在第二个表中被丢弃了。但这需要谨慎处理。最好的方法是从业务利益相关者那里得到指导。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有时,特征选择方法也被称为包装器方法。在这里,机器学习模型使用变量的子集进行包装或拟合。在每次迭代中,我们将得到不同的结果集。选择生成最佳结果的集合用于最终模型。

接下来的方法是基于各种属性之间的相关性而存在的。

3.4.2 相关系数

两个变量之间的相关性简单地意味着它们彼此具有相互关系。一个变量值的变化将影响另一个变量的值,这意味着一个变量的数值相似的数据点也在另一个变量中具有相似的数值。高度相关的变量彼此提供类似的信息,因此其中一个可以被舍弃。

相关性在书的附录数学基础中有详细描述。

例如,对于零售店,一天内产生的发票数量与产生的销售额将高度相关,因此可以舍弃其中之一。另一个例子是 - 学习时间更长的学生通常比学习时间较短的学生成绩更好(大多数情况下!)。

但在放弃变量时我们应该小心,不应仅仅依赖相关性。在做出任何决定之前,应该充分了解变量的业务背景。

在从研究中删除任何变量之前,与业务利益相关者讨论是个好主意。

基于相关性的方法有时被称为过滤方法。使用相关系数,我们可以过滤并选择最重要的变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 自测题 – 回答这些问题以检查你的理解。答案在书的末尾

  1. 如果我们觉得一个变量不需要,我们可以简单地将其舍弃。是或否。

  2. 如果两个变量相关,总是舍弃其中一个。是或否。

手动方法是更简单的解决方案,可以相当高效地执行。数据集的大小被减小,我们可以继续进行分析。但是手动方法有时是主观的,并且在很大程度上取决于手头的业务问题。许多时候,不可能使用手动方法进行降维。在这种情况下,我们有基于算法的方法,我们将在下一节中学习。

3.4.3 基于算法的降维方法

在上一节中,我们讨论了手动方法。从那里继续,我们将在本节中研究基于算法的方法。基于算法的技术是基于更数学的基础的,因此证明是更科学的方法。在现实世界的业务问题中,我们使用手动和基于算法的技术的组合。与基于算法的技术相比,手动方法执行起来更直接。此外,我们无法评论两种技术的比较,因为它们基于不同的基础。但与此同时,你必须在实施基于算法的技术时尽职尽责。

降维中使用的主要技术如下所示。我们将在本书中探讨其中大部分。

  1. 主成分分析(PCA)

  2. 奇异值分解(SVD)

  3. 线性判别分析(LDA)

  4. 广义判别分析(GDA)

  5. 非负矩阵分解(NMF)

  6. 多维缩放(MDS)

  7. 局部线性嵌入(LLE)

  8. 等距映射

  9. 自编码器

  10. t-SNE(T 分布随机邻域嵌入)

这些技术被用于一个共同的最终目标 - 将数据从高维空间转换为低维空间。一些数据转换是线性的,而一些是非线性的。

我们将在本章详细讨论主成分分析(PCA)和奇异值分解(SVD)。在本书的后续章节中,将探讨其他主要技术。也许,PCA 是我们在下一节中探讨的最常引用的降维方法。

3.5 主成分分析(PCA)

想象一下:你正在处理一个有 250 个变量的数据集。几乎不可能可视化这样一个高维空间。这 250 个变量中的一些可能彼此相关,一些可能不相关,并且有必要减少变量的数量而不丢失太多信息。主成分分析或 PCA 允许我们在数学上选择最重要的特征并留下其他特征。PCA 确实减少了维数,但也保留了变量之间最重要的关系和数据集中的重要结构。因此,变量的数量减少了,但数据集中的重要信息得到了保留。

主成分分析(PCA)是将高维数据投影到低维空间的过程。简单来说,我们将一个 n 维空间降维到一个 m 维空间(其中 n > m),同时保持原始数据集的本质和基本特征。在这个过程中,旧的变量被降维为新的变量,同时保持了原始数据集的关键信息,新创建的变量称为主成分。主成分是原始变量的线性组合。由于这种转换,第一个主成分捕获了数据集中的最大随机性或最高方差。创建的第二个主成分与第一个主成分正交。

如果两条直线彼此正交,意味着它们相互成90⁰的角度,

这个过程一直持续到第三个成分等等。正交性使我们能够保持后续主成分之间没有相关性。

PCA 利用数据集的线性变换,这样的方法有时被称为特征投影。结果数据集或投影用于进一步的分析。

让我们通过一个例子更好地理解。在下面(表 3.3)所示的例子中,我们用一些变量来表示一个家庭的总感知价值。这些变量包括面积(平方米)、卧室数、阳台数、距离机场的距离、距离火车站的距离等等——我们有 100 多个变量。

表 3.3 房价估算的基于的变量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以数学上和逻辑上结合一些变量。PCA 将创建一个新变量,它是一些变量的线性组合,如下面的示例所示。它将得到原始变量的最佳线性组合,以便新变量能够捕获数据集的最大方差。方程式 3.1 仅是为了说明目的而显示的一个示例,在这个示例中我们展示了一个新变量,它是其他变量的组合。

(方程式 3.1)

new_variable = a面积 – b卧室数 + c距离 – d学校数

现在让我们通过视觉概念来理解这个概念。在矢量空间图中,我们可以如下图 3.3 所示地表示数据集。第一张图代表了原始数据,我们可以在 x-y 图表中可视化变量。如上所述,我们希望创建变量的线性组合。换句话说,我们希望创建一个数学方程,能够解释 x 和 y 之间的关系。

这种过程的输出将是一条直线,如图 3.3 中的第二张图所示。这条直线有时被称为最佳拟合线。利用这条最佳拟合线,我们可以预测给定 x 值的 y 值。这些预测实际上就是数据点在直线上的投影。

如下图 3.3 中的第三个图所示,实际值与投影之间的差异是误差。这些误差的总和被称为总投影误差。

图 3.3 (i) 数据集可以在向量空间图中表示 (ii) 直线可以称为最佳拟合线,其具有所有数据点的投影 (iii) 实际值与投影之间的差异是误差项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如下图 3.4 所示,这条直线可以有多种选项。这些不同的直线将具有不同的误差和捕捉到的方差值。

图 3.4 数据集可以用多条直线来捕捉,但并非所有直线都能捕捉到最大的方差。给出最小误差的方程将被选定。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

能够捕捉最大方差的直线将被选定。换句话说,它给出了最小的误差。它将是第一个主成分,最大扩展方向将是主轴

第二主成分将以类似的方式导出。由于我们知道第一个主轴,我们可以从总方差中减去沿着该主轴的方差以获得残差方差。换句话说,使用第一个主成分,我们将在数据集中捕捉一些方差。但数据集中仍有部分总方差尚未由第一个主成分解释。未解释的总方差部分是残差方差。使用第二主成分,我们希望尽可能多地捕捉方差。

使用相同的过程来捕捉最大方差的方向,我们将得到第二个主成分。第二主成分可以与第一个主成分呈多个角度,如图 3.5 所示。数学上已经证明,如果第二主成分与第一个主成分正交,那么我们可以使用两个主成分来捕捉最大方差。在图 3.5 中,我们可以观察到两个主成分彼此之间呈 90⁰ 角。

图 3.5 (i) 左侧的第一个图是第一个主成分。 (ii) 第二主成分可以相对于第一个主成分处于不同角度。我们必须找到第二主成分,它允许捕捉最大方差 (iii) 为了捕捉最大方差,第二主成分应与第一个主成分正交,因此组合方差被最大化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第三、第四个主成分等依此类推。随着主成分的增多,向量空间中的表示变得难以可视化。你可以将其想象成一个带有多个轴的向量空间图。一旦所有主成分都被导出,数据集就会投影到这些轴上。这个转换后的数据集中的列是主成分。创建的主成分数量会少于原始变量的数量,并且捕获数据集中存在的最大信息。

在我们深入研究 PCA 过程之前,让我们先了解其重要特性:

  • PCA 的目标是减少结果数据集中的维数。

    • PCA 生成的主成分旨在通过最大化特征方差来减少数据集中的噪声。

    • 同时,主成分减少了数据集中的冗余。这是通过最小化特征对之间的协方差实现的。

    • 原始变量不再存在于新创建的数据集中。相反,使用这些变量创建新变量。

    • 主成分不一定会与数据集中的所有变量一一对应。它们是现有变量的新组合。因此,它们可以是一个主成分中多个不同变量的组合(如方程式 3.1 所示)。

    • 从数据集创建的新特征不共享相同的列名。

    • 原始变量可能彼此相关,但新创建的变量彼此不相关。

    • 新创建的变量数量少于原始变量的数量。我们选择主成分数量的过程已在 Python 实现部分进行了描述。毕竟,降维的整个目的就在于此。

    • 如果 PCA 用于减少训练数据集中的变量数量,则必须使用 PCA 减少测试/验证数据集。

  • PCA 不等同于降维。它可以用于许多其他用途。一般来说,仅仅将 PCA 用于降维是错误的。

我们现在将研究在实现 PCA 时采用的方法,然后我们将使用 PCA 开发一个 Python 解决方案。虽然我们在开发代码时不需要应用所有步骤,因为这些重活已经由包和库完成。下面给出的步骤已由这些包处理,但仍然必须理解这些步骤,以正确理解 PCA 的工作原理。

PCA 所遵循的步骤是:

  1. 在 PCA 中,我们首先对数据集进行标准化。 这确保我们所有的变量都具有共同的表示并且可比较。 我们有方法在 Python 中执行标准化,我们将在开发代码时学习。 要更多了解数据集的标准化,请参考附录数学基础。

  2. 在标准化数据集中获取协方差。 这使我们能够研究变量之间的关系。 我们通常创建如下所示的协方差矩阵,如下一节的 Python 示例所示。

  3. 然后我们可以计算协方差矩阵的特征向量和特征值。

  4. 然后,我们按照特征值的降序对特征值进行排序。 选择与最大特征值对应的特征向量。 因此所选的组件将能够捕获数据集中的最大方差。 还有其他方法来列出主要组件,我们将在开发 Python 代码时进行探讨。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 快速测验 - 回答这些问题以检查您的理解。 书的末尾有答案

  1. PCA 将导致数据集中变量的数量相同。 真还是假。

  2. PCA 将能够在数据集中捕获 100%的信息。 真还是假。

  3. 选择 PCA 中主要组件的逻辑是什么?

因此,从本质上讲,主成分是原始变量的线性组合。 这种线性组合中的权重是满足最小二乘法误差标准的特征向量。 我们现在正在研究特征值分解,而奇异值分解将在下一节(3.6)中介绍。

3.5.1 特征值分解

我们在上一节中学习了 PCA,我们说主要组件是原始变量的线性组合。 现在我们将探讨 PCA 的特征值分解。

在 PCA 的上下文中,特征向量将表示矢量的方向,特征值将是沿着该特征向量捕获的方差。 下面的图 3.6 可以说明,我们正在将原始的 nxn 矩阵分解为组件。

图 3.6 使用特征值分解,原始矩阵可以分解为特征向量矩阵,特征值矩阵和特征向量矩阵的逆。 我们使用这种方法实现 PCA。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从数学上讲,我们可以通过方程式 3.2 来表示关系。

(方程式 3.2)

Av = λv

其中 A 是方阵,v 是特征向量,λ是特征值。 在这里,重要的是要注意特征向量矩阵是正交矩阵,其列是特征向量。 特征值矩阵是对角线矩阵,其特征值是对角线元素。 最后一个组件是特征向量矩阵的逆。 一旦我们有了特征值和特征向量,我们就可以选择显著的特征向量来获取主成分。

我们在本书中将 PCA 和 SVD 作为两种单独的方法进行介绍。这两种方法都用于将高维数据降维到较少的维度,并在此过程中保留数据集中的最大信息量。两者的区别在于 - SVD 存在于任何类型的矩阵(矩形或方形),而特征值分解仅适用于方形矩阵。等我们在本章后面介绍 SVD 时,你会更好地理解它。

我们现在将使用特征值分解创建一个 Python 解决方案。

3.5.2 使用 PCA 的 Python 解决方案

我们已经学习了 PCA 的概念和使用特征值分解的过程。现在是时候进入 Python 并在数据集上开发一个 PCA 解决方案了。我们将向你展示如何在数据集上创建特征向量和特征值。为了实现 PCA 算法,我们将使用sklearn库。库和包提供了一种更快的实现算法的解决方案。

我们将使用鸢尾花数据集来解决这个问题。这是用于机器学习问题的最受欢迎的数据集之一。该数据集包含三种鸢尾花的数据,每种鸢尾花有 50 个样本,并且具有每朵花的特性 - 如花瓣长度,萼片长度等。问题的目标是使用花的特性来预测物种。因此,独立变量是花的特性,而变量“物种”是目标变量。数据集和代码已经提交到 GitHub 仓库。在这里,我们使用内置的 PCA 函数来减少实现 PCA 所需的工作量。

步骤 1: 首先加载所有必要的库。我们将使用 numpy、pandas、seaborn、matplotlib 和 sklearn。请注意,我们从 sklearn 中导入 PCA。

这些是最标准的库。你会发现几乎所有的机器学习解决方案都会在解决方案笔记本中导入这些库。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

步骤 2: 现在加载数据集。它是一个.csv 文件。

iris_df = pd.read_csv('IRIS.csv')

步骤 3: 现在我们将对数据集进行基本检查 - 查看前五行,数据的形状,变量的分布等。我们在这里不进行详尽的探索性数据分析,因为这些步骤在第二章中已经覆盖了。数据集有 150 行和 6 列。

iris_df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

iris_df.describe()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

iris_df.shape

步骤 4: 这里我们需要将数据集分成自变量和因变量。X_variables 代表自变量,它们位于数据集的前 4 列,而 y_variable 是因变量,在这种情况下是物种,是数据集中的最后一列。回想一下,我们希望使用其他属性来预测花的物种。因此,我们将目标变量物种和其他自变量分开。

X_variables = iris_df.iloc[:,1:5]
X_variables
y_variable = iris_df.iloc[:,5]

步骤 5: 现在我们正在对数据集进行标准化。StandardScalar() 内置方法可以很容易地完成这项工作。

StandardScalar 方法为我们对数据集进行了归一化处理。它从变量中减去均值,然后除以标准差。有关归一化的更多细节,请参阅附录数学基础知识。

我们调用该方法,然后在我们的数据集上使用它来获得转换后的数据集。由于我们正在处理自变量,所以这里使用了 X_variables。首先我们调用了 StandardScalar()方法。然后使用 fit_transform 方法。fit_transform 方法首先将转换器拟合到 X 和 Y,然后返回 X 的转换版本。

sc = StandardScaler()
transformed_df = sc.fit_transform(X_variables)

第 6 步: 现在我们将计算协方差矩阵,并将其打印出来,输出如下所示。使用 numpy 很容易得到协方差矩阵。

covariance_matrix = np.cov(transformed_df.T)
covariance_matrix

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 7 步: 现在,在这一步中正在计算特征值。在 numpy 库中,我们有内置功能来计算特征值。然后我们按降序对特征值进行排序。为了筛选主成分,我们可以选择大于 1 的特征值。这个标准被称为Kaiser 准则。我们也在探索其他方法。

特征值代表一个成分作为数据摘要的优劣程度。如果特征值为 1,意味着该成分包含与单个变量相同数量的信息。因此我们选择大于 1 的特征值。

在此代码中,我们首先获得eigen_valueseigen_vectors。然后按降序排列它们。

eigen_values, eigen_vectors = np.linalg.eig(covariance_matrix)
eigen_pairs = [(np.abs(eigen_values[i]), eigen_vectors[:,i]) for i in range(len(eigen_values))]
print('Eigenvalues arranged in descending order:')
for i in eigen_pairs:
    print(i[0])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 8 步: 现在,我们将从sklearn库中调用 PCA 方法。该方法用于在这里拟合数据。需要注意的是,我们尚未确定在这个问题中希望使用多少个主成分。

pca = PCA()
pca = pca.fit(transformed_df)

第 9 步: 主成分现在已经被确定。让我们来看看它们解释的方差。我们可以观察到第一个成分解释了 72.77%的变化,第二个解释了 23.03%的变化,依此类推。

explained_variance = pca.explained_variance_ratio_
explained_variance

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 10 步: 现在我们正在绘制一个条形图来展现这些成分以获得更好的可视化效果。

dataframe = pd.DataFrame({'var':pca.explained_variance_ratio_,
             'PC':['PC1','PC2','PC3','PC4']})
sns.barplot(x='PC',y="var", 
           data=dataframe, color="b");

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 11 步: 我们绘制一个屏风图来可视化主成分解释的累积方差。

plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 12 步: 在这个案例研究中,如果我们选择前两个主成分作为最终解决方案,因为这两个成分捕获了数据集中 95.08%的总方差。

pca_2 = PCA(n_components =2 )
pca_2 = pca_2.fit(transformed_df)
pca_2d = pca_2.transform(X_variables)

第 13 步: 现在,我们将根据两个主成分来绘制数据集。对于此操作,有一个要求,即物种必须被映射回物种变量的实际值,即山鸢尾、变色鸢尾和维吉尼亚鸢尾。在这里,0 对应山鸢尾,1 对应变色鸢尾,2 对应维吉尼亚鸢尾。在下面的代码中,首先使用上述映射替换了物种变量的值。

iris_df['Species'] = iris_df['Species'].replace({'Iris-setosa':0, 'Iris-versicolor':1, 'Iris-virginica':2})

第 14 步: 现在我们将对两个主成分绘制结果。这个图表显示了刚刚创建的数据集被减少到两个主成分。这些主成分能够捕捉 95.08%的数据集方差。图中,第一主成分代表图表的 x 轴,而第二主成分代表图表的 y 轴。颜色代表了不同类别的物种。

plt.figure(figsize=(8,6))
plt.scatter(pca_2d[:,0], pca_2d[:,1],c=iris_df['Species'])
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上解决方案将成分数量从四减少到 2,并且仍能保留大部分信息。在这里,我们已经检查了三种选择主成分的方法 - 基于凯撒标准、捕获的方差以及剪切图。

让我们快速分析一下使用 PCA 我们所取得的成果。图 3.7 展示了同一数据集的两种表示形式。左边是 X 变量的原始数据集。它有四个变量和 150 行。右边是 PCA 的输出。它有 150 行,但只有两个变量。回顾一下,我们已经将维度从四减少到了两。因此观测数量仍然是 150,而变量的数量已经从四个减少到两个。

图 3.7 左侧的图展示了原始数据集,它有 150 行和 4 个变量。在实施 PCA 后,变量的数量已被减少到了两个。行数仍然是 150,这由 pca_2d 的长度表明。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一旦我们减少了成分的数量,我们可以继续实施监督学习或无监督学习的解决方案。我们可以将以上解决方案应用于其他真实世界问题中,这些问题中我们的目标是减少维度。您将在案例研究部分进一步探讨这个问题。

通过这一部分,我们已经学习了 PCA。Github 仓库中包含了一个带有变量和相应图表的非常有趣的 PCA 分解。接下来我们将在下一节探讨奇异值分解(SVD)。

3.6 奇异值分解(SVD)

在上一节中,我们学习了主成分分析(PCA)。PCA 线性地转换数据并生成彼此不相关的主成分。但是特征值分解的过程只能应用于方阵。而奇异值分解(SVD)可以应用于任何 m x n 矩阵。我们现在将更详细地学习这一点。

让我们考虑我们有一个矩阵 A。A 的形状是 m x n,或者包含 m 行和 n 列。A 的转置可以表示为 A^T。

我们可以使用 A 和 A^T 创建另外两个矩阵作为A A^T 和A^TA。这些结果矩阵A A^T 和A^TA具有一些特殊的性质,这些特性如下所列。这些性质的数学证明超出了本书的范围。

A A^T 和 A^TA 的性质是:

  • 它们都是对称的方阵。

    • 它们的特征值要么是正的,要么是零。

    • A A^T 和 A^TA(带上▲)具有相同的特征值。

  • A A^T 和 A^TA 的秩与原矩阵 A 相同。

A A^T 和 A^TA 的特征向量分别被称为 A 的奇异向量。它们的特征值的平方根被称为奇异值

由于这两个矩阵(A A^T 和 A^TA)都是对称的,它们的特征向量互相正交。换句话说,由于是对称的,特征向量是相互垂直的,并且可以具有单位长度。

现在,有了这种数学理解,我们可以定义 SVD。根据奇异值分解方法,可以将任何矩阵 A 分解为

(公式 3.3)

A = U * S * V^T

在这里,A 是原始矩阵,

U 和 V 是正交矩阵,它们的正交特征向量来自于 A A^T 或 A^TA,分别是

S 是对角矩阵,其 r 个元素等于奇异值。

简单地说,SVD 可以被视为使用特征值分解对 PCA 方法进行增强。

奇异值分解比特征值分解更好,且在数值上更健壮。

PCA 被定义为使用主成分对输入变量进行线性转换。所有线性转换、选择最佳成分等概念都保持相同。主要的过程步骤保持相似,除了在 SVD 中,我们使用了稍微不同的方法,其中特征值分解被替换为使用奇异向量和奇异值。通常建议在数据集稀疏时使用 SVD,在数据集较密集时使用 PCA。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 小测验——回答这些问题以检查您的理解力。本书末尾将给出答案。

  1. SVD 基于特征值分解技术。是真还是假?

  2. PCA 比 SVD 更具鲁棒性。是真还是假?

  3. SVD 中奇异值和奇异向量是什么?

接下来,在下一节中,我们将使用 SVD 创建一个 Python 解决方案。

3.6.1 使用 SVD 的 Python 解决方案。

在此案例研究中,我们使用的是“蘑菇”数据集。该数据集包含 23 个烤蘑菇物种的描述。有两个类别——蘑菇是可食用的,“e”,否则蘑菇是有毒的,“p”。

步骤 1: 导入库。我们正在导入

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder, StandardScaler

步骤 2: 导入数据集并检查形状、头等。

mushrooms_df = pd.read_csv('mushrooms.csv')
mushrooms_df.shape
mushrooms_df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 3: 我们可以观察到,数据集中的值是分类的。它们必须首先被编码为数字值。这不是处理分类变量的唯一方法。本书的最后一章将探讨其他技术。我们将深入探索这些技术。

首先,我们调用 LabelEncoder,然后将其应用到数据集中的所有列。LabelEncoder 使用一种独热编码方法将分类变量转换为数字变量。

encoder = LabelEncoder()
for col in mushrooms_df.columns:
    mushrooms_df[col] = encoder.fit_transform(mushrooms_df[col])

步骤 4: 重新查看数据集。所有分类值都已转换为数字值。

mushrooms_df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 5 步: 接下来的两步与上一个案例研究相同,在这两步中,我们将数据集分解为 X 变量和 y 标签。然后对数据集进行标准化。

X_variables = mushrooms_df.iloc[:,1:23]
y_label = mushrooms_df.iloc[:, 0]
scaler = StandardScaler()
X_features = scaler.fit_transform(X_variables)

第 6 步: 在这一步中,我们实现了 SVD。在 numpy 中有一个实现 SVD 的方法。输出是 u、s 和 v,其中 u 和 v 是奇异向量,s 是奇异值。如果您愿意,您可以分析它们各自的形状和维度。

u, s, v = np.linalg.svd(X_features, full_matrices=True)

第 7 步: 我们知道奇异值允许我们计算每个奇异向量解释的方差。我们现在将分析每个奇异向量解释的%方差,并绘制出来。结果显示到小数点后三位。然后我们将结果绘制成直方图。在 x 轴上是奇异向量,而在 y 轴上是%解释的方差。

variance_explained = np.round(s**2/np.sum(s**2), decimals=3)
variance_explained
sns.barplot(x=list(range(1,len(variance_explained)+1)),
            y=variance_explained, color="blue")
plt.xlabel('SVs', fontsize=16)
plt.ylabel('Percent of the variance explained', fontsize=15)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 8 步: 现在我们将创建一个数据框。这个新的数据框 svd_df 包含了前两个奇异向量和元数据。然后我们使用 head 命令打印前 5 行。

col_labels= ['SV'+str(i) for i in range(1,3)]
svd_df = pd.DataFrame(u[:,0:2], index=mushrooms_df["class"].tolist(), columns=col_labels)
svd_df=svd_df.reset_index()
svd_df.rename(columns={'index':'Class'}, inplace=True)
svd_df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第 9 步: 与上一案例类似,我们将数值替换为实际的类标签。1 代表可食用,而 0 代表有毒。

svd_df['Class'] = svd_df['Class'].replace({1:'Edible', 0:'Poison'})

第 10 步: 我们现在正在绘制两个组件解释的方差。这里我们只选择了前两个组件。建议您使用上一节描述的方法选择最佳的组件数量,并绘制相应的散点图。在这里,x 轴上显示了第一个奇异向量 SV1,而 y 轴上显示了第二个奇异向量 SV2。

color_dict = dict({'Edible':'Black',
                   'Poison': 'Red'})
sns.scatterplot(x="SV1", y="SV2", hue="Class", 
                palette=color_dict, 
                data=svd_df, s=105,
                alpha=0.5)
plt.xlabel('SV 1: {0}%'.format(variance_explained[0]*100), fontsize=15)
plt.ylabel('SV 2: {0}%'.format(variance_explained[1]*100), fontsize=15)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以观察两个类别相对于两个组件的分布情况。两个类别 - 可食用和有毒 - 被分别以黑色和红色编码。正如我们上面所指出的,我们只选择了两个组件来展示使用可视化图的影响。建议您使用上一个案例研究中描述的方法选择最佳的组件数量,然后使用不同的奇异向量来可视化结果。这个解决方案可以用来在实际数据集中减少维度。

这就结束了我们对 SVD 的讨论。我们将在下一节中观察 PCA 和 SVD 的优势和挑战。

3.7 维度缩减的优缺点

在本章的开头部分,我们讨论了维度诅咒的缺点。在最后几节中,我们了解了 PCA 和 SVD,并使用 Python 进行了实现。在当前部分,我们将审查这些技术的优势和挑战。

实施 PCA 或 SVD 时我们获得的主要优势如下:

  • 降低维度会减少数据集的复杂性。相关特征被移除并进行了转换。手动处理相关变量是一项相当手动和令人沮丧的工作。PCA 和 SVD 等技术可以很容易地帮助我们完成这项工作。相关特征的数量被最小化,并且整体维度被降低。

    • 如果维度较少,数据集的可视化效果会更好。极高维度的数据集很难进行可视化。

    • 如果移除相关变量,机器学习模型的准确性会得到改善。这些变量不会对模型的性能有所贡献。

    • 训练时间减少因为数据集的复杂性较低。因此,需要较少的计算力和时间。

  • 在监督机器学习模型中,过拟合是一个讨厌的问题。这是一种情况,模型在训练数据集上表现良好,但在测试/验证数据集上却表现不佳。这意味着模型可能无法在真实世界的未知数据集上表现良好。而这违背了构建机器学习模型的整个目的。PCA/SVD 通过减少变量数量来帮助解决过拟合问题。

与此同时,我们在降维技术中面临一些挑战,如下所述:

  • PCA/SVD 创建的新组件不太可解释。它们是数据集中独立变量的组合,实际上与真实世界没有关系,因此很难将它们与真实世界的情况联系起来。

    • PCA/SVD 需要数值变量。因此,所有分类变量必须以数值形式表示。

    • 在实施解决方案之前,需要对数据集进行归一化/标准化

  • 当使用 PCA 或 SVD 时可能会发生信息损失。主成分无法取代原始数据集,因此在实施这些方法时可能会有一些信息损失。

但尽管存在一些挑战,PCA 和 SVD 用于降低数据集的维度。它们是最受欢迎的方法之一,也被广泛使用。与此同时,必须注意的是,这些都是线性方法,我们将在本书的后期部分介绍非线性方法。

通过这样,我们已经涵盖了在降维中使用的两种重要技术。我们将在后面的章节中探讨更高级的技术。是时候转到案例研究了,这是本章的下一部分内容。

3.8 降维案例研究

现在我们将探索一个真实案例,以了解 PCA 和 SVD 在真实商业场景中的使用。

想象一下:你正在为一个电信服务提供商工作。你有一个订户基础,并希望根据许多参数对消费者进行聚类。但挑战在于需要分析的庞大维度。

目标是使用降维算法减少属性的数量。消费者数据集可以如下所示。

  1. 订户的人口统计详情将包括年龄、性别、职业、家庭规模、婚姻状况等。下面显示的列表并不全面。

表格 3.4 订户的人口统计详情,如年龄、性别、婚姻状况、家庭规模、城市等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 消费者的订阅详情可能如下表所示。下面显示的列表并不全面。

表格 3.5 订户的订阅详情,如服务期限、预付费/后付费连接等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 消费者的使用情况将描述分钟数、通话费率、数据使用情况、服务等。下面显示的列表并不全面。

表格 3.6 订户的使用情况指定了使用的分钟数、发送的短信、使用的数据、在网络中度过的天数、国内或国际使用情况等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 订户的付款和交易详情将涉及到所做的各种交易、付款方式、付款频率、自上次付款以来的天数等。

表格 3.7 展示了订户的交易详情,包括金额、模式等的所有详情。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集可能有更多属性。到目前为止,我们已经确定所涉及的变量数量确实很高。一旦我们汇总了所有这些数据点,最终数据的维数就可能非常庞大。

表格 3.8 最终数据集是所有上述数据集的组合。这将是一个庞大的、真正高维的数据集,需要进行分析。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们能够进行任何监督或无监督解决方案之前,我们必须减少属性的数量。在本章中,我们专注于降维技术,因此步骤涵盖了该过程的这一方面。在后面的章节中,我们将更详细地研究探索性分析。

作为第一步,我们将对数据集进行健全性检查并进行数据清理。我们将检查数据点的数量,缺失值的数量,重复值,存在的垃圾值等。这将使我们能够删除可能非常稀疏或包含不多信息的任何变量。例如,如果性别仅适用于客户基数的 0.01%,则去除该变量可能是个不错的主意。或者如果所有客户的性别都为男性,该变量对我们没有添加任何新信息,因此可以丢弃。有时,使用业务逻辑,可能会从数据集中删除一个变量。在前面的部分中已经讨论了一个例子。在这一步骤中,我们可能会组合一些变量。例如,我们可能通过将总支出金额除以总交易数来创建一个新变量作为平均交易值。以这种方式,我们将能够减少一些维度。

一个 Python Jupyter 笔记本可在 Github 存储库中找到,我们在那里提供了对数据清理步骤的非常详细的解决方案。

基本数据清洗完成后,我们开始进行探索性数据分析。作为探索性分析的一部分,我们检查变量的分布、其分布情况,数值变量的平均数/中位数/众数。这有时被称为单变量分析。这一步骤允许我们测量变量的分散程度,了解中心趋势,检查分类变量的不同类别的分布,并查找值中的任何异常情况。例如,使用上述提到的数据集,我们将有兴趣分析数据使用的最高/最低/平均值,或者性别或年龄的%分布。我们想知道最受欢迎的交易方式,我们也对交易的最高/最低/平均金额感兴趣。等等,这个列表还可以继续下去。

然后我们探索变量之间的关系,这被称为双变量分析。交叉表,数据分布是双变量分析的一部分。在这一步骤, 创建了一个相关矩阵。需要仔细研究高度相关的变量。根据业务逻辑, 其中一个变量可能会被丢弃。这一步骤有助于可视化和理解一个变量在其他变量存在的情况下的行为。我们可以检查它们的相互关系和关系的强度。在本案例研究中, 我们将回答诸如 - 对比使用更多数据的订阅者与发送更多短信的订阅者, 是否在网络上花费更多时间。或假设 - 使用在线模式进行交易的订阅者是否比使用现金进行交易的订阅者产生更多收入。或者性别/年龄与数据使用之间是否存在关系。在项目的这个阶段, 将回答许多这样的问题。

Github 存储库中提供了 Python Jupyter 笔记本,提供了单变量和双变量阶段的详细步骤和代码。来看一下吧!

在此阶段,我们拥有一个具有大量维度的数据集,并希望减少维数。现在是实施 PCA 或 SVD 的好时机。这些技术将减少维数,并使数据集准备好在过程的下一步中使用,如图 3.8 所示。这张图仅是一个代表性的结构,用于描述维数约简方法的影响。请注意,左图中的大量黑线正在缩减为右图中较少的红线。

图 3.8 非常高维的数据集将通过捕获数据集中的最大方差来减少到低维度

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

降维方法的输出将是一个少于原始变量数量的数据集。该数据集可以用于监督学习或无监督学习。我们已经在本章前面的章节中介绍了使用 Python 的例子。

这结束了我们关于电信用户的案例研究。这种情况可以扩展到其他领域,如零售、银行金融、航空、医疗保健、制造等。

现在我们将进入本章的总结。

3.9 总结

数据无处不在,以各种形式、层次、维度呈现,具有不同的复杂程度。人们经常提到“数据越多越好”。在一定程度上这确实是正确的。但是,如果维度非常高,从中获取有用信息将会非常困难。数据分析可能会出现偏差,并且处理起来非常复杂。我们在本章探讨了维数灾难。PCA / SVD 可以帮助减少这种复杂性。他们使数据集准备好下一步。

但是维数约简并不像看起来那么简单。这不是一个容易完成的任务。但它确实是一个非常有回报的任务。并需要商业眼光、逻辑和常识的结合来处理。结果数据集可能仍需要一些额外的工作。但这是建立机器学习模型的一个很好的起点。

这标志着第三章的结束。同时也结束了本书的第一部分。在本部分中,我们介绍了更基础的算法。我们从本书的第一章开始探究机器学习的基础和基本知识。在第二章中,我们探讨了三个聚类算法。在第三章中,我们探索了 PCA 和 SVD。

在书的第二部分,我们正在转向并学习更先进的话题。我们将在下一章开始研究关联规则。然后我们进入高级聚类方法,比如时间序列聚类、模糊聚类、GMM 聚类等等。接着是一章关于高级的降维算法,比如 t-SNE、LDA。然后,在第二部分的结束,我们将研究无监督学习在文本数据集上的应用。书的第三部分更加先进,我们将深入基于神经网络的解决方案并使用图像数据集。所以还有很长的路要走!敬请关注!

现在你可以进入问题部分了!

实际的下一步和建议的阅读
  1. 使用上一章节使用的车辆数据集进行聚类,并在其上实施 PCA 和 SVD。比较在实施 PCA 和 SVD 之前和之后进行聚类的性能。

  2. 从 (data.world/datasets/pca) 获取数据集。在这里,你会发现许多数据集,比如联邦计划网络安全、比萨数据集等等。比较在这些数据集上实施 PCA 和 SVD 的性能。

  3. 阅读下面关于主成分分析(PCA)的论文

  4. www.sciencedirect.com/science/article/pii/009830049390090R

  5. web.stanford.edu/~hastie/Papers/spc_jcgs.pdf

  6. web.cs.ucdavis.edu/~vemuri/papers/pcaVisualization.pdf

  7. cseweb.ucsd.edu/~ravir/papers/pca/pamifinal.pdf

  8. 阅读一下关于奇异值分解的研究论文

  9. people.maths.ox.ac.uk/porterm/papers/s4.pdf

  10. papers.nips.cc/paper/3473-quic-svd-fast-svd-using-cosine-trees.pdf

  11. arxiv.org/pdf/1211.7102.pdf

  12. glaros.dtc.umn.edu/gkhome/fetch/papers/sarwar_SVD.pdf

3.10 总结

  • 我们了解到,在数据集中拥有很多维度会引发一个问题,即维度灾难。由于维度灾难的存在,数据集变得非常复杂,处理起来也变得更加耗时。

    • 我们还提到了可以有多种技术来解决维度灾难的问题,比如 PCA、LDA、SVD、自编码器、t-SNE、等等。

    • 我们详细介绍了主成分分析(PCA),在其中我们学到,一个主成分是各种变量的线性组合。使用这种方法,通过具有捕捉数据集中最大方差的主成分,可以减少总维数。

    • 然后我们转向奇异值分解,在这一部分,大部分过程与 PCA 相同,只是 PCA 中的特征值分解被奇异向量和奇异值在 SVD 中替换了。

    • 我们还学到,当得到主成分后,虽然解决了维度灾难的问题,但原始变量却丢失了。

  • 最后,我们使用 sklearn 库对这些技术进行了 Python 实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值