我希望优化一个具有多个可变参数作为输入的算法。
对于机器学习任务,
是否有一种标准化的方式/Python库,允许优化超参数,而不仅限于机器学习主题?
对于机器学习任务,
Sklearn
提供了使用gridsearch
功能来优化超参数的方法。是否有一种标准化的方式/Python库,允许优化超参数,而不仅限于机器学习主题?
Sklearn
提供了使用gridsearch
功能来优化超参数的方法。您可以考虑使用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)
我建议在大多数情况下(在连续空间中)使用它。但请确保对此有一些基本的了解,以了解您不希望执行此操作的用例(需要离散空间结果;函数评估缓慢)。finish:可选的可调用优化函数,使用暴力力量最小化的结果作为初始猜测进行调用。finish应该将func和初始猜测作为位置参数,并将args作为关键字参数。它还可以将full_output和/或disp作为关键字参数。如果不使用“polishing”功能,则使用None。有关详情,请参见注释。
finish
在一个1d示例中的局部优化效果(不是最好的示例,但更容易绘制)。
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}}
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'])