为何通过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.treesmin_n→min.node.sizemtry→mtry
如果这些参数没有显式设置,parsnip会传递NULL让ranger使用默认值,这部分和直接调用ranger的行为一致,不是导致模型差异的原因。
内容的提问来源于stack exchange,提问作者Anna Jackson
相关产品推荐
相关产品推荐

