R包“树”:如何控制最大树深度?

Posted

技术标签:

【中文标题】R包“树”:如何控制最大树深度?【英文标题】:R package "tree": how to control the maximum tree depth? 【发布时间】:2015-10-11 12:51:38 【问题描述】:

R 包“tree”将最大树深度限制为 31。如果将函数 tree 应用于大型数据集,则很容易达到此限制:

> library("tree")
> library("ElemStatLearn")
> data <- list(image=as.matrix(zip.train[,-1]), digit=as.factor(zip.train[,1]))
> t <- tree(digit~image, data, split="gini")
Error in tree(digit ~ image, data, split = "gini") : 
  maximum depth reached
Calls: source -> withVisible -> eval -> eval -> tree -> .C

有没有办法告诉tree 在达到最大树深度时停止生长树,而不是因错误而中止? (换句话说:rpart.controlmaxdepth 参数是否有等价物?)

【问题讨论】:

查看?tree?tree.control设置参数。 我阅读了帮助页面,但没有找到相关参数。也许我忽略了什么? 这有没有解决? @Vincent 我个人的结论是使用“rpart”而不是“tree”。 @Vincent tree 和 rpart 是两个相互竞争的包,它们都可以构建分类树。他们做事略有不同,通过实验,我(或者更确切地说是我的一个学生)得到的印象是 rpart 通常看起来比 tree 更精致。所以我的结论是:停止使用 tree 包,开始使用 rpart 包。 rpart 的文档在这里:cran.r-project.org/web/packages/rpart/rpart.pdf 【参考方案1】:

我同意@jochen 的建议,即rpart 包似乎比tree 包更精致。但是,tree 包似乎在一些小事情上做得更好。 例如,为tree 对象绘制决策边界要比为rpart 对象绘制决策边界要容易得多(尤其是使用ggplot)。 关于文森特的问题,我通过使用tree.control(min.cut=) 选项控制tree 树的深度取得了一些有限的成功,如下面的代码所示。通过更改终端节点中元素的最小数量,您可以对深度进行有限控制。

library("ElemStatLearn")
 library("tree")
 data <- list(image=as.matrix(zip.train[,-1]), digit=as.factor(zip.train[,1]))
 t <- tree(digit~image, data, split="gini", control=tree.control(1866496, mincut = 1000))
 library(maptree)
 draw.tree(t)

【讨论】:

以上是关于R包“树”:如何控制最大树深度?的主要内容,如果未能解决你的问题,请参考以下文章

获取每个节点的最大树深度

如何使用 Matlab fitcensemble 控制树弱学习器的深度

二叉树基本概念

R基于H2O包构建深度学习模型实战

543-求二叉树直径

堆排序