可用于Python的最快SVM实现

tom*_*mas 34 python gpu machine-learning svm scikit-learn

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

不幸的是,我开始受到运行时的限制.我在一个大约4 - 5000的完整数据集上运行一个rbf SVM,具有650个功能.每次运行大约需要一分钟.但是通过5倍交叉验证+网格搜索(使用粗到细搜索),对于我手头的任务来说,它有点不可行.那么一般来说,人们对可以在Python中使用的最快SVM实现方面有什么建议吗?那或者任何加速我建模的方法?

我听说过LIBSVM的GPU实现,看起来它可以工作.我不知道Python中可用的任何其他GPU SVM实现,但它肯定会对其他人开放.此外,使用GPU会显着增加运行时间吗?

我还听说有一些方法可以通过在scikits中使用线性SVM +特征映射来近似rbf SVM.不确定人们对这种方法的看法.同样,使用这种方法的任何人都是运行时间的显着增加吗?

提高程序速度的所有想法都是最受欢迎的.

ogr*_*sel 29

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

  • @thomas如果您的样本不是(松散地)[iid](http://en.wikipedia.org/wiki/Independent_and_identically_distributed_random_variables),那么带有通用内核(如RBF)的SVM很可能无法产生良好的结果.如果您有时间序列数据(连续测量之间存在时间依赖性),您应该提取更高级别的功能(例如滑动窗口上的卷积或[STFT](http://en.wikipedia.org/wiki/Short-time_Fourier_transform))或预先计算时间序列专用内核. (3认同)
  • 如果样本间时间依赖性阻止您进行任意子采样和交叉验证,我不会看到SVM RBF模型如何能够学习一般性的东西:模型对每个样本进行预测.时间,独立于过去的预测(没有记忆)因此输入要素应该编码某种高级"上下文",如果你想要它足够概括以对以前看不见的数据做出有趣的预测. (2认同)

ogr*_*sel 23

或者,您可以在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)
Run Code Online (Sandbox Code Playgroud)

5000个样本的最佳参数很可能非常接近1000个样本的最佳参数.这是开始粗网格搜索的好方法.

n_jobs=-1使您可以使用所有CPU并行运行单个CV适配.它正在使用多处理,因此python GIL不是问题.


lig*_*ist 8

首先,根据scikit-learn的基准(这里),scikit-learn已经是最快但速度最快的SVM软件包之一.因此,您可能需要考虑其他加速培训的方法.

正如bavaza所建议的那样,您可以尝试多线程培训过程.如果您使用的是Scikit-learn的GridSearchCV类,则可以轻松地将n_jobs参数设置为大于默认值1,以便以使用更多内存为代价并行执行训练.你可以找到它的文档在这里可以找到如何使用类的一个示例在这里

或者,您可以在这里查看Shogun机器学习库

Shogun专为大规模机器学习而设计,包含许多常见的svm包,它是用C/C++实现的,带有python绑定.根据上面的Scikit-learn的基准测试,它的速度可与scikit-learn相媲美.在其他任务(除了他们演示的任务)之外,它可能会更快,因此值得一试.

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