使用 rpart 选择决策树修剪的 CP 值
Selecting CP value for decision tree pruning using rpart
我了解到 select 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
对于 select CP 值还有其他替代/好的做法吗?
一般来说,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
你会找到更喜欢的CPtable! (请注意,不再需要设置种子,因为每次折叠都相同)。
一般来说(考虑到简约性)你应该更喜欢 那些 中具有最小 xerror 值的较小的树,这是任何 xerror 值为 的树在 [min(xerror) - xstd; min(xerror) + xstd].
根据 rpart 插图:"Any risk within one standard error of the achieved minimum is marked as being equivalent to the minimum (i.e. considered to be part of the flat plateau). Then the simplest model, among all those “tied” on the plateau, is chosen."
参见:
您可以 select 最合适的 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(无拆分),因为 selected 响应已经解释过]
我了解到 select 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
对于 select CP 值还有其他替代/好的做法吗?
一般来说,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
你会找到更喜欢的CPtable! (请注意,不再需要设置种子,因为每次折叠都相同)。
一般来说(考虑到简约性)你应该更喜欢 那些 中具有最小 xerror 值的较小的树,这是任何 xerror 值为 的树在 [min(xerror) - xstd; min(xerror) + xstd].
根据 rpart 插图:"Any risk within one standard error of the achieved minimum is marked as being equivalent to the minimum (i.e. considered to be part of the flat plateau). Then the simplest model, among all those “tied” on the plateau, is chosen."
参见:
您可以 select 最合适的 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(无拆分),因为 selected 响应已经解释过]