树和交叉验证 - # misclass

机器算法验证 r 交叉验证 大车
2022-04-20 13:22:04

我正在交叉验证分类树,并且能够绘制被不同大小的树错误分类的观察数量。我的问题是,对于给定的树大小,当该大小的树有k个不同的运行时(其中每个k运行的误分类数可能不同) ,返回“错误分类的”数字是什么意思

我读过的几篇文章说,对于每种大小的树,应该返回k次折叠的平均值,但我认为这不是我得到的,因为我看到的“数字错误分类”的数字是总是完美的整数。

这是一个例子:

library('ISLR')
attach(Carseats)

High = cut(Sales, c(-Inf, 8, Inf), labels=c("Small", "Large"))
Carseats = data.frame(Carseats, High)

set.seed(2)
train = sample(1:nrow(Carseats), 200)

library('tree')
tr0 = tree(High ~ . -Sales, data=Carseats, subset=train)

set.seed(3)
tr0.cv = cv.tree(tr0, FUN=prune.misclass)
plot.tree.sequence(tr0.cv)

tr0.cv$dev 
#[1] 55 55 53 52 50 56 69 65 80
# These don't look like averages across k folds

更新

在我的示例中,这里是不同的树大小及其对应的开发值(这里,意思是错误分类的数字)

tr0.cv$size
[1] 19 17 14 13  9  7  3  2  1
tr0.cv$dev
[1] 55 55 53 52 50 56 69 65 80

所以我们有一个大小为 19 的树,错误分类的数量是 55。这是说在 10 次运行中,所有错误分类的总和是 55?因此,对于每个大小为 19 的单独树拟合,平均大约有 5.5 个错误分类?

这似乎很可疑,因为当我确实适合大小为 19 的树时,我看到该数字被错误分类为 21。

tr0.Prune19 = prune.misclass(tr0, best=19)
summary(tr0.Prune19)

Classification tree:
tree(formula = High ~ . - Sales, data = Carseats, subset = train)
Number of terminal nodes:  19 
Residual mean deviance:  0.4282 = 77.51 / 181 
Misclassification error rate: 0.105 = 21 / 200 

这样做 10 次,我预计错误分类的总数约为 200,这与报告的 55 有很大不同。当然,我知道在 10 次不同的运行中,错误分类的数量会有一些变化,但这听起来也是出入很大。我错过了什么吗?

1个回答

对于一系列复杂性参数,它返回 10 次拟合中每一次的偏差总和。

来自参考手册...“应用到对象的 FUN 副本,组件 dev 替换为来自每个拟合的 dev 组件总和的交叉验证结果。”

从代码...

cvdev <- 0
for (i in unique(rand)) {
    tlearn <- tree(model = m[rand != i, , drop = FALSE])
    plearn <- do.call(FUN, c(list(tlearn, newdata = m[rand == 
        i, , drop = FALSE], k = init$k), extras))
    cvdev <- cvdev + plearn$dev
}

请注意 plearn$dev 是跨折叠求和的。