libsvm 中的大型训练和测试数据

Posted

技术标签:

【中文标题】libsvm 中的大型训练和测试数据【英文标题】:Large training and testing data in libsvm 【发布时间】:2013-07-01 16:50:54 【问题描述】:

我在 5x2 交叉验证中使用 Libsvm 对大量数据进行分类,也就是说,我有 47k 样本用于训练,47k 样本用于测试 10 种不同的配置。

我一般都是用Libsvm的脚本easy.py对数据进行分类,但是时间太长了,等了3个多小时都没结果,还是要再重复这个过程 9 次!

有人知道如何在处理大量数据时更快地使用 libsvm 吗? C++ Libsvm 函数比 python 函数运行得更快吗?

【问题讨论】:

【参考方案1】:

LibSVM 的训练算法无法扩展到此类数据集;在最坏的情况下需要 O(n³) 时间,而在典型情况下需要 O(n²) 左右。首先要尝试正确扩展数据集;如果还是不行,切换到

使用例如Liblinear、Vowpal Wabbit 或Wapiti 的线性SVM(或逻辑回归) 更可扩展的内核 SVM 实现,例如LaSVM

【讨论】:

感谢您的回答,但是如果我使用带有线性内核的 libsvm(例如带有参数 t 0 的 -svmtrain),我使用的是线性 svm,因此运行时间会很短吗? @mad:不。您将使用相同的、缓慢的 SMO 算法。这就是 LibSVM 的作者发布 Liblinear 的原因,它可以(几乎)用坐标下降算法拟合相同类型的模型。【参考方案2】:

正如 larsmans 所提到的,libsvm 可能无法很好地扩展,具体取决于数据的维度和数据点的数量。

C 实现可能会运行得更快一些,但不会有显着差异。您有几个可用的选项。

您可以随机抽样数据以处理其中的一小部分。 您可以使用 PCA 之类的方式将数据投影到较低维度 根据您的数据类型,您可以查看不同的内核。直方图交叉核是否适用于您的数据?当您真的只需要线性决策函数时,您是否使用 RBF 内核?

希望这会有所帮助!机器学习中最棘手的问题之一是处理有时需要的纯数据量。

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于libsvm 中的大型训练和测试数据的主要内容,如果未能解决你的问题,请参考以下文章

Matlab 中的 Libsvm 回归预测测试集实例的相同值

如何通过 LIBSVM 使用 platt 缩放和交叉验证?

为啥 LibSvm 准确率不超过 50%?

我们是不是需要将数据集划分为测试和训练?

libsvm 训练后的模型参数讲解(转)

使用 LIBSVM 进行测试