根据 rpart 文档,参数“cp”起着以下作用:“不会尝试任何不会将整体失配度降低 cp 的分割。” 这听起来好像这些分裂根本不会进入树。
但是,我相信我下面的例子与此相矛盾。我相信实际发生的是 rpart 树在不考虑 cp 的情况下增长到很大,然后使用参数 cp 使用成本复杂性/最弱链接修剪进行修剪。这被广泛认为是构建树的“更好”方式,但它与文档相矛盾。
有没有其他人经历过这种差异?我错过了什么吗?
谢谢!
#### Generate some simple data
set.seed(5)
X1 <-runif(100,-1,1)
X2 <- runif(100,-1,1)
y <- 2*(X1 > 0 & X2 < 0) + 2*(X1 < 0 & X2 > 0) - 2*(X1 > 0 & X2 > 0) - 2*(X1 < 0 & X2 < 0) + rnorm(100, sd=1)
#### A tree with no cp used.
tree2 <- rpart(y ~ X1 + X2, control=rpart.control(cp=0),
method="anova")
### According to both my own calculations and the "improve" column in tree2$splits,
### the first split only improves the fit by 0.0262.
tree2$splits[1,]
SST <- sum((y - mean(y))^2)
SSE1split <- sum((y[X1 >= -0.4404514] - mean(y[X1 >= -0.4404514]))^2) +
sum((y[X1 < -0.4404514] - mean(y[X1 < -0.4404514]))^2)
(SST - SSE1split)/SST
tree2$splits[2,]
### From my understanding of the documentation, this means that if cp=0.05, rpart should
### not even attempt the first split. But it does!
rpart(y ~ X1 + X2, control=rpart.control(cp=0.05),
method="anova")
此外,超过 10,000 次试验,以下两个命令总是返回相同的树,但我相信文档使它看起来好像它们应该不同(可能)。
rpart(y ~ X, cp=0.02)
prune(rpart(y ~ X, cp=0), cp=0.02)