使用mlr3实现参数优化中断与续跑的方案咨询及示例请求
基于mlr3实现可重启的参数优化
核心思路
mlr3生态中的mlr3tuning包支持带断点续跑(checkpointing)的参数优化,无需依赖外部GA包即可实现遗传算法优化,且能自动保存中间状态,节点故障后可从断点恢复。
可运行示例
1. 安装并加载依赖包
# 安装必要包(首次运行) install.packages(c("mlr3", "mlr3tuning", "mlr3learners", "data.table", "future", "future.callr")) # 加载包 library(mlr3) library(mlr3tuning) library(data.table) library(future) # 设置并行计算(可选,加速优化) plan(callr)
2. 定义数值模型与成本函数
这里模拟一个简单的数值优化问题(目标最小化(x1-2)^2 + (x2+3)^2),替换为你的实际模型即可:
# 自定义成本函数:输入参数列表,返回需最小化的成本值 cost.fun <- function(params) { # 模拟你的数值模型计算过程 (params$x1 - 2)^2 + (params$x2 + 3)^2 }
3. 创建优化任务与参数空间
# 定义参数空间:替换为你的实际参数范围 param_set <- ps( x1 = p_dbl(lower = -10, upper = 10), # 连续参数x1 x2 = p_dbl(lower = -10, upper = 10) # 连续参数x2 ) # 创建优化实例,设置checkpoint路径(自动保存中间状态) instance <- TuningInstanceSingleCrit$new( task = NULL, # 数值优化无需mlr3任务,设为NULL learner = NULL, # 同上 resampling = rsmp("none"), # 无重采样 measure = msr("regr.mse"), # 用均方误差作为评估指标(仅需方向正确,这里是最小化) search_space = param_set, terminator = trm("evals", n_evals = 100), # 最多运行100次评估 store_models = FALSE, checkpoint = "mlr3_checkpoint" # 断点保存目录,自动创建 ) # 绑定自定义成本函数到实例 instance$objective_function <- function(x, instance) { cost.fun(x) }
4. 运行优化(可模拟节点故障中断)
# 选择遗传算法作为优化器 tuner <- tnr("ga", popSize = 20, pcrossover = 0.8, pmutation = 0.1) # 开始优化(运行过程中可手动中断模拟节点故障) tuner$optimize(instance)
5. 从断点重启优化
如果中途中断,只需重新加载实例并再次运行optimize即可:
# 从checkpoint目录恢复实例 instance <- TuningInstanceSingleCrit$new( task = NULL, learner = NULL, resampling = rsmp("none"), measure = msr("regr.mse"), search_space = param_set, terminator = trm("evals", n_evals = 100), store_models = FALSE, checkpoint = "mlr3_checkpoint" ) # 重新绑定成本函数 instance$objective_function <- function(x, instance) { cost.fun(x) } # 重启优化,会从上次中断的位置继续 tuner$optimize(instance)
6. 查看最终结果
# 获取最优参数 instance$result_learner_param_vals # 获取最优成本值 instance$result_y
关键说明
checkpoint参数指定的目录会自动保存每次评估的状态,重启时自动读取未完成的进度- 若坚持使用原
GA包,可通过自定义tuner接入mlr3,但推荐直接使用mlr3封装的遗传算法(tnr("ga")),已适配checkpoint机制 - 终止条件(
terminator)可根据需求调整,比如按时间、成本阈值等设置
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

