SVM实现、scikits学习时间减少、最快的SVM

5
我正在使用scikit-learn构建一些基于SVM的预测模型。我的数据集大约有5000个样本和700个特征。我使用5倍交叉验证,在我的训练集上进行18x17网格搜索,然后使用最佳参数在测试集上进行测试。这些运行时间比我预期的要长得多,我注意到以下几点:
1)一些单独的SVM训练迭代似乎只需要一分钟,而其他一些则需要长达15分钟。这是否符合预期,取决于不同的数据和参数(C和gamma,我正在使用rbf内核)?
2)我试图在Windows上使用64位Python来利用额外的内存,但是我的所有Python进程似乎都在任务管理器中达到了1 GB的上限,我不知道这是否与运行时有任何关系。

3) 我之前使用的是32位,运行的数据集差不多一样,我记得(虽然没有保存结果)速度要快很多。我在64位Windows上使用了第三方构建的scikit-learn,所以我不知道在32位python上尝试是否更好?(来源 http://www.lfd.uci.edu/~gohlke/pythonlibs/)

请问有什么建议可以减少运行时间吗?我想缩小网格搜索的搜索空间,但是我不确定最佳参数的范围,所以我想保持它尽可能大。如果有更快的SVM实现,请告诉我,我可能会尝试这些。

补充说明:我回去再次尝试运行32位版本。由于某种原因,它运行得快得多。它花了约3个小时才到64位版本在16个小时内达到的位置。为什么会有这样的差异?

3个回答

7

1) 预计会发生这种情况:小的gamma和小的正则化会选择更多的支持向量,因此模型会更加复杂并需要更长的时间来拟合。

2) 有一个cache_size参数会传递给底层的libsvm库。然而,根据你的数据,libsvm可能会使用所有可用的缓存,也可能不会使用。

3) 不知道。如果你在两个平台上运行更多的定时实验,请在项目邮件列表上报告你的发现。这可能需要进一步调查。

首先,请检查是否对特征进行了归一化(例如,如果你的数据是密集的numpy数组,则删除均值并按方差缩放特征)。对于稀疏数据,只需缩放特征(或对文本数据使用TF-IDF变换)。请参见文档中的预处理部分

然后��你应该从一个粗略的网格开始(具有大的对数步骤),比如一个3x3的网格,然后通过重新运行该区域上的3x3网格来关注有趣的区域。通常C x gamma SVM参数网格是非常平滑的


感谢ogrissel的回答,它们非常有道理。我也不确定32位与64位的问题,但如果有机会,我会尝试进行更多的计时运行。我的数据已经预处理(归一化为0-1),并且我将scikits的cache_size增加到了4000(可能过度了)。我一定会修改我的代码,使其从粗网格到较小的区域,这肯定会加快我的代码速度。再次感谢。 - tomas
@OGrisel,如何使用粗略-细化网格搜索器? - denis
我猜还有一个问题,如果你正在进行交叉验证+网格搜索,如何使用粗略和细致的网格搜索?当您尝试在多个交叉验证运行中进行平均或其他操作时,如果您使用粗略然后再进行细致的搜索,搜索空间将无法匹配。我相信有一种好的方法,但我不知道/错过了。 - tomas
是的,我明白,但在交叉验证时,您将运行网格搜索五次。更精细的5x5搜索空间可能对每个交叉验证都不同。如何平均适合交叉验证运行以找到最佳测试集参数? - tomas
“could be different”:那就不要这样做。最初的5x5粗网格-> ncross不同的C,gamma-> 一个 3x3子网格-> 一个 说5x5更细的网格... - denis

4
如果您有能力负担这样的计算复杂度,考虑使用LinearSVC:基于libsvm的SVC具有介于O(n_features * n_samples ^ 2)和O(n_features * n_samples ^ 3)之间的训练复杂度,而基于liblinear的LinearSVC则具有O(n_features * n_samples)的训练复杂性和O(n_features)的测试复杂性。

在实践中,SGDClassifier 在 scikit-learn 中拟合线性 SVM 模型的速度甚至更快。而且我们还没有实现平均 :) - ogrisel
我们可以要求LinearSVC输出概率吗?它没有像SVC那样控制输出是否为概率的参数。人们通常采取什么措施解决这个问题? - GabrielChu

3

SGD非常快,但 1)只能使用线性,不能使用rbf, 2)参数alpha eta0 ...我不知道如何变化: 请咨询专家O. Grisel。

关于32位与64位的Python(使用什么硬件,什么版本的Python?), 我不清楚,但这可能值得在SO上提出一个普遍问题 - 一定有基准测试套件。 您能看到CPU使用率> 90%,计算垃圾回收次数吗?


1
可以使用显式特征映射和线性分类器(如SGDClassifier)来以可扩展的方式逼近非线性RBF核。 - ogrisel
我从来没有尝试过调整eta0(也许我应该尝试一下)。对于alpha,我只是像在LinearSVC中为C所做的那样使用GridSearchCV - ogrisel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接