如何从 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+0
和 3=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
警告那些稍后阅读此内容的人...
我在树和图算法方面的背景意味着我希望这是一个简单的问题和一个简单的答案。但是,它不是。
这在我来自的上下文中是如何工作的,比如说,函数 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+0
和 3=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