libsvm 的“grid.py”尝试仅优化 svm-train 的两个参数“c”和“g”。我想通过为不同的参数一次又一次地运行“grid.py”来扩展“grid.py”以优化其他参数(例如“r”或“d”)。我有一些问题
1. 是否已经有任何脚本可以优化除“c”和“g”以外的参数?
2. 哪些参数更关键,最大/最小范围有哪些。有时更改/优化一个参数会自动优化其他参数。svm-train参数是这种情况吗?
1 回答
据我所知,没有脚本可以做到这一点,但是我不明白为什么 grid.py 不能轻易扩展来做到这一点。但是,我认为这不值得付出努力。
首先,您需要选择您的内核。这本身就是一个参数。每个内核都有一组不同的参数,并且会执行不同的操作,因此为了比较内核,您必须优化每个内核的参数。
C、代价参数是适用于SVM本身的整体参数。其他参数都是核函数的输入。C 控制宽边距和更多错误分类的训练点(但模型可以更好地泛化到未来数据)和窄边距之间的权衡,该窄边距更好地拟合训练点但可能过度拟合到训练数据。
通常,两个最广泛使用的内核是线性(不需要参数)和 RBF 内核。
RBF 内核采用 gamma 参数。这必须优化,它的值会显着影响性能。
如果您使用的是多项式内核,则 d 是主要参数,您可以对其进行优化。从默认值修改其他参数是没有意义的,除非您有一些数学上的理由说明这样做更适合您的数据。以我的经验,多项式内核可以提供很好的结果,但如果在 RBF 内核上有一个微小的增加,那么计算成本就会很高。
与 sigmoid 内核类似,gamma 是您的主要参数,优化它并将 coef0 保留为默认值,除非您很好地理解为什么这更适合您的数据。
所以 grid.py 不优化其他参数的原因是因为在大多数情况下它根本没有必要并且通常不会导致性能的提高。至于你的第二个问题:不,这不是优化一个会优化另一个的情况。这些参数的最佳值特定于您的数据集。更改内核参数的值会影响 C 的最优值。这就是为什么建议使用网格搜索的原因。将这些额外参数添加到搜索中会显着增加搜索时间,并且不太可能提高分类器性能。