在 Python 中对非常大 (n=140000) 二进制数据集进行聚类分析的技术?

数据挖掘 机器学习 Python scikit-学习 聚类
2022-02-28 16:23:48

本质上:Python 中的哪些技术可以在非常大的分类数据集中找到集群/趋势?

我非常大的分类数据数据集(140000 行/观察,80 个变量)已使用 one-hot 编码重新编码,因此它们都是二进制的(例如,ethnicity_black、ethnicity_asian)。该数据集用于英国警察使用武力的实例。

我正计划对其进行凝聚层次聚类以找到使用力事件中的模式(通过集群描述),但我无法做到这一点,因为距离矩阵总是太大并且不断崩溃。我使用的是 Gower 的距离,因为它们都是虚拟变量和 gower 包。

我曾尝试通过 MCA 进行降维(如 PCA,但用于分类变量),但这只是减少了列数,并且距离矩阵仍然太大(140000x140000 需要 72.7GB 的 RAM)。

然后我尝试减少到​​前 10000 行,但这占用了 10000x10000=100000000(1 亿个单元格),并且在构建树状图时超出了递归深度限制。不确定是否适合简单地取 1400000 行中的一个很小的随机子集?因为这在揭示模式方面可能没有代表性。

因此,我正在寻找除层次聚类之外的其他聚类方法,因为 K-means 仅适用于连续数据,DBSCAN 也是如此,因为它们使用欧几里得距离。想知道你们之前在工作中是否遇到过类似的情况,在这种情况下可以分享其他技术或可能的解决方法吗?

tldr; K-Means 和 DBSCAN 似乎适用于连续数据,由于所需的相异矩阵,层次聚类对于大型数据集的可扩展性不是很好。我正在探索 K 模式,但也不确定如何解释输出......

我之前做过这种 MCA - 层次聚类技术,但在 R 中,密切遵循本文中使用的方法:https://erf.org.eg/wp-content/uploads/2019/11/Fateh-Belaid_Manuscript_FB_10-09-2019_FB。 pdf

但是,即使该工作流程也不适用于我当前的数据集,因为它太大了。

任何意见,将不胜感激...

非常感谢你!

2个回答

由于您有二进制数据,因此您可以使用汉明距离作为聚类的相似性度量。

然后你必须处理数据的大小。这里有几个选项:

  1. 从云计算服务中租用更大的计算机或计算机集群。

  2. 将问题视为流数据问题。使用“在线”技术一次只加载和拟合一部分数据。

免责声明:我以前从未使用过这种稀疏数据进行聚类,但使用堆叠自动编码器将数据减少到潜在的连续空间可能是值得的。一旦减少,您可以使用传统方法对数据进行聚类。

由于采用了一种热编码,因此您需要一个卷积自动编码器,该编码器将 1d 卷积用于 2d 输入。