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 函数时选择适当的cpminsplit 值。

【讨论】:

感谢您的回答,但我的印象是 minsplitcp 是在尝试交叉验证之前用于生长树的参数 - 而不是之后修剪它,这是我的问题和 CP 表指的是什么。如果我误解了你能告诉我为什么上面的输出只显示 nsplit = 0, 1, 4 以及 minsplitcp 的适当值可能是显示 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**))

【讨论】:

感谢您的回答,但如上所述,我相信minbucketcp 只会影响树的生长,不会影响之后的交叉验证修剪。在这种情况下,添加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 表给出的树大小的主要内容,如果未能解决你的问题,请参考以下文章

rpart更改节点中的文本大小

如何遍历R中rpart对象的树结构?我需要获取与子树关联的所有节点,我该怎么做?

R:更改绘图大小

使用 rpart 为决策树修剪选择 CP 值

为啥 plotcp() 图表中的 cp 值是从原始表中修改的?

使用 rpart 生成 sankey 图的决策树