SVM implmentation,scikits学习减少运行时间,最快的svm

时间:2012-02-06 16:23:51

标签: python runtime svm scikits scikit-learn

我正在使用scikit-learn使用SVM构建一些预测模型。我有一个包含大约5000个示例和大约700个功能的数据集。我在我的训练集上使用18x17网格搜索进行5次交叉验证,然后使用我的测试集的最佳参数。这些运行时间比我预期的要长很多,我注意到以下几点:

1)一些单独的SVM训练迭代似乎只需要一分钟,而其他人可能需要长达15分钟。预计会有不同的数据和参数(C和gamma,我正在使用rbf内核)吗?

2)我正在尝试在Windows上使用64位python来利用额外的内存,但是我的任务管理器中所有的python进程似乎都是1 gig,我不知道是否有任何内容做运行时。

3)我之前使用32位并在大约相同的数据集上运行,我记得(虽然我没有保存结果)但速度要快得多。我使用第三方构建的scikit-learn用于64位窗口,所以我不知道在32位python上尝试这个是否更好? (来源http://www.lfd.uci.edu/~gohlke/pythonlibs/

我将非常感谢有关如何减少运行时间的任何建议。我想减少网格搜索的搜索空间会有所帮助,但由于我不确定最佳参数的范围,我想保持它尽可能大。如果还有更快的SVM实现,请告诉我,我可以试试。

附录:我回去试图再次运行32位版本。由于某种原因,速度要快得多。花了大约3个小时到达64位版本在16小时内到达的地方。为什么会有这样的差异?

3 个答案:

答案 0 :(得分:6)

1)这是预期的:小伽马和小正则化将选择更多的支持向量,因此模型将更复杂,更长适合。

2)有一个cache_size参数将传递给底层的libsvm库。但是,根据您的数据,libsvm可能会也可能不会使用所有可用的缓存。

3)不知道。我在两个平台上运行更多定时实验,请在项目邮件列表上报告您的发现。这可能值得进一步调查。

首先检查您是否规范了您的功能(例如,如果您的数据是密集的numpy数组,则通过方差删除均值和比例功能)。对于稀疏数据,只需缩放功能(例如,对文本数据使用TF-IDF变换)。请参阅文档的preprocessing section

然后你应该从粗网格开始(具有大的对数步长),比如一个3x3网格,然后通过在该区域重新运行3x3网格来关注有趣区域。通常,C x gamma SVM参数网格为quite smooth

答案 1 :(得分:4)

如果您能负担得起,请考虑使用LinearSVC:基于libsvm的SVC在O(n_features * n_samples^2)O(n_features * n_samples^3)之间具有训练复杂性,而LinearSVC(基于liblinear)具有O(n_features*n_samples)训练复杂度{ {1}}测试复杂性。

答案 2 :(得分:3)

SGD 非常快,但是 1)仅线性,而不是rbf, 2)参数alpha eta0 ...我不知道如何改变: 对于专家,O。Grisel。

32对64位python(什么硬件,什么py版本?), 我不知道,但这可能值得一个关于SO的一般性问题 - 必须有基准套件。 你能看到CPU使用率> 90%,计算垃圾收集?