问题描述
当我使用 ranger 作为分类模型并使用 treeInfo()
提取一棵树时,我发现有时拆分会导致两个相同的终端节点。
这是预期的行为吗?为什么在最终节点相同的情况下引入拆分是有意义的?
从 this 问题,我认为 prediction
变量可能是多数类(尽管对于 python 和另一个随机森林实现)。 Ranger ?treeInfo
文档说它应该是预测的类。
MWE
library(ranger)
data <- iris
data$is_versicolor <- factor(data$Species == "versicolor")
data$Species <- NULL
rf <- ranger(is_versicolor ~ .,data = data,num.trees = 1,# no need for many trees in this example
max.depth = 3,# keep depth at an understandable level
seed = 1351,replace = FALSE)
treeInfo(rf,1)
#> nodeID leftChild rightChild splitvarID splitvarName splitval terminal prediction
#> 1 0 1 2 2 Petal.Length 2.60 FALSE <NA>
#> 2 1 NA NA NA <NA> NA TRUE FALSE
#> 3 2 3 4 3 Petal.Width 1.75 FALSE <NA>
#> 4 3 5 6 2 Petal.Length 4.95 FALSE <NA>
#> 5 4 7 8 0 Sepal.Length 5.95 FALSE <NA>
#> 6 5 NA NA NA <NA> NA TRUE TRUE
#> 7 6 NA NA NA <NA> NA TRUE TRUE
#> 8 7 NA NA NA <NA> NA TRUE FALSE
#> 9 8 NA NA NA <NA> NA TRUE FALSE
在此示例中,最后四行(nodeID 为 5 和 6 以及 7 和 8 的最终节点)具有预测 TRUE
和 FALSE
。
从图形上看,这看起来像这样
解决方法
我想我找到了该问题的(部分)答案,即 mtry
和 min.node.size
参数及其功能。
由于随机森林在每次拆分时仅选择 mtry
个变量,因此最终拆分可能只考虑变量,这些变量不会以导致最大基尼差异(或任何度量标准)的方式拆分数据选择)但仍然在每个最终节点中,给定的类可能占优势。
使用 mtry
和 min.node.size
可以改变这一点。但我们仍然可能会得到相同结果的分裂。