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

标签 r rpart

警告那些稍后阅读本文的人......

我在树和图算法方面的背景意味着我希望这是一个简单的问题和一个简单的答案。但是,事实并非如此。

这在我来自的上下文中如何工作,比如说,函数 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+03=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: Extracting Rules from a Decision Tree

关于r - 如何从 rpart 对象中提取树结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70949689/

相关文章:

r - 多子集延迟

r - 在 R xgboost 包上拟合模型后,如何释放 GPU 内存?

r - 格式为 : 20120405 的日期

R 插入符包 (rpart) : constructing a classification tree

r - 如何在插入符号包中制作 TreeMap ?

r - 如何使用rpart中的所有功能?

r - 当条目本身的值为零且条目之前的条目为 0 时,跳过 Paste0 条目

r - 如何将 tibble 元素映射到 ggplot2 美学?

Rpart 与插入符 rpart "Error: There were missing values in resampled performance measures"

rpart节点赋值