4

我正在使用 scikit-learn SVC 对一些数据进行分类。我想提高训练成绩。

clf = svm.SVC(缓存大小=4000,概率=真,详细=真)

由于 sckikit-learn 与 libsvm 和 libsvm 的接口使用 OpenMp,我希望:

导出 OMP_NUM_THREADS=16

将在多个内核上运行。不幸的是,这没有帮助。

有任何想法吗?

谢谢

4

3 回答 3

8

scikit-learn 中的 libsvm 当前绑定不支持 OpenMP。但是,如果您遇到性能问题,您很可能sklearn.svm.SVC应该使用更具可扩展性的模型。

如果您的数据是高维的,它可能是线性可分的。在这种情况下,建议首先尝试更简单的模型,例如朴素贝叶斯模型或sklearn.linear_model.Perceptron已知的训练速度非常快的模型。您也可以尝试使用它来实现sklearn.linear_model.LogisticRegression,这比 scikit-learn 中的其他线性模型更具可扩展性,尽管内存效率更低。sklearn.svm.LinearSVCliblinearlibsvm

如果您的数据不是线性可分的,您可以尝试sklearn.ensemble.ExtraTreesClassifier(调整n_estimators参数以权衡训练速度与预测准确性)。

或者,您可以尝试使用RBFSamplerscikit-learn 的转换器来近似 RBF 内核 + 在输出上拟合线性模型:

http://scikit-learn.org/dev/modules/kernel_approximation.html

于 2012-11-07T17:47:36.810 回答
2

如果您在 scikit-learn 中使用交叉验证或网格搜索,那么您可以使用带有 n_jobs 参数的多个 CPU:

GridSearchCV(..., n_jobs=-1)
cross_val_score(..., n_jobs=-1)

请注意,cross_val_score 每个 forld 只需要一个作业,因此如果您的折叠次数少于您的 CPU,您仍然不会使用所有的处理能力。

LibSVM 可以使用 OpenMP,如果您可以按照 LibSVM FAQ 中的说明直接编译和使用它。因此,您可以以 LibSVM 格式导出您的缩放数据(这是一个关于如何做到这一点的StackOverflow 问题)并直接使用 LibSVM 来训练您的数据。但这只有在您进行网格搜索或想知道准确度分数时才有用,据我所知,LibSVM 创建的模型不能在 scikit-learn 中使用。

还有一个LibSVM 的 GPU 加速版本,我尝试过它并且速度非常快,但不是基于当前的 LibSVM 版本。我已经和开发人员谈过了,他们说他们希望尽快发布一个新版本。

于 2014-11-19T22:43:50.287 回答
2

虽然这个帖子已经有一年多了,但我认为值得回答。

我在 scikit-learn 上为 libsvm 和 liblinear (linearSVC) 编写了 openmp 支持补丁,可在此处获取 - https://github.com/fidlr/sklearn-openmp

它基于 libsvm 关于如何添加 OpenMP 支持的常见问题解答以及 liblinear 的多核实现。

只需克隆 repo 并运行 sklearn-build-openmp.sh 以应用补丁并构建它。

时间OMP_NUM_THREADS=4 python plot_permutation_test_for_classification.py

  • 具有线性内核时序的 svmlib 下降了 2.3 倍
  • RBF 内核 - 相同。
  • 带有 4 个线程的 Liblinear 被 x1.6 删除

可以在此处找到有关和使用信息的详细信息 - http://fidlr.org/post/137303264732/scikit-learn-017-with-libsvm-openmp-support

于 2016-01-15T21:52:32.567 回答