rpart 包中的修剪,以及参数“cp”

问题描述

根据 rpart 文档,参数“cp”起到以下作用:“不会尝试任何不会将整体不匹配减少 cp 因子的拆分。”这听起来好像这些分裂根本不会进入树。

但是,我相信我下面的示例与此相矛盾。我相信实际发生的是 rpart 树在不考虑 cp 的情况下增长到很大,然后使用参数 cp 使用成本复杂性/最弱链接修剪进行修剪。这被广泛认为是构建树的“更好”方式,但它与文档相矛盾。

有其他人遇到过这种差异吗?我错过了什么吗??

谢谢!

#### Generate some simple data
set.seed(5)
X1 <-runif(100,-1,1)
X2 <- runif(100,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)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)