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

为何设置种子且用相同数据集,mlr包模型重复运行性能指标不同?

解决mlr中设置set.seed后仍得到不同结果的问题

嘿,这个问题我之前踩过坑!原因其实很简单:你设置的set.seed(42)只对R基础包的随机数生成有效,但mlr包(你用到的makeResampleInstance、resample这些函数都属于它)有自己独立的随机数流,你的种子没同步到mlr的随机系统里,导致每次运行时的训练/测试划分都不一样,最终MSE结果自然不同。

具体原因拆解

  • 你用的makeResampleInstance函数负责生成训练集和测试集的划分,这个过程的随机性由mlr自己的随机数管理器控制,不受基础R的set.seed影响。
  • 虽然你用的regr.ctree(条件推断树)本身默认是无随机行为的(它基于显著性检验选择分裂,不随机选变量),但数据划分变了,模型预测的MSE肯定会不一样。

解决办法

有两种可靠的方式可以让两次运行得到完全一致的结果:

方法1:同步mlr的随机种子

在设置基础R种子的同时,用mlr专门的setMlrSeed函数同步种子:

# 同时设置基础R和mlr的随机种子
set.seed(42)
mlr::setMlrSeed(42)

data(BostonHousing, package = "mlbench")
regr.task = makeRegrTask(id = "bh", data = BostonHousing, target = "medv")
lrn = makeLearner("regr.ctree")
outer = makeResampleInstance(makeResampleDesc("Holdout"), task = regr.task)
r = resample(learner = lrn, task = regr.task, resampling = outer, show.info = TRUE)

这样两次运行时,mlr生成的训练/测试划分会完全相同,MSE结果也就一致了。

方法2:提前固定重采样划分

如果你不想每次都设置种子,可以提前生成一次重采样实例并保存,之后每次运行直接加载使用:

# 第一次运行时生成并保存划分
set.seed(42)
mlr::setMlrSeed(42)
data(BostonHousing, package = "mlbench")
regr.task = makeRegrTask(id = "bh", data = BostonHousing, target = "medv")
outer = makeResampleInstance(makeResampleDesc("Holdout"), task = regr.task)
save(outer, file = "boston_holdout_split.RData")

# 后续运行时直接加载
load("boston_holdout_split.RData")
lrn = makeLearner("regr.ctree")
r = resample(learner = lrn, task = regr.task, resampling = outer, show.info = TRUE)

这种方法的好处是,即使后续代码有其他随机操作,也不会影响训练/测试的划分。

内容的提问来源于stack exchange,提问作者Ashti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:58:07