警告那些稍后阅读本文的人......
我在树和图算法方面的背景意味着我希望这是一个简单的问题和一个简单的答案。但是,事实并非如此。
这在我来自的上下文中如何工作,比如说,函数 left 和 right 获取当前节点的左节点和右节点。因此 root(fit) 是根节点,left(root(fit)) 是根节点的左子节点。其他函数(例如 split(node))将提供有关节点中决策的信息。
然而,真正的答案是 - 几乎没有人使用 rpart,包括开发人员,认为决策树与这个意义上的树有任何关系。给出的大多数答案仅涉及以人类可读的形式将树打印为图表或文本。
有几个人问过这个问题,最好的答案是查看 getAnywere(summary.rpart),其中列出了生成树的文本版本的代码。这是相当肮脏的。
原始问题如下。
我有一个通过...获得的决策树
makeDecisionTree <- function(ndata, fp, fn) {
ctrl <- rpart.control( nobs = nrow(ndata), mincut = 2, minsize=20, maxdepth=20)
mytree <- rpart( formula = PredictedLabel ~ . ,
data=ndata,
minsplit=1,
method="class",
control = ctrl,
parms=list(split="information",
loss=matrix(c(0, fp, fn, 0),
byrow=TRUE, nrow=2)) )
return(mytree)
}
我可以将其打印出来并获得决策列表,例如 x>6,并且我可以了解树在做什么等等。但是,我看不到如何直接使用树结构 - 在程序控制下从根节点递归下降树的意义上。
我已经到了认真考虑将树打印到文本文件并解析结果文件以获得实际树结构的地步。因为这看起来有点荒谬——我假设我错过了一些东西。
我已经研究了类型的结构,并研究了分割矩阵等等。但是,我不清楚这些是如何产生树结构的。
最佳答案
这只是部分答案,但它是我继续前进所需线索的核心。我把它放在这里,以防其他人在遇到同样的问题时发现这个问题。
假设您通过...创建一棵拟合树
fit = rpart( ... )
然后fit$frame
是一个数据框,其行描述节点。行的名称是节点号。节点 n 的子节点是 2n 和 2n+1。这些列包括 var,它给出了节点代表的分割中使用的字段的名称。叶节点的名称为 <leaf>
.
在下面的例子中,1是根节点,子节点2=2*1+0
和3=2*1+1
。顶部节点在 MOB 上 split 。
var n wt dev yval complexity ncompete
1 MOB 121841 121841 295428 1 0.249854448 4
2 <leaf> 30302 30302 5514 1 0.000000000 0
3 MONTHS_TO 91539 91539 216100 2 0.205237824 4
6 MONTHS_TO 26002 26002 37842 1 0.092878806 4
12 <leaf> 18270 18270 1788 1 0.010000000 0
13 MONTHS_TO 7732 7732 8615 2 0.017249550 4
26 <leaf> 1622 1622 1644 1 0.010000000 0
27 <leaf> 6110 6110 1875 2 0.010000000 0
7 STAT_CD_1 65537 65537 117625 2 0.048749611 4
14 <leaf> 4724 4724 5028 1 0.000000000 0
15 DISCH 60813 60813 98195 2 0.019574990 4
30 SENDER 11248 11248 27522 1 0.014570386 4
60 PORT 10344 10344 22770 1 0.014570386 4
120 <leaf> 6878 6878 10908 1 0.005544498 0
121 <leaf> 3466 3466 7445 2 0.003743721 0
61 <leaf> 904 904 560 2 0.010000000 0
31 <leaf> 49565 49565 64890 2 0.000000000 0
有关更完整的说明,请参阅
https://henckr.github.io/distRforest/reference/rpart.object.html
但是你还需要这个
关于r - 如何从 rpart 对象中提取树结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70949689/