【问题标题】:Python: Gridsearch Without Machine Learning?Python:没有机器学习的网格搜索?
【发布时间】:2018-07-29 07:27:00
【问题描述】:

我想优化具有多个可变参数的算法 作为输入。

对于机器学习任务,Sklearn 通过gridsearch 功能提供超参数优化。

是否有标准化的方式/Python 中的库允许优化超参数,不仅限于机器学习主题?

【问题讨论】:

    标签: python optimization scikit-learn grid-search hyperparameters


    【解决方案1】:

    您可以使用 score 方法创建自定义管道/估算器(参见链接http://scikit-learn.org/dev/developers/contributing.html#rolling-your-own-estimator)来比较结果。

    ParameterGrid 也可能对您有所帮助。它将自动填充所有超参数设置。

    【讨论】:

      【解决方案2】:

      您可能会考虑 scipy 的 optimize.brute,它本质上是相同的,尽管在 API 使用方面不受限制。您只需要定义一个返回标量的函数。

      通过蛮力在给定范围内最小化函数。

      使用“蛮力”方法,即在多维点网格的每个点处计算函数的值,以找到函数的全局最小值。

      文档中的无耻示例副本:

      代码

      import numpy as np
      from scipy import optimize
      
      
      params = (2, 3, 7, 8, 9, 10, 44, -1, 2, 26, 1, -2, 0.5)
      def f1(z, *params):
          x, y = z
          a, b, c, d, e, f, g, h, i, j, k, l, scale = params
          return (a * x**2 + b * x * y + c * y**2 + d*x + e*y + f)
      
      def f2(z, *params):
          x, y = z
          a, b, c, d, e, f, g, h, i, j, k, l, scale = params
          return (-g*np.exp(-((x-h)**2 + (y-i)**2) / scale))
      
      
      def f3(z, *params):
          x, y = z
          a, b, c, d, e, f, g, h, i, j, k, l, scale = params
          return (-j*np.exp(-((x-k)**2 + (y-l)**2) / scale))
      
      
      def f(z, *params):
          return f1(z, *params) + f2(z, *params) + f3(z, *params)
      
      rranges = (slice(-4, 4, 0.25), slice(-4, 4, 0.25))
      resbrute = optimize.brute(f, rranges, args=params, full_output=True,
                                finish=optimize.fmin)
      print(resbrute[:2])  # x0, feval
      

      输出

      (array([-1.05665192,  1.80834843]), -3.4085818767996527)
      

      蛮力函数并不是什么黑魔法,通常人们可能会考虑自己的实现。上面的 scipy-example 有一个更有趣的功能

      finish : 可调用的,可选的

      以蛮力最小化结果作为初始猜测调用的优化函数。 finish 应该将 func 和初始猜测作为位置参数,并将 args 作为关键字参数。它还可以将 full_output 和/或 disp 作为关键字参数。如果不使用“抛光”功能,请使用无。有关详细信息,请参阅注释。

      我会推荐大多数用例(在连续空间中)。但请务必对它的作用有一些最低限度的了解,以了解您不想这样做的用例(需要离散空间结果;缓慢的函数评估)。

      如果您使用的是 sklearn,则您已经安装了 scipy(这是一个依赖项)。

      编辑: 这里我创建了一些小图 (code) 以显示 finish 正在做什么 (local-opt) 与一维示例(不是最好的示例,但更容易情节):

      【讨论】:

        【解决方案3】:

        您还可以查看贝叶斯优化。在这个github repository 你可以找到简单的实现。

        不同之处在于,贝叶斯优化不会查找您输入范围内的特定值,而是查找范围内的值。

        下面的示例取自他们的存储库,以便您了解实现的简单程度!

        def black_box_function(x, y):
            """Function with unknown internals we wish to maximize.
        
            This is just serving as an example, for all intents and
            purposes think of the internals of this function, i.e.: the process
            which generates its output values, as unknown.
            """
            return -x ** 2 - (y - 1) ** 2 + 1
        
        from bayes_opt import BayesianOptimization
        
        # Bounded region of parameter space
        pbounds = {'x': (2, 4), 'y': (-3, 3)}
        
        optimizer = BayesianOptimization(
            f=black_box_function,
            pbounds=pbounds,
            random_state=1,
        )
        
        optimizer.maximize(
            init_points=2,
            n_iter=3,
        )
        
        print(optimizer.max)
        >>> {'target': -4.441293113411222, 'params': {'y': -0.005822117636089974, 'x': 2.104665051994087}}
        

        【讨论】:

        • 感谢分享这个 repo,但是,我想使用 pbounds 作为整数值,比如 'x': (11 , 20) 只选择 11 到 20 之间的整数值进行优化,是这可能是因为我的代码中有错误
        【解决方案4】:

        Sklearn 也可以独立于机器学习主题使用,因此,为了完整起见,

        我建议:

        from sklearn.model_selection import ParameterGrid
        param_grid = {'value_1': [1, 2, 3], 'value_2': [0, 1, 2, 3, 5]}
        for params in ParameterGrid(param_grid):
            function(params['value_1'], params['value_2'])
        

        查找详细文档here

        【讨论】:

        • 我相信您忘记使用从 sklearn.model_selection 导入的 ParameterGrid 类。事实上,这个答案没有多大意义。
        猜你喜欢
        • 2016-10-09
        • 2017-10-01
        • 2017-03-03
        • 2019-05-14
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 2016-05-28
        • 2022-10-17
        相关资源
        最近更新 更多