复杂度参数如何与 rpart 中交叉验证中的拆分次数相对应?

机器算法验证 r 大车 rpart
2022-04-09 11:52:25
library(rpart)
tree = rpart(Kyphosis ~ ., data=kyphosis, control=rpart.control(minsplit = 1, cp = 0, xval=10))
plotcp(tree,  minline = FALSE, upper=c("splits"))

在此处输入图像描述

据我了解 xval=10 对应于 10 倍交叉验证。因此 rpart 算法将构建 10 棵不同的树(不修剪,直到所有训练示例都被尽可能分类[用 minsplit=1, cp=0 控制它]...这意味着我的树可能会过拟合)。然后算法遍历每棵树并计算其在测试集上的错误率。接下来,它查看所有复杂度参数 (cp),并确定如果使用该复杂度参数 (cp),树将如何在测试集上完成。我的问题:

  • 拆分的数量如何直接对应于复杂度参数?不是正在构建 10 种不同的树,并且复杂性参数在每种树上的工作方式都不同吗?

  • 返回的最后一棵树是什么?它似乎不是交叉验证期间制作的 10 个之一,因为它的叶子包含整个数据集?

1个回答

创建了一棵树,这肯定是过度拟合数据。指定的minsplit本质上创建了一个树,将每个终端节点分类为全部“存在”或全部“不存在”。 rpart不会为您修剪树,但可以为您提供交叉验证以选择最佳子树(即选择复杂度参数α)。最好的树是初始树的任何子集;以下是几个选项:

library(rpart.plot)
prp(tree,extra=1) #Initial tree with 16 splits
prp(prune(tree,cp=0.042),extra=1) #Subtree with 10 splits
prp(prune(tree,cp=0.068),extra=1) #Subtree with 5 splits
prp(prune(tree,cp=0.14),extra=1) #Subtree with 1 split

为了决定哪个子树最好,我们必须执行交叉验证。首先我们要确定可能的α将产生一个子树(来自初始树)。然后我们将数据分成 10 组,并使用“将一组排除在外”的方法构建 10 棵树α修剪树。被排除在外的组可以确定哪个α效果最好。技术细节可以在rpart 小插图中看到

返回的最终树仍然是初始树。您必须使用prune使用交叉验证图的函数来选择最佳子树。对于这个数据集,我认为 CART 不太适合数据。如果您执行 81 倍交叉验证(即留下一个观察结果),您会看到五个拆分似乎是最好的树。如果您正在寻找预测精度更高的模型,也许您应该考虑构建随机森林。