调整多个参数的最佳方法是什么?

数据挖掘 数据挖掘 数据集 数据清理 范围
2021-10-14 23:00:58

在机器学习中构建模型时,有几个“参数”(我正在考虑真实参数,例如梯度下降的步骤,或诸如特征之类的东西)来调整是很常见的。我们在验证集上验证这些参数。

我的问题是:调整这些多个参数的最佳方法是什么?例如,假设我们有 3 个参数 A、B 和 C,每个参数取 3 个值:

  • A = [ A1, A2, A3 ]
  • B = [ B1, B2, B3 ]
  • C = [ C1, C2, C3 ]

我想到了两种方法。

方法一:

同时改变所有参数,随机测试不同的组合,如:

  • 测试1 = [A1,B1,C1]
  • 测试2 = [A2,B2,C2]
  • 测试3 = [A3,B3,C3]
  • 测试4 = [A1,B2,C3]
  • 测试 5= [A3,B1,C2]
  • 等等..

方法二:

修复除一个以外的所有参数: - TestA1 = [A1,B1,C1] - TestA2 = [A2,B1,C1] - TestA3 = [A3,B1,C1] 这样,我们可以找到参数 A 的最佳值,然后我们固定这个值并用它来找到 B 的最佳值,最后找到 C 的最佳值。

对我来说,使用看起来更有条理的方法 2 似乎更合乎逻辑。但是我们可能会错过一个只能在方法 1 中找到而在方法 2 中没有出现的组合,例如 [A1,B2,C3]。

哪种方法最好?是否有另一种更准确的方法来调整多个参数?

提前致谢。

问候。

3个回答

通常人们执行网格搜索,其最简单的“详尽”形式类似于方法 1。但是也有更多“智能”方法来选择要探索的内容,它们以类似于每个单独模型的方式在参数空间中进行优化被优化。在这个空间中进行贪心优化可能会很棘手,因为它通常是非常非凸的。

本页介绍优化模型参数的基础知识。

我只是想添加更多关于这些更“智能”的方式来选择超参数的信息。特别是一个越来越受欢迎的。机器学习算法的贝叶斯优化,作者:Jasper Snoek、Hugo Larochelle 和 Ryan P. Adam。这在包括潜在 Dirichlet 分配、结构化 SVM 和卷积神经网络在内的算法中已被证明是有效的。

Github 上的算法 https://github.com/JasperSnoek/spearmint

当算法复杂(倾向于黑盒模型)和/或数据量很大并且训练多次模型的计算成本很高时,这种方法特别有用。

在贝叶斯优化方面,我更喜欢 Hyperopt,可在 github 上https://github.com/hyperopt/hyperopt或通过 pip,作者主页https://github.com/hyperopt/hyperopt获得。它背后的 tree-parzen-estimator 算法在http://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf的论文中有所描述。

你可以定义一个任意的嵌套搜索空间,然后告诉它找到一个黑盒函数的最优值。

Hyperopt 还支持开箱即用的内置 sklearn 搜索空间,但我没有使用过,我通常定义自己的。

还有一些其他的贝叶斯优化方案。从长远来看,我不能声称知道其中哪一个会成为“最好的”。