反向 "inequality sign" 在 rpart 或 partykit 内置的决策树中呈现顺序
reverse "inequality sign" presenting order in decision tree built in rpart or partykit
我已经使用 rpart
构建了一个多层决策树,我正在尝试使用 partykit
包复制树结构,更具体地说,partysplit
-partynode
组合。
我目前对 rpart
和 partysplit
之间的顺序差异有疑问。
来自rpart
的决策树总是先"greater than"符号(>)然后"less than"符号(<)在下面,而partykit
则相反。
例如,rpart
输出
[6] value.a >= 33: FALSE. (n = 63, err = 33.3%)
[7] value.a< 33: FALSE. (n = 74, err = 8.1%)
对比partykit
输出
[6] value.a < 33: FALSE. (n = 74, err = 8.1%)
[7] value.a >= 33: FALSE. (n = 63, err = 33.3%)
因此,我无法按正确顺序读取决策树并使用 partykit
从 rpart
重新创建树。
有没有一种方法可以从 rpart
创建一棵树,比如树先取 "less than" 符号,或者在 partysplit
上有一个选项,这样你就可以进行拆分先拿"greater than"标志?
partysplit()
构造函数提供参数index
和right
可用于创建所有组合。 index
控制间隔的左侧部分是第一个还是第二个。 right
参数控制等号的位置。对于一个简单的虚拟数据集:
d <- data.frame(x = 1:10)
我们可以为组合创建所有:
sp1 <- partysplit(1L, 5.5, index = 1:2, right = TRUE)
sp2 <- partysplit(1L, 5.5, index = 2:1, right = TRUE)
sp3 <- partysplit(1L, 5.5, index = 1:2, right = FALSE)
sp4 <- partysplit(1L, 5.5, index = 2:1, right = FALSE)
那么对应的字符标签可以计算为:
character_split(sp1, d)$levels
## [1] "<= 5.5" "> 5.5"
character_split(sp2, d)$levels
## [1] "> 5.5" "<= 5.5"
character_split(sp3, d)$levels
## [1] "< 5.5" ">= 5.5"
character_split(sp4, d)$levels
## [1] ">= 5.5" "< 5.5"
rpart
对象的 as.party()
方法试图保留这一点。例如:
library("partykit")
library("rpart")
iris2 <- iris[1:100,]
rp <- rpart(Species ~ ., data = iris2)
rp
## n= 100
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 100 50 setosa (0.5000000 0.5000000)
## 2) Petal.Length< 2.45 50 0 setosa (1.0000000 0.0000000) *
## 3) Petal.Length>=2.45 50 0 versicolor (0.0000000 1.0000000) *
as.party(rp)
## Model formula:
## Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
##
## Fitted party:
## [1] root
## | [2] Petal.Length < 2.45: setosa (n = 50, err = 0.0%)
## | [3] Petal.Length >= 2.45: versicolor (n = 50, err = 0.0%)
##
## Number of inner nodes: 1
## Number of terminal nodes: 2
我已经使用 rpart
构建了一个多层决策树,我正在尝试使用 partykit
包复制树结构,更具体地说,partysplit
-partynode
组合。
我目前对 rpart
和 partysplit
之间的顺序差异有疑问。
来自rpart
的决策树总是先"greater than"符号(>)然后"less than"符号(<)在下面,而partykit
则相反。
例如,rpart
输出
[6] value.a >= 33: FALSE. (n = 63, err = 33.3%)
[7] value.a< 33: FALSE. (n = 74, err = 8.1%)
对比partykit
输出
[6] value.a < 33: FALSE. (n = 74, err = 8.1%)
[7] value.a >= 33: FALSE. (n = 63, err = 33.3%)
因此,我无法按正确顺序读取决策树并使用 partykit
从 rpart
重新创建树。
有没有一种方法可以从 rpart
创建一棵树,比如树先取 "less than" 符号,或者在 partysplit
上有一个选项,这样你就可以进行拆分先拿"greater than"标志?
partysplit()
构造函数提供参数index
和right
可用于创建所有组合。 index
控制间隔的左侧部分是第一个还是第二个。 right
参数控制等号的位置。对于一个简单的虚拟数据集:
d <- data.frame(x = 1:10)
我们可以为组合创建所有:
sp1 <- partysplit(1L, 5.5, index = 1:2, right = TRUE)
sp2 <- partysplit(1L, 5.5, index = 2:1, right = TRUE)
sp3 <- partysplit(1L, 5.5, index = 1:2, right = FALSE)
sp4 <- partysplit(1L, 5.5, index = 2:1, right = FALSE)
那么对应的字符标签可以计算为:
character_split(sp1, d)$levels
## [1] "<= 5.5" "> 5.5"
character_split(sp2, d)$levels
## [1] "> 5.5" "<= 5.5"
character_split(sp3, d)$levels
## [1] "< 5.5" ">= 5.5"
character_split(sp4, d)$levels
## [1] ">= 5.5" "< 5.5"
rpart
对象的 as.party()
方法试图保留这一点。例如:
library("partykit")
library("rpart")
iris2 <- iris[1:100,]
rp <- rpart(Species ~ ., data = iris2)
rp
## n= 100
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 100 50 setosa (0.5000000 0.5000000)
## 2) Petal.Length< 2.45 50 0 setosa (1.0000000 0.0000000) *
## 3) Petal.Length>=2.45 50 0 versicolor (0.0000000 1.0000000) *
as.party(rp)
## Model formula:
## Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
##
## Fitted party:
## [1] root
## | [2] Petal.Length < 2.45: setosa (n = 50, err = 0.0%)
## | [3] Petal.Length >= 2.45: versicolor (n = 50, err = 0.0%)
##
## Number of inner nodes: 1
## Number of terminal nodes: 2