5

我正在与 scikit-learn 一起使用 SVM 构建一些预测模型。我有一个包含大约 5000 个示例和大约 700 个特征的数据集。我在训练集上使用 18x17 网格搜索进行 5 折交叉验证,然后使用测试集的最佳参数。运行时间比我预期的要长得多,我注意到以下几点:

1) 一些单独的 SVM 训练迭代似乎只需要一分钟,而另一些则可能需要长达 15 分钟。这是否预期具有不同的数据和参数(C 和 gamma,我正在使用rbf内核)?

2)我正在尝试在 Windows 上使用 64 位 python 来利用额外的内存,但是我的所有 python 进程似乎在我的任务管理器中都达到了 1 gig,我不知道这是否与运行。

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

任何关于如何减少运行时间的建议将不胜感激。我想减少我的网格搜索的搜索空间会有所帮助,但由于我甚至不确定最佳参数的范围,我想尽可能地保持它的大小。如果还有更快的 SVM 实现,请告诉我,我可能会尝试这些。

附录:我回去尝试再次运行 32 位版本。由于某种原因,它要快得多。64位版本用了16个小时,大概花了3个小时。为什么会有这样的差异?

4

3 回答 3

7

1)这是意料之中的:小伽玛和小正则化将选择更多的支持向量,因此模型将更复杂且拟合时间更长。

2) 有一个cache_size参数将被传递给底层的 libsvm 库。但是,根据您的数据,libsvm 可能会也可能不会使用所有可用的缓存。

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

首先检查您是否对特征进行了归一化(例如,如果您的数据是密集的 numpy 数组,则通过方差删除均值和尺度特征)。对于稀疏数据,只需缩放特征(例如,对文本数据使用 TF-IDF 转换)。请参阅文档的预处理部分

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

于 2012-02-07T09:43:11.080 回答
4

如果您负担得起,请考虑使用 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)测试复杂度。

于 2012-02-08T17:53:50.537 回答
3

SGD 非常快,但 1) 仅线性,而不是 rbf,2) 参数 alpha eta0 ...我不知道如何改变:交给专家 O. Grisel。

在 32 位与 64 位 python(什么硬件,什么 py 版本?)上,我不知道,但这可能值得一个关于 SO 的一般性问题——必须有基准套件。你能看到 CPU 使用率 > 90%,计算垃圾收集吗?

于 2012-02-08T17:20:58.897 回答