查找SVM最佳元参数的快速方法(比网格搜索更快)


17

我正在使用SVM模型对空气污染物进行短期预测。要训​​练新模型,我需要为SVM模型找到合适的元参数(我的意思是C,γ等)。

Libsvm文档(以及我已阅读的许多其他书籍)建议使用网格搜索来找到这些参数-因此,我基本上从特定集中为这些参数的每种组合训练模型,然后选择最佳模型。

有没有找到最佳(或接近最佳)元参数的更好方法?对我来说,这主要是计算时间的问题-对这个问题进行一次网格搜索大约需要两个小时(在我做了一些优化之后)。

网格搜索的优点:

  • 它可以很容易地并行化-如果您有20个CPU,它将运行快20倍,并行化其他方法则更加困难
  • 您检查了元参数空间的大部分,因此,如果有一个好的解决方案,您将找到它。

Answers:


10

网格搜索的缺点是运行时间的增长与每个参数的选项数量的乘积一样快。

这是Alex Smola博客中与您的问题相关的条目

这是一个报价:

daccess-ods.un.org daccess-ods.un.org从您的数据集中随机选择1000对(x,x'),计算所有此类对的距离,并取中位数,0.1和0.9分位数。现在,选择λ作为这三个数字的任意一个的倒数。进行一点交叉验证,您就会确定这三者中哪一个最好。在大多数情况下,您无需进一步搜索。

我自己还没有尝试过,但是看起来确实很有希望。


这与问题有什么关系?问题是要找到一种SVM模型的最佳参数(快速)。
Roronoa Zoro'2

2
@Roronoa Zoro:答案也是如此。它说明了如何在3 | Cs |中找到基于径向基函数的SVM(Smola博客文章中的C和\ lambda)的参数。与| \ gammas || Cs |相对的时间 就像在网格搜索的情况下一样。
carlosdc

为了明确说明以确保我了解启发式算法,基本上,您只是从数据集中随机抽取了1000个数据点用于训练SVM,然后采用.1,.9分位数和中位数的反函数,它们可能很好合适的伽马的候选人?
tomas 2012年

6

如果您假设在参数网格的下面有一个相对平滑的函数,那么您可以做某些事情。例如,一种简单的启发式方法是从一个非常粗糙的参数网格开始,然后围绕该粗糙网格中最好的参数设置使用一个更精细的网格。

当然,这在实践中往往会很好地起作用,但有一些警告。首先是空间不一定是平滑的,并且可能存在局部最优。粗网格可能会完全忽略这些,您可能会得到次优的解决方案。还要注意,如果保持集中的样本相对较少,则可能会有很多参数设置给出相同的分数(误差或所使用的任何度量)。如果您要进行多班学习(例如,使用“ 单人对所有人”方法),并且在坚持集中的每个班上只有几个例子,。但是,如果不诉诸讨厌的非线性优化技术,这可能是一个很好的起点。

有设置引用的一个很好的位置。过去,我采用的方法是可以通过检查内核来合理地估计一系列合理的内核超参数(例如,对于RBF内核,请确保内核值的直方图能够很好地散布值,而不是偏向0或1-您也可以自动执行此操作而无需进行太多工作),这意味着您可以在开始之前缩小范围。然后,您可以将搜索集中在其他任何参数上,例如正则化/容量参数。当然,这只适用于预先计算的内核,尽管如果您不想使用预先计算的内核,则可以在随机的点集上进行估算,我认为这种方法也很好。


5

我使用模拟退火来搜索参数。

该行为由一些参数控制:

  • k 是玻耳兹曼常数。
  • T_max 是您的起始温度。
  • T_min 是您的结束阈值。
  • mu_Tμ)是您降低温度多少(T->T/μ
  • i 是每个温度下的迭代次数
  • z是步长-您确定确切的含义。我随机进去 old*(1±z)
  1. 以一个起点(一组参数值)为准。
  2. 获取能量(它与您的数据的适应程度;我使用卡方值)。
  3. 朝随机方向看(“迈出一步”)。
    • 如果能量低于您的当前点,请移动到那里。
    • 如果更高,则有可能移到那里p = e^{-(E_{i+1} - E_i)/(kT)}
  4. 重复,偶尔降低T->T/μ每次i迭代,直到您点击T_min

试一下这些参数,您应该能够找到一个运行良好且快速的集合。

GNU科学库包括模拟退火。


4

如果有人对此感兴趣,请参考我对这个问题的一些看法:

  • 正如@tdc所建议的那样,我正在进行粗/细网格搜索。这引入了两个问题:
    • 在大多数情况下,我将获得一组具有千差万别的参数的良好元参数集-我以这种方式解释这些参数是最佳解决方案,但请确保我应该检查所有这些良好参数附近的所有精细网格(这将花费很多时间),所以现在我只检查下注元参数集的邻域。
    • 在大多数情况下,精细搜索不会提高SVM性能(这可能是由于我只检查粗网格中最佳点的附近情况。
  • 我观察到的行为是,大多数计算时间都花费在元参数集上,而这些结果不会产生良好的结果,例如:大多数元参数集将在15秒以内进行计算(其中最好的错误率是15%),而某些需要15分钟(而且其中大多数的错误率都超过100%)。因此,在进行网格搜索时,我杀死了需要30秒以上才能计算的点,并假设它们具有无限错误。
  • 我使用多重处理(足够简单)

1

如果内核是放射状的,则可以使用此启发式方法获得适当的σ -然后,C优化要容易得多。


链接已死。您引用的启发式是什么?
Aalawlx
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.