在 rpart.plot 中格式化拆分标签
format split labels in rpart.plot
我正在用 rpart.plot::prp()
绘制一棵树,很像:
library("rpart.plot")
data("ptitanic")
data <- ptitanic
data$sibsp <- as.integer(data$sibsp) # just to show that these are integers
data$age <- as.integer(data$age) # just to show that these are integers
tree <- rpart(survived~., data=data, cp=.02)
prp(tree, , fallen.leaves = FALSE, type=4, extra=1, varlen=0, faclen=0, yesno.yshift=-1)
即使某些变量是整数(age
和 sibsp
),rpart
也会创建一个看似任意的分割点,这会让观众感到困惑。船上没有人有 2.5 siblings/spouses -- 逻辑拆分是 sibsp >= 3
我看过 split.fun
这个优秀的 tutorial 和 ?prp
。除了使用正则表达式捕获数字、正确格式化并在标签字符串中替换它之外,我想不出 prp
.
中的任何解决方案
我正在考虑的一个解决方法是传递修改后的 tree
(class rpart
的对象),其中的内容已四舍五入。是否可以通过修改 tree$splits
?
来做到这一点
还有其他想法吗?
1) 有序因子 我认为 age
作为连续变量是可以的,但是要处理 sibsp
和 parch
使它们成为有序的因素:
data <- transform(data, sibsp = ordered(sibsp), parch = ordered(parch))
tree <- rpart(survived~., data=data, cp=.02)
prp(tree, , fallen.leaves = FALSE, type=4, extra=1, varlen=0, faclen=0, yesno.yshift=-1)
2) split.fun 另一种方法是像这样指定我们自己的 split.fun
:
# next 4 lines are same as in question
data <- ptitanic
data$sibsp <- as.integer(data$sibsp) # just to show that these are integers
data$age <- as.integer(data$age) # just to show that these are integers
tree <- rpart(survived~., data=data, cp=.02)
split.labs <- function(x, labs, digits, varlen, faclen) {
sapply(labs, function(lab)
if (grepl(">=|<", lab)) {
rhs <- sub(".* ", "", lab)
lab <- sub(rhs, ceiling(as.numeric(rhs)), lab)
} else lab)
}
prp(tree, , fallen.leaves = FALSE, type=4, extra=1, varlen=0, faclen=0, yesno.yshift=-1,
split.fun = split.labs) # same as in question except for split.fun= arg
这给出:
(2a) (2) 的一种变体提供了更多的控制,即可以精确指定要修改的变量,如下所示:
# next 4 lines are same as in question
data <- ptitanic
data$sibsp <- as.integer(data$sibsp) # just to show that these are integers
data$age <- as.integer(data$age) # just to show that these are integers
tree <- rpart(survived~., data=data, cp=.02)
split.labs2 <- function(x, labs, digits, varlen, faclen) {
sapply(labs, function(lab)
if (grepl("age|sibsp|parch", lab)) {
rhs <- sub(".* ", "", lab);
lab <- sub(rhs, ceiling(as.numeric(rhs)), lab)
} else lab)
}
# similar to (2) except we use clip.right.labs = FALSE and split.labs2
prp(tree, type = 4, fallen.leaves = FALSE, extra=1, varlen=0, faclen=0,
yesno.yshift=-1, clip.right.labs = FALSE, split.fun = split.labs2)
rpart.plot 包的 3.0.0 版(2018 年 7 月)专门处理具有整数值的预测变量,以自动获得您想要的结果。
所以 rpart.plot
现在自动打印 sibsp >= 3
而不是 sibsp >= 2.5
,因为它看到在训练数据中 sibsp
的所有值都是整数。
vignette for the rpart.plot package 的第 4.1 节有一个示例。
我正在用 rpart.plot::prp()
绘制一棵树,很像:
library("rpart.plot")
data("ptitanic")
data <- ptitanic
data$sibsp <- as.integer(data$sibsp) # just to show that these are integers
data$age <- as.integer(data$age) # just to show that these are integers
tree <- rpart(survived~., data=data, cp=.02)
prp(tree, , fallen.leaves = FALSE, type=4, extra=1, varlen=0, faclen=0, yesno.yshift=-1)
即使某些变量是整数(age
和 sibsp
),rpart
也会创建一个看似任意的分割点,这会让观众感到困惑。船上没有人有 2.5 siblings/spouses -- 逻辑拆分是 sibsp >= 3
我看过 split.fun
这个优秀的 tutorial 和 ?prp
。除了使用正则表达式捕获数字、正确格式化并在标签字符串中替换它之外,我想不出 prp
.
我正在考虑的一个解决方法是传递修改后的 tree
(class rpart
的对象),其中的内容已四舍五入。是否可以通过修改 tree$splits
?
还有其他想法吗?
1) 有序因子 我认为 age
作为连续变量是可以的,但是要处理 sibsp
和 parch
使它们成为有序的因素:
data <- transform(data, sibsp = ordered(sibsp), parch = ordered(parch))
tree <- rpart(survived~., data=data, cp=.02)
prp(tree, , fallen.leaves = FALSE, type=4, extra=1, varlen=0, faclen=0, yesno.yshift=-1)
2) split.fun 另一种方法是像这样指定我们自己的 split.fun
:
# next 4 lines are same as in question
data <- ptitanic
data$sibsp <- as.integer(data$sibsp) # just to show that these are integers
data$age <- as.integer(data$age) # just to show that these are integers
tree <- rpart(survived~., data=data, cp=.02)
split.labs <- function(x, labs, digits, varlen, faclen) {
sapply(labs, function(lab)
if (grepl(">=|<", lab)) {
rhs <- sub(".* ", "", lab)
lab <- sub(rhs, ceiling(as.numeric(rhs)), lab)
} else lab)
}
prp(tree, , fallen.leaves = FALSE, type=4, extra=1, varlen=0, faclen=0, yesno.yshift=-1,
split.fun = split.labs) # same as in question except for split.fun= arg
这给出:
(2a) (2) 的一种变体提供了更多的控制,即可以精确指定要修改的变量,如下所示:
# next 4 lines are same as in question
data <- ptitanic
data$sibsp <- as.integer(data$sibsp) # just to show that these are integers
data$age <- as.integer(data$age) # just to show that these are integers
tree <- rpart(survived~., data=data, cp=.02)
split.labs2 <- function(x, labs, digits, varlen, faclen) {
sapply(labs, function(lab)
if (grepl("age|sibsp|parch", lab)) {
rhs <- sub(".* ", "", lab);
lab <- sub(rhs, ceiling(as.numeric(rhs)), lab)
} else lab)
}
# similar to (2) except we use clip.right.labs = FALSE and split.labs2
prp(tree, type = 4, fallen.leaves = FALSE, extra=1, varlen=0, faclen=0,
yesno.yshift=-1, clip.right.labs = FALSE, split.fun = split.labs2)
rpart.plot 包的 3.0.0 版(2018 年 7 月)专门处理具有整数值的预测变量,以自动获得您想要的结果。
所以 rpart.plot
现在自动打印 sibsp >= 3
而不是 sibsp >= 2.5
,因为它看到在训练数据中 sibsp
的所有值都是整数。
vignette for the rpart.plot package 的第 4.1 节有一个示例。