[ISLR] 5. 붓스트랩(Bootstrap)

2023. 4. 5. 01:12·AI/Machine Learning

 

저번 포스팅에는 재표본기법 중 교차검증(Cross-Validation)에 대해 알아보았는데요. 이번 포스팅에서는 리샘플링 기법 중 붓스트랩에 대해 알아보겠습니다.

 

 

1. Bootstrap

붓스트랩(Bootstrap)은 평균이나 분산과 같이 관심이 있는 통계량의 분포를 알아볼 때 유용합니다.

붓스트랩은 기존의 표본으로부터 새로운 표본셋을 얻는 방법입니다. 기존의 표본에 포함된 관측치가 n개가 있다면, 표본에서 복원추출(with Replacement) 방식으로 n개의 관측치를 표집(Sampling)하는 과정을 B번 진행합니다.

이렇게 붓스트랩을 표본에 적용하면 통계량을 계산할 데이터를 B개를 얻을 수 있게 됩니다. (관측치는 n*B개)

( * 샘플에서 복원추출하므로 중복되는 관측치가 존재할 수 있고 기존 샘플에서 추출되지 않은 관측치를 OOB 관측치라고 합니다.)

 

 

2. Advantage of Bootstrap

붓스트랩을 하는 이유에 대해 생각해 보면 원래 모집단에서 추출한 표본으로 구하고자 하는 통계량을 계산하면 하나의 값만 나오게 됩니다.

통계량의 값이 하나이므로 통계량에 대한 분산을 구할 수 없어서 얼만큼 정확한지 알 수 없습니다. 하지만 붓스트랩을 사용해 표본의 관측치 수와 동일한 관측치 수를 가지는 B개의 표본셋을 구할 수 있고 각 표본셋에서 통계량을 구하면 B개의 통계량을 얻을 수 있습니다.

이를 토대로 붓스트랩 통계량의 분포와 변동를 알 수 있게 됩니다. 따라서 붓스트랩 통계량의 분산을 구할 수 있는데 아래와 같이 표현할 수 있습니다.

$$Var(\theta)=\frac{\sum_{i=1}^{B}(\theta_i - \overline{\theta})^2}{B-1}=\frac{1}{B-1}\sum_{i=1}^{B}(\theta_i - \frac{1}{B}\sum_{j=1}^{B}\theta_j)^2$$

 

 

3. Bootstrap Example

다음 예제는 붓스트랩을 이용한 통계량의 분포 및 계산입니다.

# Population Setting : X~Poisson(lambda=2)
# Then, E(X) = 2, Var(X) = 2

# Sample of size = 100
data <- rpois(n=100, lambda=2)

# Bootstrap function
Bootstrap <- function(data, B=30){
  res <- list()
  n <- length(data)
  for(i in 1:B){
    res[[i]] <- sample(x=data, size=n, replace = T)
  }
  return(res)}

# Bootstrap distribution
library(tidyverse)
data_bootstrap <- Bootstrap(data=data, B=200)
length(data_bootstrap) 
stat <- sapply(X=data_bootstrap, FUN=function(data){
  return(list("mean"=mean(data), "var"=var(data)))})

mean_vec = unlist(stat[1,])
var_vec = unlist(stat[2,])
par(mfrow=c(1,2))
hist(mean_vec); mean(mean_vec)
hist(var_vec); mean(var_vec)

  • 모집단은 $X \sim Poisson(2)$입니다.
  • 표본은 모집단에서 크기가 100만큼 표본 추출 한 집단입니다.
  • 붓스트랩 데이터는 표본에서 복원추출로 크기가 100인 데이터가 200개(B) 존재합니다.
  • 붓스트랩을 통해 구한 붓스트랩 통계량의 평균과 분산의 얻을 수 있어서 이를 토대로 신뢰구간을 구할 수 있게 되었습니다.

 

Introduction to Statistical Learning에 나온 예제를 직접 구현한 코드는 아래와 같습니다. boot 패키지를 사용하여 boot 함수를 사용할 수 있는데, 인자에 주어지는 통계량은 데이터를 분리하는 인덱스 값을 인수로 필요로 합니다.

또한, rsample::bootstrap 함수를 통해서 붓스트랩 데이터를 얻을 수 있는데 이를 훈련용 데이터로, OOB 관측치를 평가용으로 사용할 수 있게 분리합니다. 

  • boot::boot(data, statistics, R) : 붓스트랩 데이터를 R개 생성하여 붓스트랩 통계량의 평균과 분산을 출력
  • rsample::bootstrap(data, times) : 반복추출된 훈련용 데이터와 OOB 관측치를 평가용 데이터로 분리한 데이터를 리스트열 형태로 반환

 

## [ISLR] Example
library(ISLR)
library(boot)

# 구하고자 하는 통계량 정의
alpha <- function(data){
  X = data$X; Y = data$Y
  return((var(X)-cov(X, Y))/var(X-Y))}

# 전체 표본에 대한 통계량 출력
alpha(Portfolio)

# 붓스트랩 통계량
bootstrap_stat <- replicate(n=500, expr = {
  bootstrap_data <- Portfolio[sample(nrow(Portfolio), replace = T),]
  alpha(bootstrap_data)})

bootstrap_stat[1:10]
bootstrap_stat %>% hist()

# 정규성 검정 >> 정규분포 따름
# Bootstrap CI (약 95% 신뢰구간) 0.4162568 0.4324194
shapiro.test(bootstrap_stat)
mean(bootstrap_stat) + c(-1,1)*qnorm(p=0.025, lower.tail = F)*sd(bootstrap_stat)/sqrt(500)

# 중위수 Distribution-Free CI (약 95% 신뢰구간) 0.4221798 0.4395540
# Y228 < m < Y273 : 적어도 228개는 중위수보다 작아야하지만, 273개를 초과할 수 없음
sort(bootstrap_stat)[c(228, 273)] 


### Boot 라이브러리르 사용한 결과
alpha <- function(data, index){
  X = data$X[index]; Y = data$Y[index]
  return((var(X)-cov(X, Y))/var(X-Y))}
boot(Portfolio, alpha, R=500)

 

저작자표시 비영리 변경금지 (새창열림)

'AI > Machine Learning' 카테고리의 다른 글

[EDA] Correlation (상관계수) - Pearson, Spearman, Kendall, XI  (1) 2024.04.16
[Regression & Classifcation] Decision Tree  (0) 2024.04.03
[ISLR] 5. 교차검증(Cross-Validation)  (0) 2023.04.04
[ISLR] 4. 분류(Classifiction) With R Using Tidymodels  (0) 2023.03.31
[ISLR] 4. 분류모델의 성과지표(Performance Metric)  (0) 2023.03.31
'AI/Machine Learning' 카테고리의 다른 글
  • [EDA] Correlation (상관계수) - Pearson, Spearman, Kendall, XI
  • [Regression & Classifcation] Decision Tree
  • [ISLR] 5. 교차검증(Cross-Validation)
  • [ISLR] 4. 분류(Classifiction) With R Using Tidymodels
임파카
임파카
[ML & Statistics] 모바일 버전에서 수식 오류가 있어 PC 환경에서 접속하는 것을 권장합니다.
  • 임파카
    무기의 스탯(Stat)
    임파카
  • 전체
    오늘
    어제
    • Study (149)
      • Data Science (44)
        • Modeling (18)
        • Manipulation (21)
        • Visualization (4)
      • Statistics (59)
        • Mathmetical Statistics (53)
        • Categorical DA (1)
      • Web Programming (17)
      • AI (26)
        • Machine Learning (16)
        • Deep Learning (10)
      • 활동 및 프로젝트 (3)
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
임파카
[ISLR] 5. 붓스트랩(Bootstrap)
상단으로

티스토리툴바