【问题标题】:How can I get Weka classifiers to use a lot less memory and CPU time?如何让 Weka 分类器使用更少的内存和 CPU 时间?
【发布时间】:2013-12-14 22:03:15
【问题描述】:

我有一个包含 250,000 个实例的训练集,这对于 Weka 分类器来说太大而无法处理(虽然数据加载到 Weka UI 中很好,但任何运行非平凡分类器的尝试都会导致内存不足,即使机器的整个 8GB RAM 专用于 JVM 堆)。

因为这涉及地理数据,如果我在纬度/经度上进行聚类并在每个聚类上训练单独的分类器,它应该会表现得很好。

有没有办法在 Weka 命令行或 KnowledgeFlow 上轻松完成此操作,而不必弄乱 ARFF 文件? (我更喜欢保留一个大的 ARFF 文件,以便可以在 Weka 中评估不同的拆分策略)

我研究了 Bagging 和 Cross-Fold Validation,但我认为它们不适合我的问题,因为我不希望数据随机拆分,而是根据位置的相似性保持在一起。

【问题讨论】:

  • 100k 行,5 列,给 WEKA 80GB(不是 8、80),但这还不够。我感觉到你的痛苦。

标签: machine-learning weka


【解决方案1】:

如果我聚集在纬度/经度上,它应该会表现得很好

这取决于算法涵盖的值区域。如果他们来自世界各地,k-means 可能会给你一些令人惊讶的结果。 long/lat 不太适合 k-means 假设的世界。 Specifically the average in the euclidean space doesn't match up with the average on the longitude/latitude space

(我更喜欢保留一个大的 ARFF 文件,以便可以在 Weka 中评估不同的拆分策略)

但你说它太大而无法放入内存?没有任何开销,假设 2 d 特征向量(经度和纬度)加上一个输出值,250k*3*8 字节只有 6 兆字节,加上对象开销可能是 12 MB(如此小的数组使得标头在 Java 领域相对较大)。即使您的数据密集且 D = 1000,您仍然只占用 2 GB 多一点的内存。

我认为您可能对您真正想要做什么以及如何去做有些困惑。在解决您的问题之前,也许您应该花更多的时间来学习机器学习。 Coursera 有一个足够好的入门课程。

【讨论】:

  • 感谢您的评论。我看到你怀疑我会用完内存。内存使用情况有些非线性。我可以很好地使用小型套装,最多 50k 件物品。再往上走,一些算法开始失败。我的 JVM 设置为 4GB 堆。
  • 您还没有告诉我们您的问题的规模。而且您似乎仍然对自己在做什么感到困惑(您提到的所有 3 件事 [内存问题、本地学习的分类器、装袋] 彼此之间没有关系)。最后,Weka 不是一个很好的工具,而且以使用比应有的更多的内存而臭名昭著。如果你想坚持使用Java,你可以试试JSAT(偏见警告:我是作者)。但是,如果您不了解自己在做什么,它只会对您有很大帮助。
  • 这里唯一的困惑是 Weka 无法对任何非平凡的数据量执行任何非平凡的算法。顺便说一句,如果我之前的评论不清楚,Weka UI 完全能够加载所有 250K 实例。只有在其上运行分类器算法时,它才会中断。聚类算法似乎使用较少的内存; K-means 不会爆炸并在几秒钟内运行。在进行实验时,我注意到 Bagging 元分类器可以防止内存错误,但它会随机分离我的数据,这不是最优的。我明天可以试试 JSAT。
  • 那么请更正您的问题。 “我有一个包含 250,000 个实例的训练集,太大而无法存储在内存中。”显然意味着您的数据集本身不适合内存。 " 但它随机分离我的数据,这不是最优的。 "这正是 bagging 应该做的。
  • 感谢您的反馈,我编辑了问题。好的,我调查了 JSAT。对于一个作者的项目来说,这确实令人印象深刻 :-) 不幸的是,它不符合我的需求。我希望为这项任务做尽可能少的编程。我已经有了一个 ARFF 文件,我想在没有进一步操作的情况下使用它。 JSAT 似乎无法做到这一点。
【解决方案2】:

在训练分类器时添加这两个选项会对性能产生惊人的影响,因此无需拆分数据集:

-no-cv -v

RandomForest、J48 和 LWL 的训练时间降至 2 分钟以下,如果没有这些选项,算法将无法终止(在数小时后)或内存不足。

保留以前基于文件拆分的答案,以防它对拥有非常大数据集的人有所帮助:

我找到了部分解决方案。以下命令行(在 Windows 中)将基于集群将一个 ARFF 文件中的数据拆分为十个单独的 ARFF 文件(我使用 K-Means,因为它运行速度非常快,但稍后可能会切换到 EM 或 DBSCAN):

java -Xmx4096m -cp weka.jar weka.filters.unsupervised.attribute.AddCluster -i %TEMP%\StreetSet.arff -o \temp\clusters.arff -W "weka.clusterers.SimpleKMeans -N 10 -num-slots 4"

for /l %i in (1,1,10) do java -Xmx4096m -cp weka.jar weka.filters.unsupervised.instance.RemoveWithValues -C last -L %i -V -i \temp\clusters.arff -o \temp\cluster%i.arff

这不是我想要的,因为使用这种方法我不能使用 Experimenter 来尝试不同的参数组合,现在它使新实例的评估/测试变得复杂,必须通过单独的命令行来分割先集群。我希望这一切都能在 Weka 元分类器中透明地处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 2020-11-22
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    相关资源
    最近更新 更多