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

时间:2016-06-09 08:47:27

标签: r decision-tree rpart

据我所知,选择CP值的常见做法是选择具有最小xerror值的最低级别。但是,在我的以下情况中,使用cp <- fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"]会给我0.17647059,这将导致在修剪此值后没有拆分或只是root。

> myFormula <- Kyphosis~Age+Number+Start
> set.seed(1)
> fit <- rpart(myFormula,data=data,method="class",control=rpart.control(minsplit=20,xval=10,cp=0.01))
> fit$cptable
          CP nsplit rel error   xerror      xstd
1 0.17647059      0 1.0000000 1.000000 0.2155872
2 0.01960784      1 0.8235294 1.000000 0.2155872
3 0.01000000      4 0.7647059 1.058824 0.2200975

是否还有其他选择/良好做法来选择CP值?

2 个答案:

答案 0 :(得分:1)

通常,像你所拥有的cptable一样,警告树可能完全没用,可能无法很好地概括为未来的数据。所以答案不是要找到另一种选择cp的方法,而是要创建一个有用的树,如果你可以,或者承认失败,并说基于我们拥有的例子和特征,我们不能创建一个可预测脊柱后凸的模型

在你的情况下,一切都不是 - 必然 - 丢失。数据非常小,导致xerror列的交叉验证非常不稳定。如果你将种子播种到2或3,你会在该栏中看到非常不同的答案(有些甚至更糟)。

因此,对此数据感兴趣的一件事是将交叉验证折叠的数量增加到观察数量(以便获得LOOCV)。如果你这样做:

myFormula <- Kyphosis ~ Age + Number + Start
rpart_1 <- rpart(myFormula, data = kyphosis,
                 method = "class", 
                 control = rpart.control(minsplit = 20, xval = 81, cp = 0.01))
rpart_1$cptable

你会发现一个你会更喜欢的CP表! (请注意,由于折叠每次都相同,因此不再需要设置种子。)

答案 1 :(得分:1)

通常(并考虑到简约性),您应该首选xstrong值最小的那些中的较小树,即xerror值在之内以内的任何树[min (xerror)-xstd; min(xerror)+ xstd]。

根据rpart插图:“在达到的最小值的一个标准误差内的任何风险都标记为等于最小值(即,被认为是平坦高原的一部分)。然后是所有“绑在一起”的最简单的模型在高原上被选中。”

请参阅:https://stackoverflow.com/a/15318542/2052738

您可以使用以下临时功能选择最合适的cp值(以修剪最初的your.tree,以rpart过度拟合):

cp.select <- function(big.tree) {
  min.x <- which.min(big.tree$cptable[, 4]) #column 4 is xerror
  for(i in 1:nrow(big.tree$cptable)) {
    if(big.tree$cptable[i, 4] < big.tree$cptable[min.x, 4] + big.tree$cptable[min.x, 5]) return(big.tree$cptable[i, 1]) #column 5: xstd, column 1: cp 
  }
}

pruned.tree <- prune(your.tree, cp = cp.select(your.tree))

[在您的特定示例中,所有树都是等效的,因此首选大小1(无分割),因为已选择的响应已经说明了]