通过字符串序列对观察结果进行聚类(Python/Pandas df)

数据挖掘 Python 聚类 文本挖掘 熊猫
2021-10-13 21:18:41

我有一个包含大约 200 万个独特观察的数据集。它最初是一组 ID 和 URL。目标是根据所查看的 URL 对 ID 进行聚类。我将两列都转换为索引形式以简化数据。因此,该集合有 2 列;1. 一个唯一的 ID 和 2. 一袋密钥字符串(它们是识别数字,但采用字符串格式,以空格分隔)。示例格式:

  1. 身份证 | 关键词
  2. 0 | 1 2
  3. 1 | 2
  4. 2 | 3
  5. 3 | 2 3

我最初通过 TD-IDF 对关键词进行矢量化,并使用简单而肮脏的 KMeans(通过 sklearn)将它们聚类为 13 个集群(通过肘部方法选择),这似乎可以工作并输出直观而有趣的结果。

然而,我遇到的问题是,总是有一个占主导地位的集群拥有约 80% 的观察结果。我假设 KMeans 是假设方差不变的限制因素,并研究了潜在狄利克雷分配 (LDA) 以及高斯混合建模 (GMM) 和贝叶斯 GMM 作为替代方案。使用与上述相同的数据格式,LDA 似乎产生了不直观的结果,所有主题都非常相似并且没有多大意义(与 KMeans 集群有很大不同,预计会看到一些关键的相似主题?)。

我对聚类很陌生,而且已经超出了我的深度,并且已经阅读了很多关于它的内容,但是如果有人能提供任何关于直接逻辑缺陷的见解或朝着正确的方向推进,我将非常感激。

编辑:大约有 3300 个唯一 URL(或本例中的关键字)。每个文档的令牌/URL 数量实际上是相当倾斜的。中位数为 1,平均值约为 1.5(少数 ID 具有大量令牌,我可以将其中一些视为异常值,但大多数我不能)。另一个关键的事实是,在优势集群中,这些看过大量KeyWords的“大玩家”几乎都在优势集群内。我删除了它们以查看结果如何,并且占主导地位的集群仍然存在。

2个回答

由于 URL 通常是唯一的字符串,我不确定 NLP 方法在这里是否合适。有趣的是,TFIDF+Kmeans 给了你一个直观的结果,但是由于这个问题是无监督的,很难说什么是直观的。

在我看来,您的问题是二分图中的典型社区检测例如本文这种方法当然值得一试。当然,结果可以与其他算法相结合,例如在投票模式中。

最后但并非最不重要的一点是采用不限制分辨率的聚类方法,例如在社区检测中,任何基于模块化的方法都只能捕获大于分辨率限制的聚类。解决此问题的一种方法是对数据进行分区的分层方法,在该方法中,您再次在找到的非常大的集群上应用集群。

希望能帮助到你!

TF IDF 和 LDA 旨在处理更长的文档所有文档都应该有超过 100 个令牌。

中位数为 1 时,没有聚类可以做很多事情。他们要么访问了相同的网址,要么没有。这对于统计方法来说信息太少了。