在Python中可用的最快SVM实现

在Python中可用的最快SVM实现,python,machine-learning,gpu,svm,scikit-learn,Python,Machine Learning,Gpu,Svm,Scikit Learn,我正在用Python构建一些预测模型,并一直在使用scikits learn的SVM实现。它真的很棒,易于使用,而且速度相对较快 不幸的是,我开始受到运行时的限制。我在一个完整的数据集上运行了一个rbf支持向量机,该数据集大约有4-5000个,包含650个特征。每次跑步大约需要一分钟。但是,使用5倍交叉验证+网格搜索(使用从粗到精的搜索),这对于我手头的任务来说有点不可行。那么,一般来说,人们对Python中最快的SVM实现有什么建议吗?或者有什么方法可以加快我的建模速度 我听说过LIBSVM的

我正在用Python构建一些预测模型,并一直在使用scikits learn的SVM实现。它真的很棒,易于使用,而且速度相对较快

不幸的是,我开始受到运行时的限制。我在一个完整的数据集上运行了一个rbf支持向量机,该数据集大约有4-5000个,包含650个特征。每次跑步大约需要一分钟。但是,使用5倍交叉验证+网格搜索(使用从粗到精的搜索),这对于我手头的任务来说有点不可行。那么,一般来说,人们对Python中最快的SVM实现有什么建议吗?或者有什么方法可以加快我的建模速度

我听说过LIBSVM的GPU实现,它似乎可以工作。我不知道有任何其他GPU SVM实现可以在Python中使用,但它肯定会对其他人开放。此外,使用GPU是否会显著增加运行时间

我还听说有一些方法可以通过使用scikits中的线性SVM+特征映射来近似rbf SVM。不确定人们对这种方法的看法。再说一次,任何使用这种方法的人,运行时间是否显著增加


所有提高程序速度的想法都是非常受欢迎的。

不必详细比较SVM库,我认为您描述的任务(交叉验证)可以从真正的多线程(即并行运行多个CPU)中获益。如果您正在使用,它不会利用您(可能)的多核机器,因为


您可以尝试其他没有此限制的Python实现。查看或是否愿意访问.NET。

或者,您可以对1000个随机样本而不是完整的数据集运行网格搜索:

>>> from sklearn.cross_validation import ShuffleSplit
>>> cv = ShuffleSplit(3, test_fraction=0.2, train_fraction=0.2, random_state=0)
>>> gs = GridSeachCV(clf, params_grid, cv=cv, n_jobs=-1, verbose=2)
>>> gs.fit(X, y)
5000个样本的最佳参数很可能与1000个样本的最佳参数非常接近。因此,这是开始粗网格搜索的好方法


n_jobs=-1
使您可以使用所有CPU并行运行单个CV拟合。它使用mulitprocessing,因此python GIL不是问题。

我所知道的最具可伸缩性的内核SVM实现是。它是用C编写的,因此可以用Python进行包装,如果您知道的话,或者。或者,您可以从命令行使用它。您可以使用
sklearn.datasets
中的实用程序将数据从a或CSR格式加载到svmlight格式的文件中,LaSVM可以将其用作训练/测试集。

首先,根据scikit learn的benchmark(),scikit learn已经是最快(如果不是最快的话)的SVM包之一。因此,你可能想考虑其他加速训练的方法。 正如bavaza所建议的,您可以尝试对培训过程进行多线程处理。如果您使用的是Scikit learn的GridSearchCV类,则可以轻松地将n_jobs参数设置为大于默认值1,以并行执行训练,同时牺牲更多内存。 您可以在文档中找到如何使用该类的示例

或者,您可以看看幕府机器学习库

Shogun是为大规模机器学习而设计的,它对许多常见的svm包进行了包装,并在C/C++中通过python绑定实现。根据上述Scikit learn的基准测试,它的速度与Scikit learn相当。在其他任务上(他们演示的任务除外),它可能会更快,因此值得一试


最后,您可以尝试执行降维,例如使用PCA或随机PCA来降维特征向量。这将加快培训进程。相关类的文档可在以下2个链接中找到:。您可以在Scikit learn的示例部分找到如何使用它们的示例。

如果您只想使用RBF内核(或任何其他二次内核),那么我建议在或上使用LIBSVM。我在大约6秒内训练了一个包含7000个观测值和500个特征的模型

诀窍是使用LIBSVM提供的预计算内核,并使用一些矩阵代数一步计算内核,而不是两次删除数据。构建内核大约需要两秒钟,而使用LIBSVM自己的RBF内核则需要更多时间。我想您可以使用Python实现这一点,但我不确定,因为我还没有尝试过。

试试

这是一个邪恶的快速C实现,它有很好的Python绑定,你可以用<代码> PIP安装PysMiLase来安装它。

< P>我会考虑使用A来减少你输入的特征的数量。
ExtraTreesRegressor和ExtraTreesClassifier提供了一个选项来生成特征重要性。然后,您可以使用此信息将功能子集输入到您的SVM中。

我建议查看Scikit Learn的实现。默认的铰链损耗是线性SVM。我发现它的速度非常快。

如果您的问题在两个类中,那么将基于CUDA的SVM与scikit learn结合起来非常有用:


我想你可以试试使用GPU的方法。

谢谢bavaza,我会看看的。假设我真的利用了我的多核计算机,还有其他关于加速我的程序的建议吗?我想找出一种跨多个线程交叉验证的方法。然而,我认为我仍然需要加快速度。@bavaza,我已经在多核中运行Python很多年了,它运行得非常好。请研究标准CPython的多处理库。@V3ss0n,谢谢。看起来像一个不错的图书馆。由于PyPy使用进程而不是线程,您是否熟悉任何上下文切换惩罚(例如,在使用大型工作池时)?PyPy也有一个GIL(即使他们有一个实验项目来实现备用内存管理策略);正如一些人所说,要避免GIL,最简单的方法仍然是多处理,而不是使用线程。我真的不确定使用IronPython是否会提供更好的性能(wi)