You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:40:31