Python scikit学习OpenMP libsvm

Python scikit学习OpenMP libsvm,python,openmp,libsvm,scikit-learn,Python,Openmp,Libsvm,Scikit Learn,我正在使用scikit learn SVC对一些数据进行分类。我想提高训练成绩 clf=svm.SVC(cache_size=4000,probability=True,verbose=True) 由于sckikit学习与libsvm的接口,并且libsvm使用OpenMp,我希望: 导出OMP_NUM_线程=16 将在多个内核上运行。 不幸的是,这没有帮助 有什么想法吗 谢谢在scikit learn中当前的libsvm绑定中没有OpenMP支持。但是,如果您在sklearn.svm.SVC方

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

clf=svm.SVC(cache_size=4000,probability=True,verbose=True)

由于sckikit学习与libsvm的接口,并且libsvm使用OpenMp,我希望:

导出OMP_NUM_线程=16

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

有什么想法吗


谢谢

在scikit learn中当前的libsvm绑定中没有OpenMP支持。但是,如果您在
sklearn.svm.SVC
方面存在性能问题,则很可能应该使用更具可伸缩性的模型

如果您的数据是高维的,那么它可能是线性可分离的。在这种情况下,建议首先尝试更简单的模型,如NaiveBayes模型或
sklearn.linear_模型.Perceptron
,这些模型已知训练速度非常快。您还可以尝试使用
liblinear
实现的
sklearn.linear\u model.LogisticRegression
sklearn.svm.LinearSVC
这两种方法都使用
liblinear
实现,这两种方法比
libsvm
更具可扩展性,尽管比scikit learn中的其他线性模型内存效率更低

如果您的数据不是线性可分的,您可以尝试
sklearn.essemble.extratreeClassifier
(调整
n\u估计器
参数,以权衡训练速度和预测精度)

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


如果您在scikit learn中使用交叉验证或网格搜索,则可以使用多个CPU和n_jobs参数:

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

LibSVM可以使用OpenMP,前提是您可以编译OpenMP,并根据需要直接使用它。因此,您可以将缩放后的数据导出为LibSVM格式(这里有一个关于如何实现的示例),并直接使用LibSVM来训练数据。但这只有在您正在进行网格搜索或想要知道准确度分数时才有好处,据我所知,LibSVM创建的模型不能用于scikit learn


还有一个我已经尝试过的非常快的方法,但它不是基于当前的LibSVM版本。我已经和开发者谈过了,他们说他们希望很快发布一个新版本

虽然这篇文章已经有一年多的历史了,但我认为它值得回答

我在scikit learn上为openmp支持编写了一个补丁,用于libsvm和liblinear(linearSVC),可以在这里找到

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

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

Timing
OMP\u NUM\u THREADS=4 python plot\u permutation\u test\u for\u classification.py

  • svmlib的线性核定时下降了2.3倍
  • RBF核-相同
  • Liblinear,4个线程下降x1.6
有关详细信息和使用信息,请参见此处-

您确定它使用OpenMP还是可能使用OpenMP(但未编译)?我不确定scikit learn是否针对OpenMP编译。建议不要我在源代码中没有看到任何OpenMP
pragma
指令。只有
libsvm
包装似乎包含
omp.h
,但这看起来更像是模板代码,因为根本没有使用OpenMP。libsvm(3.1版)不使用OpenMP-它只建议如何支持OpenMP(请参阅常见问题解答和搜索“pragma-omp”)。谢谢。我的数据只有3个特征。22万个样本和3个目标。libsvm在较小的样本(30k)上运行良好。由于数据不是线性可分的,我最终使用了一个具有n_任务的随机林。libsvm的优化器的复杂性介于
n_样本^2
n_样本^3
之间,因此在实践中无法扩展到超过10k个样本。随机林和极端随机树(这是一种随机林变体,通常会产生稍好的结果)只要数据适合内存,就更具可伸缩性(用于scikit学习).更大的问题通常需要核心外/流式非线性特征提取,然后是线性模型增量更新,可能使用多台机器的平均值。也可以在单独的机器上并行地在数据集的随机子样本上训练树,并将树聚合为单个随机森林模型(装袋)。但这尚未在scikit learn中实现。@fidlr我已经安装了您的修补程序,我已经创建了一个python3虚拟环境,并尝试在此环境中安装您的scikit learn修补程序。然而,我得到了一个错误:`来自。导入libsvm,liblinear ImportError:/home/es/my env/lib/python3.6/site-packages/sklearn/svm/liblinear.cpython-36m-x86_64-linux-gnu.so:未定义符号:daxpy `。你能告诉我这是什么吗?