OOB 관측개체가 전체 관측개체의 약 1/3인 이유

목차

    What is the OOB(Out of Bag) observations?

    OOB(Out of Bag)는 Bagging(Bootstrap Aggregation)에서 등장하는 용어이다. 배깅에서 핵심은 bootstrap 표본을 만들어 트리를 반복 적합하는 것이다. 각각의 배깅된 트리는 평균적으로 관측치들의 2/3를 사용한다. 배깅된 트리를 적합하는데 사용되지 않은 나머지 1/3의 관측치들을 OOB(Out of Bag) 관측치라고 한다. 이것은 bootstrap 표본을 만들 때 복원추출을 하기 때문에 나타나는 현상이다. 이러한 성질 때문에 배깅이나 랜덤포레스트에서는 OOB 관측치를 test set처럼 사용할 수 있다.

    Why OOB observations are around one-third of original observations?

    그렇다면 왜 관측치들의 2/3만 사용되는 것일까? 원래 표본의 j번째 관측치가 bootstrap 표본에 포함되지 않을 확률을 생각해보면 된다.

    먼저 첫 번째 bootstrap 관측치가 원래 표본의 j번째 관측치가 아닐 확률을 생각해보자. n개의 표본이 모두 동일한 확률로 추출될 수 있기 때문에 이 확률은

    \[\frac{n-1}{n}=1-\frac{1}{n}\]

    가 된다.

    두 번째 boostrap 관측치가 원래 표본의 j번째 관측치가 아닐 확률을 생각해보자. 이 확률 역시

    \[1-\frac{1}{n}\]

    이다.

    이제 원래 표본의 j번째 관측치가 bootstrap 표본에 포함되지 않을 확률을 구할 수 있고, 이 확률은

    \[(1-\frac{1}{n})^n\]

    이다.

    따라서 n이 무한대로 가면 이 확률은

    \[\underset{n \leftarrow \infty}{lim}(1-\frac{1}{n})^n=e^{-1} \approx \frac{1}{3}\]

    약 1/3이 된다. 따라서 하나의 bootstrap 표본에서 평균적으로 약 2/3의 원래 표본의 관측치가 사용된다고 볼 수 있다.

    1~10000까지의 각 정수 n에 대해 j번째 관측치가 bootstrap 표본에 있을 확률을 그래프로 나타내보면 아래와 같다.

    probs <- c()
        for (k in 1:10000){
          probs[k] <- 1-(1-1/k)^k
        }
        
        plot(1:10000, probs, type="l", ylim=c(0.5, 1))
        abline(h=1-1/exp(1), col="red", lty="dotted")

    Experiment

    bootstrap 표본을 직접 뽑아서 이것이 맞는지 경험적으로 확인해보자.

    n=100인 bootstrap 표본을 반복적으로 생성하여 원래 표본의 3번째 관측치가 bootstrap 표본에 포함되는지를 기록한 후, 그 평균이 약 2/3가 되는지를 확인하면 된다.

    bootsample <- c()
        for (j in 1:10000){
          bootsample[j] <- sum(sample(1:100, replace=T)==3) > 0
        }
        
        mean(bootsample)
    ## [1] 0.631
    1-1/exp(1)
    ## [1] 0.6321206
    2/3
    ## [1] 0.6666667

    Reference

    Gareth James , Daniela Witten, Trevor Hastie, Robert Tibshirani(2013). Introduction to Statistiacal Learning. Springer.