【问题标题】:Selecting CP value for decision tree pruning using rpart使用 rpart 为决策树修剪选择 CP 值
【发布时间】:2016-10-09 19:35:48
【问题描述】:

我了解选择 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 值吗?

【问题讨论】:

    标签: r decision-tree rpart


    【解决方案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表! (请注意,不再需要设置种子,因为每次折叠都是相同的)。

    【讨论】:

    • 如果您有多余的计算时间,control = rpart.control(xval = [data.length], minsplit = 2, minbucket = 1, cp = 0) 将为您提供最过拟合的树序列和最丰富的 k 折交叉验证。使用plotcp(model)printcp(model),您可以探索所有可能的树木
    【解决方案2】:

    一般而言(考虑到简约性),您应该更喜欢 那些 中具有最小 xerror 值的较小树,即任何 xerror 值在 within [min (xerror) - xstd; min(xerror) + xstd].

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

    见:https://stackoverflow.com/a/15318542/2052738

    您可以使用 ad-hoc 函数选择最合适的 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(无拆分),正如所选响应已解释的那样]

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 2014-05-22
      • 2019-06-14
      • 2011-04-28
      • 2013-05-01
      • 2019-02-11
      • 2011-05-02
      • 1970-01-01
      相关资源
      最近更新 更多