mlr3中regr.nnet任务的交互项与多次训练实现问题
mlr3迁移nnet/neuralnet/ranger示例的常见问题解决
1. regr.nnet无法自动纳入交互项的解决方法
mlr3的学习器默认基于任务的特征矩阵训练,不会像原生nnet()那样自动解析公式中的交互项(如x*f)。要对齐原生效果,需先通过预处理生成交互特征,推荐用mlr3pipelines的PipeOpFormula来构建包含交互项的预处理管道:
library(mlr3) library(mlr3pipelines) library(nnet) # 示例任务:用mtcars预测mpg,包含wt*hp交互项 task = TaskRegr$new(id = "mtcars", backend = mtcars, target = "mpg") # 构建带交互项的预处理管道 po_formula = po("formula", formula = mpg ~ wt + hp + wt*hp) pipe = po_formula %>>% po("learner", lrn("regr.nnet", size = 3, trace = FALSE)) # 训练并验证 pipe$train(task) pipe$predict(task)$score(msr("regr.r2"))
这样管道会先根据公式生成交互特征,再传入regr.nnet训练,效果和原生nnet(mpg ~ wt*hp, data=mtcars, size=3)一致。
2. 无需外部循环,多次训练神经网络选最优模型
mlr3的R6类对象支持深度克隆,结合重采样或批量训练即可实现最优模型选取,推荐两种方案:
方案1:用重复重采样自动训练多模型
library(mlr3) library(mlr3measures) task = TaskRegr$new(id = "mtcars", backend = mtcars, target = "mpg") learner = lrn("regr.nnet", size = 3, trace = FALSE) # 定义5次重复的8:2拆分重采样 resampling = rsmp("holdout", ratio = 0.8)$instantiate(task) results = resample(task, learner, resampling, store_models = TRUE, repeats = 5) # 提取R²最高的模型 model_perfs = results$score(msr("regr.r2")) best_idx = which.max(model_perfs$regr.r2) best_model = results$learners[[best_idx]]$model
方案2:克隆学习器批量训练(同一训练集)
如果要在同一训练集上多次随机初始化选最优,可克隆独立的学习器实例:
library(purrr) # 克隆5个带独立随机种子的学习器 learners = map(1:5, ~ learner$clone(deep = TRUE)$set_seed(.x)) # 批量训练 trained_learners = map(learners, ~ .x$train(task)) # 在测试集评估并选最优 test_set = task$row_ids[resampling$test_set(1)] perfs = map_dbl(trained_learners, ~ .x$predict(task, row_ids = test_set)$score(msr("regr.r2"))) best_learner = trained_learners[[which.max(perfs)]]
3. 避免临时转换x变量为double的方案
出现临时转double的需求,通常是因为任务中存在因子变量,mlr3默认会将因子转成哑变量。如果想保留因子的数值编码(而非哑变量),用mlr3pipelines的PipeOpEncode指定编码方式即可:
po_encode = po("encode", method = "integer", affect_columns = selector_type("factor")) pipe = po_encode %>>% po("learner", lrn("regr.nnet", size = 3)) # 训练管道,无需手动转double pipe$train(task)
如果是自定义特征类型的问题,也可以直接在任务创建阶段用task$set_col_types()指定特征类型,避免后续自动转换。
4. 将neuralnet包作为mlr3学习器使用
mlr3官方扩展包mlr3extralearners已内置neuralnet的学习器接口,无需自行编写:
# 安装扩展包 install.packages("mlr3extralearners") library(mlr3extralearners) # 调用回归型neuralnet学习器 learner = lrn("regr.neuralnet", hidden = c(3,2), linear.output = TRUE, trace = FALSE) task = TaskRegr$new(id = "mtcars", backend = mtcars, target = "mpg") # 训练模型 learner$train(task)
分类任务则用lrn("classif.neuralnet"),参数设置和原生neuralnet()完全兼容。
内容的提问来源于stack exchange,提问作者tpetzoldt
相关产品推荐
相关产品推荐

