在 randomForest 包中绘制 500 棵树中的一棵

Posted

技术标签:

【中文标题】在 randomForest 包中绘制 500 棵树中的一棵【英文标题】:plot one of 500 trees in randomForest package 【发布时间】:2017-10-29 11:34:37 【问题描述】:

如何在 R 中的同名包中的 randomForest 函数的输出中绘制树?例如,我使用 iris 数据并希望在 500 个输出树中绘制第一棵树。我的代码是

model <-randomForest(Species~.,data=iris,ntree=500)

【问题讨论】:

以下答案有帮助吗? stats.stackexchange.com/questions/41443/… @Avitus 感谢您的回答,但我无法理解。你能给我一个简单的代码来在 randomForest 函数的输出中绘制第一棵树吗? 我在下面为randomForest 包添加了一个答案;其他包,如party-允许类似的功能 【参考方案1】:

您可以使用cforest 绘制如下图,我已将该值硬编码为 5,您可以根据您的要求进行更改。

ntree <- 5
library("party")
cf <- cforest(Species~., data=iris,controls=cforest_control(ntree=ntree))

for(i in 1:ntree)
pt <- prettytree(cf@ensemble[[i]], names(cf@data@get("input"))) 
nt <- new("Random Forest BinaryTree") 
nt@tree <- pt 
nt@data <- cf@data 
nt@responses <- cf@responses 

pdf(file=paste0("filex",i,".pdf"))
plot(nt, type="simple")
dev.off()


cforest 是随机森林的另一种实现,不能说哪个更好,但总的来说我们可以看到的差异很少。不同之处在于cforest 使用条件推断,与randomForest 包相比,我们将更多权重放在终端节点上,而randomForest 包的实现为终端节点提供了相等的权重。

一般cofrest 使用加权平均值,randomForest 使用正常平均值。您可能需要检查this

【讨论】:

感谢您的回答。我想用randomForest,我可以用cforest代替randomForest吗?【参考方案2】:

可以使用randomForest包中的getTree()函数(官方指南:https://cran.r-project.org/web/packages/randomForest/randomForest.pdf)

iris 数据集上:

require(randomForest)
data(iris)

## we have a look at the k-th tree in the forest
k <- 10
getTree(randomForest(iris[, -5], iris[, 5], ntree = 10), k, labelVar = TRUE)

【讨论】:

如何绘制这棵树?请在上面的代码中添加绘图代码。谢谢 @Amin 上面的代码为您提供了选定的树 (k &lt;- 10)。如果您想将其可视化,则需要更多的努力(我不知道randomForest 中有任何直接绘图功能)。请看看这个shiring.github.io/machine_learning/2017/03/16/rf_plot_ggraph

以上是关于在 randomForest 包中绘制 500 棵树中的一棵的主要内容,如果未能解决你的问题,请参考以下文章

在 R 的 randomForest 包中,因子是不是必须明确标记为因子?

R的randomForest包中的缺失值错误

并行化 rfcv() 函数以在 randomForest 包中进行特征选择

R 中 h2o 包中的 predict.H2OModel() 是不是为 h2o.randomForest() 模型提供 OOB 预测?

R:从 h2o.randomForest() 和 h2o.gbm() 绘制树

如何对 RandomForest 进行二值化以在 python 中绘制 ROC?