最快的 SVM 实施

机器算法验证 机器学习 支持向量机 预测模型 scikit-学习 内核技巧
2022-01-25 00:58:00

更多的是一般性问题。我正在运行一个用于预测建模的 rbf SVM。我认为我目前的程序肯定需要一点加速。我使用 scikit learn 进行粗到细的网格搜索 + 交叉验证。

每次 SVM 运行大约需要一分钟,但在所有迭代中,我仍然觉得它太慢了。假设我最终将交叉验证部分多线程化到多个内核上,有什么建议可以加快我的程序吗?SVM 有更快的实现吗?我听说过一些 GPU SVM,但没有深入研究。任何用户,它更快吗?

4个回答

Google 的Sofia 算法包含一个非常快速的线性 SVM 实现。它是目前最快的 SVM 之一,但我认为它只支持分类,并且只支持线性 SVM。

甚至还有一个R 包

您将获得的最简单的加速是并行运行交叉验证。就个人而言,我喜欢R中的caret,它使用foreach作为后端。它使得将交叉验证和网格搜索扩展到多核或多台机器变得非常容易。

Caret 可以处理许多不同的模型,包括 rbf SVM:

library(caret)
library(doMC)
registerDoMC()
model <-  train(Species ~ ., data = iris, method="svmRadial", 
    trControl=trainControl(method='cv', number=10))
> confusionMatrix(model)
Cross-Validated (10 fold) Confusion Matrix 

(entries are percentages of table totals)

            Reference
Prediction   setosa versicolor virginica
  setosa       32.4        0.0       0.0
  versicolor    0.0       30.9       2.0
  virginica     0.9        2.4      31.3

请注意,doMC() 库仅在 mac 和 linux 上可用,它应该从命令行运行,而不是从 GUI 运行,它会破坏 RWeka 的任何模型。使用MPISNOW集群作为并行后端也很容易,它们没有这些问题。

我意识到这是一个相当古老的问题,但也可以(取决于数据集的大小,它可能或多或少有效)使用内核特征图的低维近似值,然后在线性 SVM 中使用它。http://scikit-learn.org/stable/modules/kernel_approximation.html

看看 Python 的多处理模块。它使并行​​化事情变得非常容易,并且非常适合交叉验证。