rpart 中 CP 表给出的树大小
Posted
技术标签:
【中文标题】rpart 中 CP 表给出的树大小【英文标题】:Tree sizes given by CP table in rpart 【发布时间】:2015-03-07 21:00:36 【问题描述】:在 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)?
【问题讨论】:
【参考方案1】:rpart()
函数使用rpart.control()
函数进行控制。它具有诸如minsplit
之类的参数,它告诉函数仅在观察值多于指定值时才拆分,cp
告诉函数仅在整体不拟合减少cp
时才拆分.
如果您在上面的示例中查看summary(fit)
,它会显示nsplit
的所有值的统计信息。要在使用printcp(fit)
时打印这些值,您需要在调用原始rpart
函数时选择适当的cp
和minsplit
值。
【讨论】:
感谢您的回答,但我的印象是minsplit
和 cp
是在尝试交叉验证之前用于生长树的参数 - 而不是之后修剪它,这是我的问题和 CP 表指的是什么。如果我误解了你能告诉我为什么上面的输出只显示 nsplit = 0, 1, 4 以及 minsplit
和 cp
的适当值可能是显示 nsplit = 0, 1, 2, 3, 4?顺便说一句,summary(fit)
没有给我所有 nsplit 值的交叉验证统计信息 - 它显示的 CP 表与问题相同。【参考方案2】:
rpart 上的 cran-r 文档提到将选项 cp=0 添加到 rpart 函数。 http://cran.r-project.org/web/packages/rpart/vignettes/longintro.pdf 它还提到了可以在 rpart 函数中给出的其他选项,例如控制拆分的数量。
dfit <- rpart(y ~ x, method='class',
control = rpart.control(xval = 10, minbucket = 2, **cp = 0**))
【讨论】:
感谢您的回答,但如上所述,我相信minbucket
和cp
只会影响树的生长,不会影响之后的交叉验证修剪。在这种情况下,添加control = rpart.control(cp = 0)
不会更改问题中显示的 CP 表。
我不知道如何强制更多选项显示所有拆分。除非拆分有额外的收益,否则我认为 rpart 不会将其包含在输出中。此外,脊柱后凸是一个只有 81 个 obs 的小数据集。如果您看到带有以下选项的 CP 图,则 X 相对误差在 1 和 3 之间的可能性不大,因此完全不考虑 nsplit=2。 fit2
cp
是一个成本复杂性的超参数,因此它肯定会控制去修剪过程。使用 K-fold CV 时的算法将尝试最小化这个: $\sum_m = 1^|T| \ \sum_x_i \in R_m (y_i - \haty_R_m) ^ 2 + \alpha |T|$,其中 $|T|$ 是终端节点(叶子)的数量,$R_m$ 是矩形(特征空间的子集),$\haty_R_m $ 是落在 $R_m$ 区域的观测值的平均值。 $\alpha$ 这里是cp
。当您设置cp = 0
时,您只是在最小化 SSE,而不考虑修剪。资料来源:统计学习简介以上是关于rpart 中 CP 表给出的树大小的主要内容,如果未能解决你的问题,请参考以下文章
如何遍历R中rpart对象的树结构?我需要获取与子树关联的所有节点,我该怎么做?