用于 SVM 参数估计的网格搜索

机器算法验证 支持向量机
2022-03-17 12:32:53

我目前正在尝试使用 gridsearch 来训练支持向量机。我知道,如果我有参数 gamma 和 C,R 函数 tune.svm 会对这两个参数的所有组合执行 10 倍交叉验证。

因为我不知道如何开始,所以我试图获取一些关于它的信息,例如wikipedia 2建议的值不是线性的,例如 {10、100、1000} 范围内的 C。

到目前为止,我使用了我的第二个维基百科链接中的示例,即:

gammas = 2^(-15:3)
costs = 2^(-5:15)

结果是 399 种组合。

这需要非常非常长的时间(约 2000 个样本)。例如,对于内核“径向”,我最好的结果是 gamma = 0.5 和 cost = 2。

如果我只使用 (1, 2, 3, 4, ... 10) 之类的值作为成本,使用 (0, 0.5, 1, 1.5, 2) 作为伽马值,我不能得到相同的结果吗?我知道这个例子是构造的,因为我已经知道结果。

我的问题:

但为什么会出现这种指数规模?

0 和 1 之间的值太多了,我认为这是在浪费计算时间,而且只有很少的非常大的数字,以至于无论如何都找不到非常精确的结果。如果用它来寻找更小的范围,这对我来说才有意义,假设我们知道最好的成本是 2^3,然后我们围绕它进行搜索。但是没有任何地方提到以这种方式执行。

2个回答

指数网格的原因是 C 和 gamma 都是乘法作用的尺度参数,因此将 gamma 加倍可能与将其减半一样大(但在另一个方向上)。这意味着,如果我们使用近似指数增加值的网格,则通过在每个网格点评估模型选择标准获得的超参数的“信息”量大致相同。

我通常在基于 2 的整数幂的网格上进行搜索,这似乎效果很好(我正在写一篇关于优化网格搜索的论文——如果你使用太细的网格,你最终可能会过度拟合模型选择标准,所以一个相当粗糙的网格被证明有利于泛化和计算开销。)。

至于大范围,不幸的是,最佳超参数值取决于问题的性质,以及数据集的大小,无法先验确定。大的,显然是浪费的网格的原因是为了确保可以自动找到好的值,并且概率很高。

如果计算费用是一个问题,那么您可以使用Nelder-Mead 单纯形算法来优化交叉验证误差,而不是使用网格搜索。这是一种不需要梯度信息的优化算法,因此对于当前使用网格搜索的任何问题都非常简单。我不是 R 用户,但 Nelder-Mead 在 R 中通过optim.

这被称为 SVM 的“参数调整”问题。最简单的方法之一是在通过 CV 折叠时获取每个类别的最高级别预测准确度的中值。

此外,根据经验,使用更简单的分类器来确定您的数据是否是线性可分的。如果 k 最近邻 (kNN) 或线性回归效果更好,那么您不应该使用更昂贵(计算上)的方法,如 SVM。SVM 很容易被过度使用,因此请确保您评估线性回归、kNN、线性判别分析、随机森林等。