rpart中CP表给出的树大小

9
在R包rpart中,决策树CP表中呈现的树的大小取决于什么?在下面的示例中,CP表默认仅呈现具有1、2和5个节点的树(分别为nsplit = 0、1和4)。
library(rpart)   
fit <- rpart(Kyphosis ~ Age + Number + Start, method="class", data=kyphosis)
> printcp(fit) 

Classification tree:
rpart(formula = Kyphosis ~ Age + Number + Start, data = kyphosis, 
method = "class")

Variables actually used in tree construction:
[1] Age   Start

Root node error: 17/81 = 0.20988

n= 81 

        CP nsplit rel error  xerror    xstd
1 0.176471      0   1.00000 1.00000 0.21559
2 0.019608      1   0.82353 0.94118 0.21078
3 0.010000      4   0.76471 0.94118 0.21078

rpart()是否有确定呈现树大小的内在规则?是否可以强制printcp()返回所有可能树大小的交叉验证统计数据,例如,对于上述示例,还包括具有3个和4个节点(nsplit = 2、3)的树行?

2个回答

3
rpart()函数是使用rpart.control()函数控制的。它有一些参数,例如minsplit,告诉函数仅在观察值大于指定值时才进行分割,cp则告诉函数仅在总体拟合不足减少了cp倍数时才进行分割。 如果您查看上面示例中的summary(fit),它将显示所有nsplit值的统计信息。要在使用printcp(fit)时打印这些值,需要在调用原始rpart函数时选择适当的cpminsplit值。

谢谢您的回答,但我认为minsplitcp是用于在尝试交叉验证之前生长树的参数,而不是之后修剪它,这就是我的问题和CP表所涉及的内容。如果我误解了,您能否建议为什么上面的输出仅呈现nsplit = 0、1、4以及适当的minsplitcp值可能是呈现nsplit = 0、1、2、3、4?顺便说一句,summary(fit)没有为所有nsplit值提供交叉验证统计数据-它显示的CP表与问题相同。 - alopex
它不显示那些分割 (nsplit = 2,3),因为它们无法改善错误分类率。 - jtr13

1

1
感谢您的答复,但正如前面所说,我相信minbucketcp仅影响树的生长过程,而不是随后进行的交叉验证剪枝。在这种情况下,添加control = rpart.control(cp = 0)并没有改变问题中呈现的CP表。 - alopex
我不知道如何强制显示所有拆分的更多选项。除非在拆分中有额外的收益,否则我认为rpart不会将其包含在输出中。此外,Kyphosis是一个仅有81个观测值的小数据集。如果您使用下面的选项查看CP图表,则X相对误差在1和3之间几乎没有机会,因此nsplit = 2也不被考虑在内。 fit2 <- rpart(Kyphosis ~ Age + Number + Start,data=kyphosis, method="class",control=rpart.control(minsplit=8))
rsq.rpart(fit2)
- Amrita Sawant
cp是成本复杂度的超参数,因此它肯定控制了剪枝过程。当使用K折交叉验证算法时,将尝试最小化以下内容: $\sum_{m = 1}^{|T|} \ \sum_{x_i \in R_m} (y_i - \hat{y}{R_m}) ^ 2 + \alpha |T|$,其中$|T|$是终端节点(叶子)的数量,$R_m$是矩形(特征空间的子集),$\hat{y}{R_m}$是落在$R_m$区域内的观测值的平均值。这里的$\alpha$就是cp。当您设置cp = 0时,只会最小化SSE,而不考虑剪枝。 - igorkf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接