在rpart.plot中格式化分割标签

时间:2016-02-18 19:43:11

标签: r rpart

我正在使用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)

enter image description here

即使某些变量是整数(agesibsp),rpart也会创建一个看似随意的分割点,这会使观看者感到困惑。没有人在船上有2.5个兄弟姐妹/配偶 - 合乎逻辑的分裂是sibsp >= 3

我在这个出色的tutorialsplit.fun中看过?prp。除了使用正则表达式捕获数字,正确格式化,并在标签字符串中替换它,我无法想到prp内的任何解决方案。

我正在考虑的一种解决方法是传递修改后的tree(类rpart的对象),其内容已被舍入。是否可以通过修改tree$splits来完成此操作?

还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

1)有序因素我认为sibsp可以作为连续变量,但要处理parchdata <- 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) 使它们成为有序因子:

split.fun

screenshot

2)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 ,如下所示:

# 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)

这给出了:

screenshot

(2a)(2)的变体给出了更多的控制,即可以精确指定要修改的变量,如下:

{{1}}

screenshot

答案 1 :(得分:1)

rpart.plot软件包的3.0.0版本(2018年7月)特别对待具有整数值的预测变量,以自动获得所需的结果。

因此rpart.plot现在自动打印sibsp >= 3而不是sibsp >= 2.5,因为它看到在训练数据中sibsp的所有值都是整数。

vignette for the rpart.plot package的第4.1节有一个示例。