mlr3多分支图中为MLR Learner添加特征突变与目标转换及预测疑问
问题描述
已基于mlr3构建包含XGBoost、Ranger、多元线性回归(MLR)、Ridge四个Learner的多分支回归图,核心代码见下方。现需要为MLR分支添加对应规则的特征转换与目标转换:
- 特征转换:生成
log(PM + 0.001)特征,保留原H、T特征 - 目标转换:训练时对目标变量执行
log(observation + 0.001)转换,预测时自动反转回原始空间
同时咨询:若按此配置流程,预测阶段是否无需手动执行exp(obs.predic) - 0.001的反转操作?
核心现有代码:
pomut = po("mutate") mutations = list( PM.Trafo = ~ (PM*T) ) pomut$param_set$values$mutation = mutations preproc_1 = po("select", selector = selector_name(c("T", "H", "PM")), id = "slct_1") nop_1 = po("nop", id = "nop_1") nop_2 = po("nop", id = "nop_2") nop_3 = po("nop", id = "nop_3") # 回归图构建 graph = preproc_1 %>>% po("branch", c("lrn_xgboost", "lrn_ranger", "lrn_MLR", "lrn_ridge")) %>>% gunion(list(nop_1, nop_2, pomut, nop_3)) %>>% gunion(lapply(c(learners[[1]], learners[[2]], learners[[3]], learners[[4]]), po)) %>>% po("unbranch") graph$plot()
解决方案
1. 多分支下MLR专属转换的实现
要给MLR分支单独配置特征与目标转换,需为该分支构建独立的预处理+目标转换管道,其他分支保持原有逻辑即可:
# 1. 定义MLR分支的特征转换:生成log(PM+0.001)特征 mlr_feature_mutate = po("mutate", mutation = list( log_PM = ~ log(PM + 0.001) )) # 2. 定义目标转换算子:同时指定训练时的转换函数和预测时的反转函数 mlr_target_trafo = po("targettrafo", trafo = function(x) log(x + 0.001), # 训练时对目标变量的转换 invert = function(x) exp(x) - 0.001 # 预测时的反转操作 ) # 3. 重新构建多分支回归图 graph = preproc_1 %>>% po("branch", c("lrn_xgboost", "lrn_ranger", "lrn_MLR", "lrn_ridge")) %>>% gunion(list( # XGBoost分支:无额外预处理,直接接Learner nop_1 %>>% po(learners[[1]]), # Ranger分支:无额外预处理,直接接Learner nop_2 %>>% po(learners[[2]]), # MLR分支:特征转换 -> 目标转换 -> Learner mlr_feature_mutate %>>% mlr_target_trafo %>>% po(learners[[3]]), # Ridge分支:无额外预处理,直接接Learner nop_3 %>>% po(learners[[4]]) )) %>>% po("unbranch") # 可视化验证分支流程 graph$plot()
2. 预测反转的自动处理
只要通过po("targettrafo")正确配置了invert参数,mlr3在预测阶段会自动调用反转函数,将模型输出的转换后预测值还原为原始目标空间的数值,无需手动执行exp(obs.predic) - 0.001操作。
内容的提问来源于stack exchange,提问作者Nucore
相关产品推荐
相关产品推荐

