为何设置种子且用相同数据集,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
相关产品推荐
相关产品推荐

