【发布时间】:2022-02-06 10:24:17
【问题描述】:
已提出类似问题,例如here 和here,但其他问题均不适用于我的问题。我试图确定和计算决策树中每个节点中的观察值。但是,树结构来自我自己从 BART 包创建的树数据框。我从BART 包中提取树信息并将其转换为类似于下图所示的数据框(即df)。但我需要使用提供的数据框结构。另外:我相信我使用的方法,与我的数据框中的树如何绘制/排序有关,被称为“深度优先”。
例如,我的树数据框如下所示:
library(dplyr)
df <- tibble(variableName = c("x2", "x1", NA, NA, NA, "x2", NA, NA, "x5", "x4", NA, NA, "x3", NA, NA),
splitValue = c(0.542, 0.126, NA, NA, NA, 0.6547, NA, NA, 0.418, 0.234, NA, NA, 0.747, NA, NA),
treeNo = c(1,1,1,1,1,2,2,2,3,3,3,3,3,3,3))
在视觉上,这些树看起来像:
在向下遍历df 时,正在左前绘制树木。此外,所有拆分都是二进制拆分。所以每个节点都会有 2 个孩子。
所以,如果我们创建一些如下所示的数据:
set.seed(100)
dat <- data.frame( x1 = runif(10),
x2 = runif(10),
x3 = runif(10),
x4 = runif(10),
x5 = runif(10)
)
我试图找出dat 的哪些观察结果属于哪个节点?
尝试回答: 这并没有真正的帮助,但为了清楚起见(因为我仍在尝试解决这个问题),为树号 3 硬编码如下所示:
lists <- df %>% group_by(treeNo) %>% group_split()
tree<- lists[[3]]
namesDf <- names(dat[grepl(tree[1, ]$variableName, names(dat))])
dataLeft <- dat[dat[, namesDf] <= tree[1,]$splitValue, ]
dataRight <- dat[dat[, namesDf] > tree[1,]$splitValue, ]
namesDf <- names(dat[grepl(tree[2, ]$variableName, names(dat))])
dataLeft1 <- dataLeft[dataLeft[, namesDf] <= tree[2,]$splitValue, ]
dataRight1 <- dataLeft[dataLeft[, namesDf] > tree[2,]$splitValue, ]
namesDf <- names(dat[grepl(tree[5, ]$variableName, names(dat))])
dataLeft2 <- dataRight[dataRight[, namesDf] <= tree[5,]$splitValue, ]
dataRight2 <- dataRight[dataRight[, namesDf] > tree[5,]$splitValue, ]
我一直试图把它变成一个循环。但事实证明,锻炼很有挑战性。 而且我(显然)不能为每棵树硬编码它。关于如何解决这个问题的任何建议?
【问题讨论】:
-
为什么不在树的生长过程中计算给定节点中每个观察值的数量,并将其作为新变量添加到数据框中?我在编写决策树时就是这样做的。此外,我们不知道每个变量应该从树中取出的路径。例如,我们从
df看到,第一棵树在x1和x2上分裂了一次,但从数据帧中并不清楚按照哪个顺序,如果按顺序,ecc。 -
那么你应该提供更多关于你实际在做什么的信息。根据我们所拥有的,即使只绘制您所附的图片也是不可能的。你可以编辑你的帖子添加一个可重现的例子吗?
-
对于初学者,我将添加您从中提取树数据的几个不同的决策树包,以及至少一个您如何提取它们的示例。
-
我应该在我的问题中提到这一点。它是一棵二叉树,所以每个节点都会有两个孩子。我会将该信息添加到问题中
-
如果您使用 BART 生成树,请发布您的 BART 代码
标签: r decision-tree