我正在使用 LibSVM 库进行分类。对于我的问题,我使用多项式内核,我需要选择最佳参数(d=多项式内核的度数,和C=软边距常数)。LibSVM 指南建议对这项工作进行网格搜索。在这个库中存在一个参数选择工具 ( grid.py),但在我看来,这是为了调整 RBF 内核 (gamma) 的参数而实现的。我的问题是:
- 选择合适的参数而不是网格搜索还有其他好的解决方案吗?
- 任何人都可以给我一些提示/示例代码来选择多项式内核的参数吗?
我正在使用 LibSVM 库进行分类。对于我的问题,我使用多项式内核,我需要选择最佳参数(d=多项式内核的度数,和C=软边距常数)。LibSVM 指南建议对这项工作进行网格搜索。在这个库中存在一个参数选择工具 ( grid.py),但在我看来,这是为了调整 RBF 内核 (gamma) 的参数而实现的。我的问题是:
正如@JohnSmith 所建议的那样,网格搜索是一个明智的过程,但它并不是唯一稳定的技术。我通常使用Nelder-Mead 单纯形算法,我发现它比网格搜索非常可靠且更有效,因为用于研究提供不良模型的超参数空间区域的时间更少。如果您是 MATLAB 用户,您可以在此处获取我的此方法的实现。Nelder Mead 单纯形方法很有吸引力,因为它们不需要梯度信息(我想您可以将单纯形的梯度视为局部梯度的近似值)并且很容易实现。
跨度边界的梯度下降优化也是优化超参数的好方法,请参见Chapelle等人。(也调查 Olivier 写的其他论文,有一些真正的宝石)。
然而,网格搜索的一个优点是在优化超参数时很容易过度拟合交叉验证误差(或跨度界限等),尤其是在数据少而超参数多的情况下。这意味着如果您将超参数调整为收敛,您可能会得到一个非常差的分类器,因此粗略的网格搜索通常可以表现得更好(我有一篇关于这方面的论文正在准备中)。
为什么不想使用网格搜索?在我看来,SVM 参数估计的唯一稳定技术。当然你可以使用自适应搜索,但它可以节省你的时间不多,但会导致一些奇怪的结果。
CV 程序的实现非常标准:
Divide your dataset into two parts: $X_{train}$ and $X_{test}$.
Run cycle through the parameter $d$ {
Run cycle through $C$ {
Train SVM with $X_{train}$, $d$ and $C$;
Test on $X_{test}$;
Remember the parameters, leading to the best result;
}
}
您可以尝试使用随机搜索算法来获得与网格搜索几乎等效的结果,而工作量要少得多,具体取决于网格的粒度。你可以在Dato 博客上阅读更多关于它以及其他超参数调整技术的信息。如果您将其设置为并行运行,则此方法相对较快。