如何让Weka分类器使用更少的内存和CPU时间?

时间:2013-11-28 19:14:01

标签: machine-learning weka

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

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

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

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

2 个答案:

答案 0 :(得分: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以上的内存。

我认为你可能会对你真正想要做什么以及如何做而感到困惑。在解决问题之前,也许你应该花更多的时间来学习ML。 Coursera有一个很好的介绍课程。

答案 1 :(得分:-1)

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

-no-cv -v

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

基于文件分割的先前答案,以防万一有真正大型数据集的人:

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

  

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元分类器中透明地处理这一切。