如何从 rpart 对象中提取树结构?

How to extract the tree structure from an rpart object?

警告那些稍后阅读此内容的人...

我在树和图算法方面的背景意味着我希望这是一个简单的问题和一个简单的答案。但是,它不是。

这在我来自的上下文中是如何工作的,比如说,函数 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的children为2n和2n+1。这些列包括 var,它给出了节点所代表的拆分中使用的字段的名称。叶节点的名称为 <leaf>.

在下面的示例中,1 是根节点,child 个节点 2=2*1+03=2*1+1。顶级节点在 MOB 上分裂。

               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: Extracting Rules from a Decision Tree