更多的是一般性问题。我正在运行一个用于预测建模的 rbf SVM。我认为我目前的程序肯定需要一点加速。我使用 scikit learn 进行粗到细的网格搜索 + 交叉验证。
每次 SVM 运行大约需要一分钟,但在所有迭代中,我仍然觉得它太慢了。假设我最终将交叉验证部分多线程化到多个内核上,有什么建议可以加快我的程序吗?SVM 有更快的实现吗?我听说过一些 GPU SVM,但没有深入研究。任何用户,它更快吗?
更多的是一般性问题。我正在运行一个用于预测建模的 rbf SVM。我认为我目前的程序肯定需要一点加速。我使用 scikit learn 进行粗到细的网格搜索 + 交叉验证。
每次 SVM 运行大约需要一分钟,但在所有迭代中,我仍然觉得它太慢了。假设我最终将交叉验证部分多线程化到多个内核上,有什么建议可以加快我的程序吗?SVM 有更快的实现吗?我听说过一些 GPU SVM,但没有深入研究。任何用户,它更快吗?
您将获得的最简单的加速是并行运行交叉验证。就个人而言,我喜欢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 的任何模型。使用MPI或SNOW集群作为并行后端也很容易,它们没有这些问题。
我意识到这是一个相当古老的问题,但也可以(取决于数据集的大小,它可能或多或少有效)使用内核特征图的低维近似值,然后在线性 SVM 中使用它。见http://scikit-learn.org/stable/modules/kernel_approximation.html
看看 Python 的多处理模块。它使并行化事情变得非常容易,并且非常适合交叉验证。