mlr3调优归档提取Random Forest超参数及克隆问题问询
mlr3分支模型调优:提取最优Random Forest超参数问题
背景
基于mlr3官方示例搭建自动化机器学习系统,采用branching机制集成xgboost与Random Forest(ranger)模型。训练阶段xgboost表现最优,已通过instance$result_learner_param_vals提取其最优超参数并构建最终模型。
尝试提取表现最优的Random Forest模型超参数,代码如下:
Arch = as.data.table(instance$archive, exclude_columns = NULL) # 保留uhash字段 best_RF = Arch[branch.selection == "lrn_ranger"] best_RF = best_RF[which.min(best_RF$regr.rmse), ] # 筛选RMSE最小的RF模型 instance$archive$learner_param_vals(uhash = best_RF$uhash) lrn_2 = as_learner(graph) lrn_2$param_set$values = instance$archive$learner_param_vals(uhash = best_RF$uhash) #lrn_2$param_set$values = instance$archive$learner_param_vals(i = best_RF$batch_nr)
核心问题
使用uhash或batch_nr调用instance$archive$learner_param_vals()时,始终返回归档第一行的参数集,而非目标Random Forest的最优超参数。
附带确认点
为不同分支构建基准模型时,若不对原始graph进行deep clone,修改克隆后的branch.selection会影响原始graph_learner及已构建的最优xgboost模型,已确认此为预期行为。
解决方案
1. 正确提取分支模型超参数
在branching场景下,learner_param_vals返回的是整个Graph的完整参数集,分支模型的参数会以嵌套形式存储,需针对性提取:
方法一:从完整参数集中筛选RF参数
# 获取最优RF的归档记录 Arch = as.data.table(instance$archive, exclude_columns = NULL) best_RF = Arch[branch.selection == "lrn_ranger"][which.min(regr.rmse)] # 获取该记录对应的完整参数集 full_params = instance$archive$learner_param_vals(uhash = best_RF$uhash) # 提取属于ranger分支的参数(前缀需匹配你Graph中分支节点的命名) rf_params = full_params[grepl("lrn_ranger", names(full_params))] # 去除参数名中的分支前缀,转为ranger原生参数格式 names(rf_params) = gsub("^.*lrn_ranger\\.", "", names(rf_params)) # 构建RF模型并赋值最优参数 lrn_ranger = lrn("regr.ranger") lrn_ranger$param_set$values = rf_params
方法二:直接从归档params列提取
如果归档已包含params列(exclude_columns=NULL已开启),可直接提取:
# 直接从最优RF记录的params列中获取分支参数 rf_params = best_RF$params[[1]][[best_RF$branch.selection]] # 构建模型并赋值参数 lrn_ranger = lrn("regr.ranger") lrn_ranger$param_set$values = rf_params
2. Graph克隆的标准方式
为避免修改克隆对象影响原始Graph,必须使用deep_clone():
graph_clone = deep_clone(graph) lrn_clone = as_learner(graph_clone) lrn_clone$param_set$values$branch.selection = "lrn_ranger"
内容的提问来源于stack exchange,提问作者Nucore
相关产品推荐
相关产品推荐

