gpt4 book ai didi

r - 计算 R 中决策树中的拆分规则

转载 作者:行者123 更新时间:2023-12-05 05:45:46 25 4
gpt4 key购买 nike

我正在尝试从 R 中的决策树数据框中计算每个唯一的拆分规则。例如,如果我有一个包含 4 棵树的数据框,如下所示:

df <- data.frame(
var = c('x10', NA, NA,
'x10', NA, 'x7', NA, NA,
'x5', 'x2', NA, NA, 'x9', NA, NA,
'x5', NA, NA),
num = c(1,1,1,
2,2,2,2,2,
1,1,1,1,1,1,1,
2,2,2),
iter = c(rep(1, 8), rep(2, 10))
)

> df
var num iter
1 x10 1 1
2 <NA> 1 1
3 <NA> 1 1
4 x10 2 1
5 <NA> 2 1
6 x7 2 1
7 <NA> 2 1
8 <NA> 2 1
9 x5 1 2
10 x2 1 2
11 <NA> 1 2
12 <NA> 1 2
13 x9 1 2
14 <NA> 1 2
15 <NA> 1 2
16 x5 2 2
17 <NA> 2 2
18 <NA> 2 2

var 列包含拆分规则中使用的变量名称,并按深度优先 排序。因此,例如,根据该数据创建的 4 棵树将如下所示:

decision trees

我试图找到一种方法来返回拆分规则中使用的每对变量的计数,但按 iter 分组。例如,如果我们查看第二棵树(即 num == 2iter == 1),我们可以看到 x7 split 在 x10 上。因此,当 iter == 1 时,x10:x7 对出现 1 次。

我想要的输出看起来像这样:

 allSplits count iter
1 x10:x7 1 1
2 x5:x2 1 2
3 x5:x9 1 2

关于我如何做到这一点有什么建议吗?

最佳答案

可能有一个包知道如何对这种数据框进行操作,但也许这两个手工制作的递归函数可以帮助您入门。

mkTree <- function(x, pos = 1L) {
var <- x[pos]
if (is.na(var)) {
list(NA_character_, NULL, NULL, 1L)
} else {
node <- vector("list", 4L)
node[[1L]] <- var
node[[2L]] <- l <- Recall(x, pos + 1L)
node[[3L]] <- r <- Recall(x, pos + 1L + l[[4L]])
node[[4L]] <- 1L + l[[4L]] + r[[4L]]
node
}
}
tabTree <- function(tree, sep = ":") {
x <- rep.int(NA_character_, tree[[4L]])
pos <- 1L
recurse <- function(subtree) {
var1 <- subtree[[1L]]
if (!is.na(var1)) {
for (i in 2:3) {
var2 <- subtree[[c(i, 1L)]]
if (!is.na(var2)) {
x[pos] <<- paste0(var1, sep, var2)
pos <<- pos + 1L
Recall(subtree[[i]])
}
}
}
}
recurse(tree)
x <- x[!is.na(x)]
if (length(x)) {
x <- factor(x)
setNames(tabulate(x), levels(x))
} else {
integer(0L)
}
}

mkTree 将数据框中指定树的 var 段转换为递归列表。这些递归结构中的节点具有以下形式:

list(variable_name, left_node, right_node, subtree_size)

tabTree 采用 mkTree 结果并返回一个命名的整数向量,列出了拆分。所以你可以做

f <- function(x) tabTree(mkTree(x))
L <- tapply(df[["var"]], df[c("num", "iter")], f, simplify = FALSE)

获取一个列表矩阵,为每个 [num, iter] 对(即,对于每棵树)存储列表拆分。

L
## iter
## num 1 2
## 1 integer,0 integer,2
## 2 1 integer,0

L[2L, 1L]
## [[1]]
## x10:x7
## 1

L[1L, 2L]
## [[1]]
## x5:x2 x5:x9
## 1 1

您可以对 num 求和以获得每个 iter 级别的表格拆分。

g <- function(l) {
x <- unlist(unname(l))
tapply(x, names(x), sum)
}
apply(L, 2L, g)
## $`1`
## x10:x7
## 1

## $`2`
## x5:x2 x5:x9
## 1 1

关于r - 计算 R 中决策树中的拆分规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71301581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com