Libsvm中的大规模训练和测试数据

3
我正在使用Libsvm进行5x2交叉验证以对大量数据进行分类,即我有47k个样本用于训练和47k个样本用于在10个不同的配置中进行测试。
通常我使用Libsvm的脚本easy.py来分类数据,但是它花费的时间太长了,我已经等待超过3个小时,仍然没有结果,我还需要重复这个过程9次!
有人知道如何在处理大量数据时更快地使用libsvm吗? C++ Libsvm函数是否比python函数更快?
3个回答

6
LibSVM的训练算法无法扩展到这种类型的数据集;在最坏情况下需要O(n³)的时间,在典型情况下需要约O(n²)的时间。首先要尝试的是正确缩放数据集;如果仍然不起作用,请切换到:

谢谢你的回答,但如果我使用带有线性核的libsvm(例如使用参数t 0的-svmtrain命令),那我是在使用线性svm,因此运行时间会很短吗? - mad
1
@mad:不行。你将会使用相同的缓慢的SMO算法。这就是为什么LibSVM的作者发布了Liblinear,它可以使用坐标下降算法拟合(几乎)相同类型的模型。 - Fred Foo

3
正如larsmans所提到的,根据数据的维度和数据点的数量,libsvm可能不会很好地扩展。C实现可能会运行得更快,但差别不大。您有几个可用的选项:
- 您可以随机抽样数据,以处理其中的一个小子集。 - 您可以使用PCA之类的方法将数据投影到较低的维度中。 - 根据您的数据类型,您可以研究不同的内核。直方图交集内核是否适用于您的数据?当您只需要线性决策函数时,您是否正在使用RBF内核?
希望这可以帮助您!在机器学习中最棘手的问题之一是应对有时所需的纯数据量。

0

easy.py是一个用于训练和评估分类器的脚本。它使用grid.py进行SVM参数的元训练。在grid.py中有一个参数"nr_local_worker",它定义了线程数。您可能希望增加它(检查处理器负载)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接