Answers:
森林中的每棵树都是从训练数据中的观察值的引导样本中构建的。引导程序样本中的那些观察结果将构建树,而引导程序样本中的那些观察结果则不构成自付费用(或OOB)样本。
应该清楚的是,用于构建树的数据中的案例与OOB样本中的案例具有相同的变量。为了获得对OOB样本的预测,每棵样本都沿着当前树向下传递,并遵循树的规则,直到到达终端节点为止。得出该特定树的OOB预测。
此过程重复很多次,每棵树都根据训练数据和对新OOB样本的预测在新的引导样本上进行训练。
随着树数量的增加,OOB样本中的任何一个样本都将不止一次,因此,样本在OOB中的N棵树的预测的“平均值”将用作每个训练样本的OOB预测。树1,...,N。通过“平均”,我们使用预测的均值来进行连续响应,或者可以将多数票用于分类响应(多数票是对该集合的多数票的类别。树1,...,N)。
例如,假设我们对10棵树上的训练集中的10个样本具有以下OOB预测
set.seed(123)
oob.p <- matrix(rpois(100, lambda = 4), ncol = 10)
colnames(oob.p) <- paste0("tree", seq_len(ncol(oob.p)))
rownames(oob.p) <- paste0("samp", seq_len(nrow(oob.p)))
oob.p[sample(length(oob.p), 50)] <- NA
oob.p
> oob.p
tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 tree9 tree10
samp1 NA NA 7 8 2 1 NA 5 3 2
samp2 6 NA 5 7 3 NA NA NA NA NA
samp3 3 NA 5 NA NA NA 3 5 NA NA
samp4 6 NA 10 6 NA NA 3 NA 6 NA
samp5 NA 2 NA NA 2 NA 6 4 NA NA
samp6 NA 7 NA 4 NA 2 4 2 NA NA
samp7 NA NA NA 5 NA NA NA 3 9 5
samp8 7 1 4 NA NA 5 6 NA 7 NA
samp9 4 NA NA 3 NA 7 6 3 NA NA
samp10 4 8 2 2 NA NA 4 NA NA 4
其中NA
意味着样本在该树的训练数据中(换句话说,它不在OOB样本中)。
NA
每行非值的平均值给出整个森林的每个样本的OOB预测
> rowMeans(oob.p, na.rm = TRUE)
samp1 samp2 samp3 samp4 samp5 samp6 samp7 samp8 samp9 samp10
4.00 5.25 4.00 6.20 3.50 3.80 5.50 5.00 4.60 4.00
将每棵树添加到森林后,我们可以计算出包括该树在内的OOB错误。例如,以下是每个样本的累计平均值:
FUN <- function(x) {
na <- is.na(x)
cs <- cumsum(x[!na]) / seq_len(sum(!na))
x[!na] <- cs
x
}
t(apply(oob.p, 1, FUN))
> print(t(apply(oob.p, 1, FUN)), digits = 3)
tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 tree9 tree10
samp1 NA NA 7.00 7.50 5.67 4.50 NA 4.6 4.33 4.0
samp2 6 NA 5.50 6.00 5.25 NA NA NA NA NA
samp3 3 NA 4.00 NA NA NA 3.67 4.0 NA NA
samp4 6 NA 8.00 7.33 NA NA 6.25 NA 6.20 NA
samp5 NA 2 NA NA 2.00 NA 3.33 3.5 NA NA
samp6 NA 7 NA 5.50 NA 4.33 4.25 3.8 NA NA
samp7 NA NA NA 5.00 NA NA NA 4.0 5.67 5.5
samp8 7 4 4.00 NA NA 4.25 4.60 NA 5.00 NA
samp9 4 NA NA 3.50 NA 4.67 5.00 4.6 NA NA
samp10 4 6 4.67 4.00 NA NA 4.00 NA NA 4.0
通过这种方式,我们可以看到预测是如何在森林中的N棵树上累积到给定迭代的。如果跨行读取,则最右边的非NA
值是我在上面为OOB预测显示的值。这就是可以跟踪OOB性能的方式-可以基于在N棵树上累积的OOB预测为OOB样本计算RMSEP。
请注意,所示的R代码并非取自R 的randomForest程序包中的randomForest代码的内部-我只是敲了一些简单的代码,以便一旦确定了每棵树的预测后就可以进行后续操作。
因为每棵树都是从引导程序样本中构建的,并且随机森林中有大量树木,因此每个训练集观察值都在一个或多个树的OOB样本中,所以可以为所有树提供OOB预测训练数据中的样本。
我已经解决了一些OOB案例缺少数据等问题,但是这些问题也与单个回归树或分类树有关。还请注意,林中的每棵树仅使用mtry
随机选择的变量。
http://www.ime.unicamp.br/~ra109078/PED/Data%20Minig%20with%20R/Data%20Mining%20with%20R.pdf
。在第115-116页上,作者使用RF选择variable importance
技术指标。
"To get predictions for the OOB sample, each one is passed down the current tree and the rules for the tree followed until it arrives in a terminal node"
,您对这些内容有一个简单的解释rules for the tree
吗?sample
如果我了解样本是groups
树木将数据划分到其中的观测值,我是否能正确理解行?