Python:没有机器学习的Gridsearch?

时间:2018-02-19 05:01:31

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

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

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

Python中是否有标准化的方法/库,可以优化不限机器学习主题的参数?

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您可能会考虑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示例有一个有趣的功能

  

完成:可调用,可选

     

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

我建议大多数用例(在连续空间中)。但是一定要尽量少了解这是做什么来理解有些用例你不想这样做(需要离散空间结果;慢功能评估)。

如果你正在使用sklearn,你已经安装了scipy(它是一个依赖项)。

修改:这里创建了一些小图(code)以显示{1}}正在做什么(local-opt)和1d示例(不是最好的示例) ,但更容易绘制):

enter image description here

答案 2 :(得分:0)

  

Sklearn也可以独立于机器学习主题使用,因此,出于完整性考虑,

我建议:

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

查找详细文档here

答案 3 :(得分:0)

您还可以查看贝叶斯优化。在此 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}}