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



我知道选择CP值的常见做法是选择具有最小xerror值的最低级别。然而,在我下面的例子中,使用cp <- fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"]会给我0.17647059,这将导致在使用该值修剪后没有分裂或只有根。

> 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值的替代方案/良好做法?

通常,像您所拥有的cptable这样的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表!(请注意,由于每次折叠都是相同的,因此不再需要设置种子)。

通常(并考虑到简约性),您应该更喜欢中具有最小xerror值的树,也就是说,在[min(xerror)-xstd;min(xeerror)+xstd]内的任何树。

根据rpart vignette:"在实现的最小值的一个标准误差内的任何风险都被标记为等于最小值(即被认为是平坦平台的一部分)。然后,在平台上所有"捆绑"的模型中,选择最简单的模型。">

请参阅: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(无拆分)是首选,正如所选响应已经解释的那样]

最新更新