r中树包的树交叉验证

aki*_*kis 5 tree r cross-validation

有谁知道cv.treer中tree包的功能是如何工作的?默认设置为 10 倍,但结果显示 8 个树模型而不是 10 个:

在此输入图像描述

此外,如果我设置 5 倍,结果将显示 8 个模型: 在此输入图像描述

我使用的代码如下:

library (MASS)
library(tree)
set.seed (1)
train = sample (1: nrow(Boston ), nrow(Boston )/2)
tree.boston =tree(medv~.,Boston ,subset =train)
summary (tree.boston )
cv.boston =cv.tree(tree.boston,K=10)
cv.boston
Run Code Online (Sandbox Code Playgroud)

谢谢

G5W*_*G5W 5

输出中显示的八件事不是交叉验证的折叠。文档cv.tree说明了输出:

价值

应用于对象的 FUN 副本,组件 dev 被每个拟合的 dev 组件总和的交叉验证结果替换。

由于您没有指定 的FUN参数cv.tree,因此您将获得默认值prune.tree。的输出是什么prune.tree?文档说:

根据成本复杂性度量,通过递归地“剪掉”最不重要的分割来确定所提供的树的子树的嵌套序列。prune.misclass 是 prune.tree(method = "misclass") 的缩写,与 cv.tree 一起使用。

请注意,您的树正好有 8 个叶子。

plot(tree.boston)
text(tree.boston)
Run Code Online (Sandbox Code Playgroud)

树图

prune.tree正在向您展示八棵树的异常情况,将叶子一一剪掉。 cv.tree正在向您展示此内容的交叉验证版本。它不是计算完整训练数据的偏差,而是对八次连续修剪中的每一次使用交叉验证值。

将仅使用的输出偏差prune.tree与交叉验证的偏差进行比较。

prune.tree(tree.boston)

$dev
[1]  3098.610  3354.268  3806.195  4574.704  5393.592  6952.719 11229.299
[8] 20894.657

cv.tree(tree.boston, K=5)

$dev
[1]  4768.281  4783.625  5718.441  6309.655  6329.011  7078.719 12907.505
[8] 20974.393
Run Code Online (Sandbox Code Playgroud)

请注意,每个步骤的交叉验证值都相当高。仅对prune.tree训练数据进行测试,因此会低估偏差。cv值更现实。