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

为何通过tidymodels调用ranger与直接调用ranger得到的模型不同?

为什么tidymodels调用ranger和直接调用ranger得到的模型不同?

核心原因是ranger包的随机种子机制和tidymodels的处理方式不一致:

  • 直接调用ranger()时,如果不显式指定seed参数,它会使用操作系统的随机数生成器,不受R全局set.seed()的控制;
  • tidymodels的parsnip在调用ranger引擎时,会自动将当前的R全局种子传递给ranger的seed参数,确保模型拟合的随机性受set.seed()控制。

这就导致即使你在两种调用前都执行了set.seed(100),两者使用的随机种子其实不一样,最终生成的随机森林模型(以及OOB误差)也就不同。

验证与解决方法

在直接调用ranger时显式指定seed参数,就能和tidymodels得到完全一致的模型:

library(tidymodels)
library(ranger)

# 加载数据(固定抽样结果)
set.seed(123)
data("iris")
train <- iris |> slice_sample(prop = 0.7)
test <- iris |> anti_join(train)

# 随机森林模型规格
rf_mod <- 
  rand_forest(trees = 10)  |>  
  set_engine("ranger", respect.unordered.factors = TRUE, probability = FALSE) |> 
  set_mode("classification")

# 使用tidymodels拟合模型
set.seed(100)
rf_tidy <- rf_mod |> fit(Species ~ ., data = train)
cat("tidymodels OOB误差:", rf_tidy$fit$prediction.error * 100, "%\n")

# 直接使用ranger拟合模型(显式指定seed)
rf_direct <- ranger(Species ~ ., data = train, 
       num.trees=10, respect.unordered.factors = TRUE, probability = FALSE,
       seed = 100)
cat("直接调用ranger OOB误差:", rf_direct$prediction.error * 100, "%\n")

运行后两者的OOB误差会完全一致。

补充说明

parsnip对ranger的核心参数做了映射:

  • trees → num.trees
  • min_n → min.node.size
  • mtry → mtry

如果这些参数没有显式设置,parsnip会传递NULL让ranger使用默认值,这部分和直接调用ranger的行为一致,不是导致模型差异的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 23:35:22