Random forest中out-of-bag data占原数据集的30%-40%

Random forest中out-of-bag data占原数据集的30%-40%


今天在看 Berkeley的网页学习随机森林,有一个很小的细节总是搞不懂,一直抓耳挠腮。在定义out-of-bag data时,Leo Breiman说剩下没被bootstrap抽中的样本大概有1/3。为什么是三分之一呢?这让我一直想不清楚,最后在stackoverflow上看到了答案。(果然stackoverflow上就是大神多)
考虑一个样本量为 N N 的集合,对它做一个样本量也是 N N 的bootstrap(有放回的抽样)。每次每个样本被抽中的概率是 1 N \frac{1}{N} ,没被抽中的概率是 1 1 N 1-\frac{1}{N} 。最后剩下的样本一定是在 N N 次抽取中都没被抽中,这种情况的概率是 ( 1 1 N ) N (1-\frac{1}{N})^N
联想到 e e 的两个极限表达
e = lim n ( 1 + 1 n ) n e = lim n ( 1 + 1 1 ! + + 1 n ! ) e=\lim_{n\to\infty}(1+\frac{1}{n})^n\\ e=\lim_{n\to\infty}(1+\frac{1}{1!}+\cdots+\frac{1}{n!})
很明显
e 1 = lim n ( 1 1 n ) n e^{-1}=\lim_{n\to\infty}(1-\frac{1}{n})^n
所以最后剩下来的out of bag data出现的概率接近 e 1 = 0.3678... 1 3 e^{-1}=0.3678...\approx\frac{1}{3} 。即oob数据最终大概占原样本的三分之一。
可以用如下R程序进行验证,我固定随机数发生器为123时,最终的实验值和理论值分别为 ( 36.970 , 33.835 ) (36.970,33.835) , 非常接近。

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增大,实际跑出来的理论与实验的误差会越来越大,感觉和大样本性不符。。。 n = 1000 n=1000 时同一个随机数发生器下的结果为 ( 183.944 , 167.167 ) (183.944 ,167.167) 。原来的误差在1/12左右,现在的误差在1/9左右。更大的数跑起来时间较久,我就没跑了。
附上stackoverflow的链接


2020.4.5 更新
今天看了Cornell CS的random forest课,里面的教授是说40%。 嗯,就0.3678四舍五入法则来看,说成40%确实是更好的。嘻嘻(#.#)

发布了2 篇原创文章 · 获赞 0 · 访问量 12

猜你喜欢

转载自blog.csdn.net/Huxixu123/article/details/105317862
今日推荐