首页 > 解决方案 > 对离散网格点使用贝叶斯优化

问题描述

我正在使用BayesianOptimization包来优化sklearn 决策树的超参数。有连续的参数,如

区间中的 min_weight_fraction_leaf (0.1,0.4)

还有离散参数,如

标准 = "mse","friedman_mse",...

或 None 和 int 的组合,如

最大深度 = 无,1,2,...

def DT_optimizer_function(criterion,max_depth,min_weight_fraction_leaf):
    """
    Function with unknown internals we wish to maximize.
    """
    return -x ** 2 - (y - 1) ** 2 + 1

from bayes_opt import BayesianOptimization

# Bounded region of parameter space
pbounds = {'criterion': ?,
           'max_depth': ?,
           'min_weight_fraction_leaf' = (0.1,0.4)
          }

optimizer = BayesianOptimization(
    f=DT_optimizer_function,
    pbounds=pbounds,
    random_state=1,
)

optimizer.maximize(
    init_points=2,
    n_iter=3,
)

print(optimizer.max)

是否也可以优化离散值?

标签: python-3.x

解决方案


根据他们的文档

没有使用此包处理离散参数的原则方法。

但是,您可以将来自bayes opt 的浮点样本转换为int或以符合您的目的的方式对其进行处理。例如,在上面的代码段中,您可以执行以下操作:

from bayes_opt import BayesianOptimization

def function_to_be_optimized(criterion,max_depth):
   # map bayes_opt sample to a categorical value
   # values below 0.5 mapped to 'mse', above 0.5 mapped to 'friedman_mse' 
   criterion_list = ['mse', 'friedman_mse'] 
   criterion = criterion_list[round(criterion)] 
   
   # map bayes_opt sample to an integer value
   max_depth = int(max_depth)
   max_depth = max_depth if max_depth!=0 else None

   magical_number = ...
   return magical_number
   

pbounds = {
           'criterion': (0,1),
           'max_depth': (0,5)
          }

optimizer = BayesianOptimization(
    f=function_to_be_optimized,
    pbounds=pbounds,
    random_state=42,
)

optimizer.maximize(
    init_points=2,
    n_iter=3,
)

我知道这不是一个理想的解决方案,因为分类值可能无法享受实值参数所具有的平滑度特性。


推荐阅读