首页 > 解决方案 > 如何绘制 OOB 错误与随机森林中的树数

问题描述

我拟合了一个随机森林模型。我已经使用了两者randomForestranger包。我没有调整森林中的树木数量,我只是将其保留为默认数量,即 500。现在我想看看它是否足够,即错误是否达到了稳定水平。所以我相信我需要提取单个树,随机取例如 100、200、300、400 和最后 500 棵树,从中取出 oob 树并计算 100、200、...树的 OOB 错误连续. 然后我可以绘制 OOB 错误与树的数量。我发现randomForest::getTreeranger::treeInfo返回了一个 data.frame 的树,但我不知道那里是什么。更重要的是ranger::treeInfo返回一个具有 50% NAs 的数据帧,并且整体输出更难阅读。所以我的问题是:

  1. 如果我已经有一个包含 500 棵树的随机森林,我如何绘制 OOB 错误与森林中使用的树木数量?
  2. 为什么ranger::treeInfo有 50% 的 NA 而实际上只有那些行有预测?

这是最小的示例:

mpg2 <- mpg %>% 
  mutate(is_suv = as.factor(class == 'suv')) %>% 
  select(-class)
mpg_model <- ranger::ranger(is_suv ~ ., data = mpg2)
ranger::treeInfo(mpg_model, tree = 100)

标签: rrandom-forest

解决方案


我认为您正在寻找的只是plot(.),如本例所示:

library(randomForest)

set.seed(71)
iris.rf <- randomForest(Species ~ ., data=iris, importance = TRUE, proximity=TRUE)
# plot the model
plot(iris.rf)
# add legend to know which is which
legend("top", colnames(iris.rf$err.rate), fill=1:ncol(iris.rf$err.rate))

至于randomForest::getTreeand ranger::treeInfo,它们与 OOB 无关,它们只是描述了 -chosen-tree 的轮廓,即,哪些节点在哪些标准上被分割以及连接到哪些节点,每个包使用稍微不同的表示,以下示例来自ranger::treeInfo

     nodeID leftChild rightChild splitvarID splitvarName splitval terminal prediction
1       0         1          2          4  Petal.Width     0.80    FALSE       <NA>
2       1        NA         NA         NA         <NA>       NA     TRUE     setosa

这基本上是这样的描述:

在此处输入图像描述


推荐阅读