Random forest中out-of-bag data占原数据集的30%-40%
今天在看 Berkeley的网页学习随机森林,有一个很小的细节总是搞不懂,一直抓耳挠腮。在定义out-of-bag data时,Leo Breiman说剩下没被bootstrap抽中的样本大概有1/3。为什么是三分之一呢?这让我一直想不清楚,最后在stackoverflow上看到了答案。(果然stackoverflow上就是大神多)
考虑一个样本量为 的集合,对它做一个样本量也是 的bootstrap(有放回的抽样)。每次每个样本被抽中的概率是 ,没被抽中的概率是 。最后剩下的样本一定是在 次抽取中都没被抽中,这种情况的概率是 。
联想到 的两个极限表达
很明显
所以最后剩下来的out of bag data出现的概率接近 。即oob数据最终大概占原样本的三分之一。
可以用如下R程序进行验证,我固定随机数发生器为123时,最终的实验值和理论值分别为 , 非常接近。
set.seed(123)
Re=matrix(0,ncol=2,nrow=200)
for (n in 1:200){
a=seq(1,n)
flag=rep(0,n)
b=sample(a,n,replace=T)
c=sort(unique(b))
for (i in 1:length(c))
for (j in 1:n)
if(c[i]==a[j]) {
flag[j]=1;
break;
}
Re[n,]=c(sum(flag==0),ceiling(n/3))
}
colMeans(Re)
但是随着n增大,实际跑出来的理论与实验的误差会越来越大,感觉和大样本性不符。。。
时同一个随机数发生器下的结果为
。原来的误差在1/12左右,现在的误差在1/9左右。更大的数跑起来时间较久,我就没跑了。
附上stackoverflow的链接。
2020.4.5 更新
今天看了Cornell CS的random forest课,里面的教授是说40%。 嗯,就0.3678四舍五入法则来看,说成40%确实是更好的。嘻嘻(#.#)