Python中可用的最快SVM实现

34 投票
10 回答
33578 浏览
提问于 2025-04-17 13:06

我正在用Python构建一些预测模型,使用的是scikit-learn中的支持向量机(SVM)实现。这个工具真的很好用,操作简单,而且速度也比较快。

不过,最近我发现运行时间有点不够用了。我在一个大约有4000到5000个样本、650个特征的数据集上运行rbf SVM,每次运行大约需要一分钟。但是,当我进行5折交叉验证和网格搜索(从粗到细的搜索)时,这样的速度就有点不够用了。所以,大家有没有推荐的在Python中可以用的最快的SVM实现?或者有什么方法可以加快我的建模速度?

我听说过LIBSVM的GPU实现,感觉这个可能会有效果。我不知道Python中还有没有其他可以用的GPU SVM实现,但我很乐意了解更多。此外,使用GPU会显著提高运行速度吗?

我还听说可以通过在scikit-learn中使用线性SVM加上特征映射来近似rbf SVM。我不太确定大家对这种方法的看法。有没有人用过这种方法?它的运行时间会显著增加吗?

任何提高程序速度的想法都非常欢迎。

10 个回答

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的示例部分找到如何使用它们的例子。

24

另外,你可以在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来并行运行每个交叉验证的拟合。这是利用多进程,所以Python的全局解释器锁(GIL)就不是问题了。

31

我知道的最具可扩展性的核支持向量机(SVM)实现是 LaSVM。它是用C语言写的,所以如果你了解 Cythonctypescffi,就可以在Python中使用它。或者,你也可以通过命令行来使用它。你可以利用 sklearn.datasets 中的工具,将数据从 NumPy 或 CSR 格式转换成 LaSVM 可以使用的 svmlight 格式文件,这些文件可以用作训练集或测试集。

撰写回答