针对大型数据集优化 Weka

数据挖掘 机器学习 分类 大数据 聚类 算法
2022-02-16 10:45:09

首先,我希望我在这里是正确的 StackExchange。如果没有,请道歉!

我目前正在处理大量的特征值向量。这些向量有数百万个(可能多达 2000 万个)。它们包含一些语言/句法特征,它们的值都是字符串。

因为大多数分类器不将字符串数据作为值处理,所以我将它们转换为二进制频率值,所以一个属性看起来像这样:

@attribute 'feature#value' numeric

每行的值要么是 1,要么不存在(所以请注意它是一个稀疏的ARFF 文件)。

问题是,有 250K 行,有超过 500K 的属性,所以,大多数算法都很难做到这一点。

有很多算法。我真的很好奇你会认为什么是合适的(最好是无人监督的,但任何东西都可以),如果你甚至有一些想法我可以如何提高性能。我可以在小数据子集上进行训练,但只有在使用大量数据(至少 700 万个事件)时,结果才会变得更好。

目前,我一直在使用 NaiveBayes 变体(Multinomial 和 DMNBText),它们确实是唯一能够以可接受的速度咀嚼数据的变体。

非常感谢。如果您需要更多信息,请告诉我。

干杯。

1个回答

我会去降维。您可以从 SVD 开始(应该在 Weka 中可用)。如果 SVD 太慢/太消耗内存,那么还有一些选择:

  • CUR-decomposition:奇异值分解的一种变体,如果原始矩阵是稀疏的,则保持分解的矩阵稀疏(参见:Mining Massive Datasets book 的这一章)

  • 随机投影:将数据投影到随机的低维子空间(参见:降维中的随机投影:图像和文本数据论文的应用)

  • 核心集:给定矩阵 A,核心集 C 被定义为 A 的行的加权子集,使得从任何给定的 k 维子空间到 A 的行的距离平方和与加权距离的平方和大致相同对于 C 中的行,请参阅使用 Coresets论文的大规模稀疏数据集的降维)

这只是冰山一角。野外还有更多方法。问题是我怀疑这些解决方案中的任何一个都是 Weka 附带的(如果我在这方面错了,请纠正我)。我会搜索任何这些算法的可用 Java 实现,并尝试将其移植到 Weka 的 arff 文件中。