如何在mlr3hyperband基础阶段基于paradox实现Sobol/LHS采样?
在mlr3hyperband中实现Sobol/LHS空间填充设计作为自定义采样器
完全可以通过自定义paradox::Sampler对象,在mlr3hyperband的bracket初始阶段使用Sobol序列或LHS这类空间填充设计,具体实现步骤如下:
1. 封装Sobol/LHS为Sampler子类
paradox的generate_design_sobol和generate_design_lhs是生成设计的函数,需要将它们包装成符合Sampler接口的R6类:
首先加载所需包:
library(mlr3) library(mlr3hyperband) library(paradox)
实现Sobol采样器
SamplerSobol = R6::R6Class("SamplerSobol", inherit = Sampler, public = list( initialize = function() { super$initialize(param_set = ParamSet$new()) }, sample = function(n, param_set) { generate_design_sobol(param_set, n)$data } ) )
实现LHS采样器
SamplerLHS = R6::R6Class("SamplerLHS", inherit = Sampler, public = list( initialize = function() { super$initialize(param_set = ParamSet$new()) }, sample = function(n, param_set) { generate_design_lhs(param_set, n)$data } ) )
2. 在mlr3hyperband中使用自定义采样器
创建Hyperband调优器时,通过sampler参数传入自定义采样器的实例即可:
# 定义任务、带调优参数的学习器 task = tsk("iris") learner = lrn("classif.rpart", cp = to_tune(1e-4, 1e-1, logscale = TRUE)) # 创建带Sobol采样器的Hyperband调优器 tuner_hb_sobol = tnr("hyperband", sampler = SamplerSobol$new()) # 或者创建带LHS采样器的Hyperband调优器 tuner_hb_lhs = tnr("hyperband", sampler = SamplerLHS$new())
3. 运行调优流程
# 初始化调优实例 instance = ti( task = task, learner = learner, resampling = rsmp("holdout"), measure = msr("classif.ce"), terminator = trm("evals", n_evals = 50) ) # 启动调优(以Sobol为例) tuner_hb_sobol$optimize(instance)
可选:添加自定义配置
如果需要对Sobol/LHS的生成逻辑做定制(比如Sobol跳过初始序列、LHS调整抽样方法),可以在Sampler类中扩展参数:
# 带跳过参数的Sobol采样器 SamplerSobol = R6::R6Class("SamplerSobol", inherit = Sampler, public = list( skip = NULL, initialize = function(skip = 1000) { super$initialize(param_set = ParamSet$new()) self$skip = skip }, sample = function(n, param_set) { generate_design_sobol(param_set, n, skip = self$skip)$data } ) ) # 使用时传入自定义参数 tuner_hb_sobol = tnr("hyperband", sampler = SamplerSobol$new(skip = 2000))
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

