SVM实现,scikit-learn减少运行时间,最快的SVM
我正在使用scikit-learn来构建一些基于支持向量机(SVM)的预测模型。我有一个大约5000个样本和700个特征的数据集。我在训练集上进行了5折交叉验证,并在18x17的参数网格上进行搜索,然后用最佳参数在测试集上进行测试。结果运行的时间比我预期的要长很多,我注意到了以下几点:
1) 有些单独的SVM训练过程似乎只需要一分钟,而其他的可能需要长达15分钟。这是因为不同的数据和参数(C和gamma,我使用的是rbf
核)导致的吗?
2) 我试着在Windows上使用64位的Python,以便利用更多的内存,但在任务管理器中,我所有的Python进程似乎都限制在1GB,我不知道这是否与运行时间有关。
3) 我之前使用的是32位的Python,运行的也是差不多的数据集,我记得(虽然没有保存结果)速度快了很多。我使用的是一个第三方的64位Windows版scikit-learn,所以我不确定用32位的Python会不会更好?(来源 http://www.lfd.uci.edu/~gohlke/pythonlibs/)
如果有任何建议可以帮助我减少运行时间,我将非常感激。我想减少网格搜索的搜索空间会有帮助,但由于我对最佳参数的范围还不确定,我希望尽可能保持搜索空间大一些。如果有更快的SVM实现,也请告诉我,我可能会尝试那些。
补充:我回去又试了一下32位版本。出乎意料的是,它快了很多。用32位版本花了大约3小时,而64位版本花了16小时才达到同样的进度。为什么会有这么大的差异呢?
3 个回答
SGD(随机梯度下降)运行得非常快,但有几点需要注意:
1) 它只适用于线性模型,不支持径向基函数(rbf)模型;
2) 有些参数,比如alpha和eta0,我对怎么调整这些参数完全没有头绪,这个问题可以请教专家O. Grisel。
关于32位和64位的Python(使用什么硬件,什么版本的Python?),我也不太清楚,但这可能值得在StackOverflow上提问,因为应该有一些基准测试工具可以参考。
你能看到CPU使用率超过90%吗?有没有统计垃圾回收的次数?
如果你有这个条件,可以考虑使用LinearSVC。基于libsvm的支持向量机(SVC)的训练复杂度在 O(n_features * n_samples^2)
和 O(n_features * n_samples^3)
之间,而LinearSVC(基于liblinear)的训练复杂度是 O(n_features*n_samples)
,测试复杂度是 O(n_features)
。
1) 这是正常的:小的gamma值和小的正则化会选择更多的支持向量,因此模型会变得更复杂,训练的时间也会更长。
2) 有一个叫做cache_size
的参数,它会传递给底层的libsvm库。不过,根据你的数据,libsvm可能会使用或不使用所有可用的缓存。
3) 不太清楚。如果你在两个平台上做了更多的时间实验,请把你的发现报告到项目的邮件列表上。这可能值得进一步研究。
首先检查一下你的特征是否进行了归一化处理(比如说,去掉均值并根据方差缩放特征,如果你的数据是一个密集的numpy数组)。对于稀疏数据,只需缩放特征(或者对文本数据使用TF-IDF转换)。可以查看文档中的预处理部分。
然后你可以先从一个粗略的网格开始(用较大的对数步长),比如说一个3x3的网格,然后再在有趣的区域重新运行一个3x3的网格。一般来说,C和gamma的SVM参数网格是相当平滑的。