Skip to content Skip to footer

尖端聚类技术:Spark 驱动的 K-Means 聚类优化方法

尖端聚类技术:一种火花驱动的 K 均值聚类优化方法

image-20240204002843520

在我以前的公司,我们利用 K-means 聚类来分析社交媒体数据,特别关注消费品和对话。该过程从社交媒体元数据的收集和处理开始。然后,我们从这些数据中生成嵌入,这些嵌入用于使用 K-means 聚类将数据聚类到各种有机主题中。每个主题都包含具有相似性的推文,形成不同的对话集群。

然后使用人工智能技术分析这些集群,以总结集群每个主题中的对话。这种方法使我们能够识别和分类与体育、政治、食品、媒体等相关的讨论,并了解消费者对特定对话和产品的情绪。该框架旨在通过对数百万个聚类的分析,利用嵌入和 K-means 聚类来有机地理解主题。

但是,我认识到了一个需要改进的关键领域。这些聚类的质量需要提高,以确保我们分析的准确性。具体来说,我们必须确定最佳聚类数 (K),以防止聚类边缘的数据点(具有相似的语义含义)被错误地分组。错误分类可能会导致结果混淆或不准确。例如,搜索名为巨人队的足球队的信息可能会错误地检索有关旧金山巨人队的数据,从而导致荒谬的结果。

解决这一问题至关重要。在大型数据集中确定最佳 K 是数据科学中的一项重大挑战,这带来了计算效率障碍。成功克服这一挑战对于我们产品的潜力和有效性至关重要。

我解决这个问题的第一步是集成 Spark;在此之前,我使用 Pandas DataFrame 来处理我的数据。Pandas 虽然非常适合在较小的数据集中进行数据操作和分析,但由于其在处理大数据方面的固有局限性,对于大规模数据迭代的效率往往较低。它在内存中运行,这意味着它受到系统RAM的限制,并且在处理非常大的数据集时可能会在性能和可伸缩性方面遇到困难。相比之下,Spark 专为分布式计算而设计,可以更有效地处理大规模数据处理。Spark 将数据分布在集群中并行处理,这大大缩短了计算时间,并允许处理比单台计算机内存中容量大得多的数据集。Spark 的这种分布式特性使其特别适用于迭代算法,例如在 K 均值聚类中查找最佳 K,因为它可以快速处理和迭代大量数据。通过利用 Spark 的功能,我能够实现更高效、更可扩展的数据处理,从而更快、更准确地确定最佳 K。

在深入研究我的方法的详细步骤之前,首先了解支撑我的代码中使用的技术的几个关键概念至关重要。

PCA 是一种降维技术,用于将高维数据转换为低维空间,同时保留尽可能多的方差。在 Spark 和大数据的背景下,PCA 特别有用,因为高维数据可能需要计算密集型数据才能处理。在对大型数据集进行聚类时,维度的诅咒会导致计算负载增加和聚类算法性能下降。PCA 通过减少特征数量同时保持数据的本质来提供帮助,从而使计算更易于管理并提高 KMean 等算法的性能。Spark 中的 PCA 以分布式方式实现,使其能够高效地处理大规模数据。

弯头法和轮廓法的区别

Elbow 方法和轮廓法是用于确定聚类算法(如 KMeans)中最佳聚类数的两种方法。

肘部法:此方法涉及根据聚类数 (k) 绘制簇内平方和 (WSS)。随着 k 的增加,WSS 趋于减小;图中的“肘部”点,其中下降率急剧变化,被认为是最佳 K 的指标。肘部方法是一种启发式和视觉方法,肘部的识别有时可能是主观的。

轮廓法:轮廓法衡量聚类的质量。它计算每个样本的轮廓分数,这是衡量样本与其他聚类相比与自己的聚类的相似程度的度量。轮廓分数范围从 -1 到 1,其中高分表示样本聚类良好。通过计算不同k值的平均轮廓得分,可以客观地确定得分最高的k作为最佳聚类数。与肘部法不同,轮廓法提供了一种更定量且不那么主观的方法来评估最佳聚类数量。

Spark 中的密集向量和 UDF

密集向量:在 Spark 中,密集向量是存储为双精度数组的局部向量。此数组中的每个元素都表示一个特征或维度。Spark 的机器学习库 MLlib 中使用密集向量来有效地表示数据点的特征。它们与常规数组的不同之处在于,它们针对 Spark 的分布式计算环境进行了优化,并与 Spark 的数据类型和 ML 算法集成。

UDF(用户定义函数):Spark 中的 UDF 允许用户定义可应用于 DataFrame 列的自定义转换。与常规 Python 函数不同,Spark 中的 UDF 以分布式方式跨集群中的节点运行。定义 UDF 时,Spark 会序列化函数并将其发送到每个节点,并在其中对数据的本地分区进行操作。这样就可以对大型数据集进行大规模自定义处理。UDF 可用于执行 DataFrame 转换本身不支持的复杂操作。

将 Spark 集成到我的工作流程中后,我继续执行以下步骤,以确保平稳过渡并有效利用其功能进行大规模数据处理。

导入语句和变量声明:我首先导入了必要的 PySpark 模块(例如 SparkSession),并为 BigQuery 集成声明了变量。

image-20240204002905503

启动 Spark 实例:然后,我们创建了一个 Spark 会话,并将其配置为使用 BigQuery 连接器。

更改 Spark 配置:为了便于交互式数据浏览,我们在 Spark 配置中启用了 eager 评估。

image-20240204002921544

创建 Spark DataFrame:我们将 BigQuery 表中的社交媒体数据读取到 Spark DataFrame 中进行处理。

image-20240204002939595

数据预处理:我专注于“嵌入”列,删除任何缺失值并根据向量长度一致性过滤行。

image-20240204002955820

数据采样:我从过滤后的 DataFrame 中创建了不同大小的样本,以有效地管理数据量。

image-20240204003016472

数据采样:我从过滤后的 DataFrame 中创建了不同大小的样本,以有效地管理数据量。

聚类的数据转换:我使用 PySpark 的 VectorAssembler 和 StandardScaler 将“嵌入”列转换为适合机器学习算法的格式。

聚类和评估:我采用了 KMean 和 MiniBatchKMeans 聚类算法,迭代不同的 k 值,并使用轮廓分数进行聚类质量评估。

主成分分析(PCA):为了降低维度,我将PCA应用于标准化数据,选择适当数量的主成分。

最优 k 的肘法:我采用肘法,计算不同 k 值的簇内平方和 (WSS),以确定最佳簇数。

image-20240204003053939

image-20240204003146302

通过Spark的集成和先进数据科学技术的应用,我成功地解决了分析社交媒体数据以进行消费产品讨论的关键挑战。最初,我们的框架利用 K-means 聚类将大量数据分类为不同的主题,但聚类的质量需要改进才能进行准确分析。主要障碍是确定最佳聚类数量,以避免错误分类并提高我们见解的精确度。

为了克服这个问题,我从使用 Pandas DataFrame(对于大规模数据效率较低)过渡到利用 Spark。Spark 的分布式计算能力显著改善了对大量数据集的处理,这对于在 K-means 聚类中迭代寻找最佳 K 至关重要。我采用了主成分分析(PCA)等技术进行降维,使高维数据更易于管理。此外,我还探索了两种确定最佳聚类数量的方法:肘部法和轮廓法,后者提供了更定量的评估。

该过程涉及复杂的数据预处理和转换,使用 Spark 的功能,如用户定义函数 (UDF) 和密集向量。使用不同的 k 值迭代应用聚类算法,包括 KMean 和 MiniBatchKMeans,并使用轮廓分数评估其质量。PCA 进一步简化了数据,降低了维度,从而实现了更有效的聚类。

最终,采用这种综合方法最终发展出一种不仅更有效而且更精确的集群机制。在识别和分类各种主题(包括体育、政治和媒体)的讨论方面提高了准确性,使我们能够更深入地了解消费者的情绪和行为。这反过来又大大增强了我们产品的潜力和有效性。在此实现之前,使用 Pandas 框架,聚类过程大约需要三个小时才能完成。然而,Spark 的集成将处理时间大大缩短到仅 30-40 分钟。此外,这种向 Spark 的转变还提供了对最佳聚类数 (K) 的更准确确定,进一步完善了我们的分析见解。