首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何判断ctree是否只是根节点?

如何判断ctree是否只是根节点?
EN

Stack Overflow用户
提问于 2015-03-30 01:44:09
回答 2查看 1.2K关注 0票数 0

假设我适合这样的模特:

代码语言:javascript
复制
ctree(Age ~ Kyphosis, data = kyphosis, mincriterion = 1)

我怎么能得到分裂的数目?我怎么知道它是否只是一个根节点?

编辑:

使用的包:

代码语言:javascript
复制
library(caret)
library(party)
library(partykit)
library(plyr)
library(xtable)

当我尝试使用tree.size时出错,如下所示:

代码语言:javascript
复制
> tree.size(ctree(Age ~ Kyphosis, data = kyphosis, mincriterion = 1)@tree)
Error in tree.size(ctree(Age ~ Kyphosis, data = kyphosis, mincriterion = 1)@tree) : 
  trying to get slot "tree" from an object (class "constparty") that is not an S4 object 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-30 02:07:45

从各方包文档来看,拟合模型中的tree槽是树的递归表示。您可以构建自己的递归函数来确定树的大小:

代码语言:javascript
复制
tree.size <- function(tree) {
  if (is.null(tree)) {
    return(0)
  } else {
    return(1 + tree.size(tree$left) + tree.size(tree$right))
  }
}

我们可以使用只包含根节点的树和具有多个节点的树来测试函数:

代码语言:javascript
复制
library(rpart)  # for kyphosis
library(party)  # for ctree
mod1 <- ctree(Age ~ Kyphosis, data = kyphosis)
tree.size(mod1@tree)
# [1] 1
mod2 <- ctree(Petal.Width~., data=iris)
tree.size(mod2@tree)
# [1] 11

更新:基于更新的问题,OP实际上使用的是partykit:::ctree函数而不是party:::ctree函数。事实证明,获得树的大小要容易得多,因为返回的模型是节点的列表,所以所需的只是length函数。

代码语言:javascript
复制
library(partykit)
mod1 <- partykit:::ctree(Age ~ Kyphosis, data = kyphosis)
length(mod1)
# [1] 1
mod2 <- partykit:::ctree(Petal.Width~., data=iris)
length(mod2)
# [1] 11
票数 2
EN

Stack Overflow用户

发布于 2015-03-30 13:27:48

这个问题的其他答案/讨论没有什么问题,我只是想增加一些细节/上下文,以防其他用户遇到相同或类似的问题。

虽然在旧的ctree()包和新的partykit包中的许多方面保持不变,以便简化转换,但几乎所有的R和C代码都被重写和简化,内部表示完全是新的。旧的ctree()返回了一个S4对象,它不够灵活,不能满足我们想要做的所有事情。新的ctree()函数返回继承于一般"party"类的类"constparty"对象(用于递归分区,每个节点中具有常量fit )。

节点数可以用length()方法查询,终端节点数可以用width()方法查询。节点数也在print()方法中报告。最后,可以通过nodeids()查询节点ID。对于只有根节点的树:

代码语言:javascript
复制
data("kyphosis", package = "rpart")
library("partykit")

ct1 <- ctree(Age ~ ., data = kyphosis)
length(ct1)

[1] 1

width(ct1)

[1] 1

一棵更大的树:

代码语言:javascript
复制
(ct2 <- ctree(Number ~ ., data = kyphosis))

Model formula:
Number ~ Kyphosis + Age + Start

Fitted party:
[1] root
|   [2] Start <= 15: 4.475 (n = 59, err = 152.7)
|   [3] Start > 15: 2.909 (n = 22, err = 17.8)

Number of inner nodes:    1
Number of terminal nodes: 2

length(ct2)

[1] 3

width(ct2)

[1] 2

nodeids(ct2)

[1] 1 2 3

nodeids(ct2, terminal = TRUE)

[1] 2 3

一揽子小插曲还提供了许多其他有用的细节。vignette("partykit", package = "partykit")对包及其类做了一般性介绍;vignette("constparty", package = "partykit")用常量拟合描述树类;vignette("ctree", package = "partykit")提供了关于ctree()的其他详细信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29337193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档