gpt4 book ai didi

r - 如何在 R 编程中指定决策树中的分割?

转载 作者:行者123 更新时间:2023-11-30 08:32:32 25 4
gpt4 key购买 nike

我正在尝试在这里应用决策树。决策树负责每个节点本身的 split 。但在第一个节点,我想根据“年龄”来分割我的树。我该如何强制这样做。?

library(party)    
fit2 <- ctree(Churn ~ Gender + Age + LastTransaction + Payment.Method + spend + marStat, data = tsdata)

最佳答案

ctree() 中没有内置选项可以执行此操作。 “手动”执行此操作的最简单方法很简单:

  1. 学习一棵仅使用 Age 作为解释变量和 maxdepth = 1 的树,这样只会创建一个分割。

  2. 使用第 1 步中的树分割数据,并为左分支创建一个子树。

  3. 使用第 1 步中的树拆分数据,并为右侧分支创建子树。

这可以满足您的要求(尽管我通常不建议这样做......)。

如果您使用 partykit 中的 ctree() 实现,您还可以将这三棵树再次合并为一棵树,以进行可视化和预测等。这需要一些黑客攻击,但仍然可行。

我将使用iris 数据来说明这一点,并且我将强制对变量Sepal.Length 进行分割,否则该变量将不会在树中使用。学习上面的三棵树很容易:

library("partykit")
data("iris", package = "datasets")
tr1 <- ctree(Species ~ Sepal.Length, data = iris, maxdepth = 1)
tr2 <- ctree(Species ~ Sepal.Length + ., data = iris,
subset = predict(tr1, type = "node") == 2)
tr3 <- ctree(Species ~ Sepal.Length + ., data = iris,
subset = predict(tr1, type = "node") == 3)

但请注意,使用带有 Sepal.Length + . 的公式非常重要,以确保模型框架中的变量在所有树中以完全相同的方式排序。

接下来是最具技术性的步骤:我们需要从所有三棵树中提取原始node结构,修复节点id,以便它们位于正确的顺序,然后将所有内容集成到单个节点中:

fixids <- function(x, startid = 1L) {
id <- startid - 1L
new_node <- function(x) {
id <<- id + 1L
if(is.terminal(x)) return(partynode(id, info = info_node(x)))
partynode(id,
split = split_node(x),
kids = lapply(kids_node(x), new_node),
surrogates = surrogates_node(x),
info = info_node(x))
}

return(new_node(x))
}
no <- node_party(tr1)
no$kids <- list(
fixids(node_party(tr2), startid = 2L),
fixids(node_party(tr3), startid = 5L)
)
no
## [1] root
## | [2] V2 <= 5.4
## | | [3] V4 <= 1.9 *
## | | [4] V4 > 1.9 *
## | [5] V2 > 5.4
## | | [6] V4 <= 4.7
## | | | [7] V4 <= 3.6 *
## | | | [8] V4 > 3.6 *
## | | [9] V4 > 4.7
## | | | [10] V5 <= 1.7 *
## | | | [11] V5 > 1.7 *

最后,我们建立了一个包含所有数据的联合模型框架,并将其与新的联合树相结合。添加了有关拟合节点和响应的一些信息,以便能够将树转变为 constparty,以实现良好的可视化和预测。请参阅 vignette("partykit", package = "partykit") 了解相关背景:

d <- model.frame(Species ~ Sepal.Length + ., data = iris)
tr <- party(no,
data = d,
fitted = data.frame(
"(fitted)" = fitted_node(no, data = d),
"(response)" = model.response(d),
check.names = FALSE),
terms = terms(d),
)
tr <- as.constparty(tr)

然后我们就完成了,可以通过强制第一次分割来可视化我们的组合树:

plot(tr)

combined tree

关于r - 如何在 R 编程中指定决策树中的分割?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39844830/

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