温馨提示:本文翻译自stackoverflow.com,查看原文请点击:scikit learn - How to use GridSearchCV (python) for maximizing or minimizing a function with parameters?
python scikit-learn hyperparameters fasttext gridsearchcv

scikit learn - 如何使用GridSearchCV(python)最大化或最小化带有参数的函数?

发布于 2020-03-28 23:28:25

我想最大化一个功能:func(minCount, wordNgrams, lr, epoch, loss) 仅在这些值上使用GridSearch:

`{'minCount': [2, 3],
'wordNgrams': [1, 2, 3, 4, 5],
'lr': [0.1, 0.01, 0.001, 0.0001],
'epoch': [5, 10, 15, 20, 25, 30],
'loss': [hs, ns, softmax]}`

我读过关于sklearn.model_selection.GridSearchCV(estimator, param_grid, ...) 但是,我不知道该放在哪里func(minCount, wordNgrams, lr, epoch, loss)

顺便说一句,我已经阅读了贝叶斯优化(https://github.com/fmfn/BayesianOptimization),但是对如何与stringand int参数一起使用却一无所知。

查看更多

查看更多

提问者
Andrew Ginnes
被浏览
71
A Co 2020-01-31 18:46

根据文档,您有两种解决方案:

  • 您可以将estimator = func传递给GridSearchCV,但是您还需要传递一个计分函数评分功能将获取func的输出,并返回GridSearchCV将寻求优化的评分(浮动)。例:
def my_scoring_function(func_outputs):

  """
  process the outputs of func and return a score. 

  if func already reutrns the value you want to minimize, 
  my_scoring_function will be the identity function.

  score is the value to optimize
  """

  return score


cv = GridSearchCV(estimator=func, param_grid=my_param_grid, scoring=my_scoring_function)


  • 更复杂,但更优雅:您可以将func重写为实现scikit-learn的estimator方法的对象(此处提供带有gid搜索示例的好教程)。这意味着基本上将遵循一组约定,这些约定将使您的函数的行为类似于scikit-learn的对象。GridSearchCV然后将知道如何处理它。不过,这可能对您的问题而言过于矫kill过正。


关于贝叶斯优化,如果您的问题满足以下条件,这将很有趣:

  • 评估功能的成本非常高(就时间/资源而言),并且您负担不起网格搜索所需的多次调用。在您的情况下,您有720种参数组合可供探索,因此,如果一个评估的成本为10s,则必须将网格搜索运行7200s。
  • 您想探索更广泛的参数空间,或者要在连续空间中搜索某些参数。通常,对于学习率来说可能很有趣。在这种情况下,您还可以使用随机搜索,也可以在scikit learning中实现

有关贝叶斯优化的更多详细信息,建议您阅读这篇非常全面的文章