머신러닝에 대한 포스팅을 거의 하지 않았으나 공부는 꾸준히 하고 있었는데 (학교에서), 최근에 Bagging 과 Boosting에 대해서 배우고 있다. 그런데 이 부분에서도 Resampling 에 대해 배울 때 배웠던 Bootstrap 기법이 꽤 중요한 개념으로 작용하고 있다는 것을 알게 되었다. 그래서 Bootstrap 부터 시작해서, Tree 모형들 더 나아가 Random Forest 와 Bagging, 그리고 Boosting에 대해 쭉 정리해보고자 한다. 이번 포스팅에선 Bootstrap 기법에 대해 정리해보도록 하겠다.
포스팅하면서 참고한 자료는 다음과 같다.
https://www.youtube.com/playlist?list=PLoROMvodv4rOzrYsAxzQyHb8n_RWNuS1e
https://arxiv.org/pdf/1811.12808.pdf
Bootstrap 을 사용하는 경우
Bootstrap 방법은 통계 추정치의 불확실성을 추정하거나 표본에서 모집단을 추론하기 위해 통계학에서 일반적으로 사용되는 리샘플링 기법이다. 말이 너무 어려울 수 있는데, 다음과 같은 상황에서 사용된다고 볼 수 있다.
- 내가 구한 모델이 얼마나 신뢰할 수 있는지 알고 싶을 때 (= 신뢰구간을 구하고 싶을 때)
- 모집단의 정보에 대해 아는 것이 없을 때
- 선형회귀모델이 아닌 다른 모델을 사용했을 때 (특히 Tree 모델이나 KNN 같은 비모수적 추정 모델)
선형회귀를 공부하신 분들이라면 $\widehat{\beta}$ 의 표준편차를 데이터로부터 구하는 법을 아실 것이다. 그래서 선형회귀모델에선 굳이 Bootstrap을 써가며 추정치 $\widehat{\beta}$ 의 표준편차를 구할 일이 없다. 하지만 다른 모델들을 사용할 때는 그렇지 않다. 그렇다면 Bootstrap이란 무엇일까?
Bootstrap이란?
Bootstrap 의 기초가 되는 개념은 '갖고 있는 데이터셋에서 랜덤하게 데이터를 뽑아내어 새로운 데이터셋을 만드는 과정'이다. 여기서 핵심은 랜덤하게 데이터를 뽑을 때, 중복을 허용한다는 점이다! (더 나아가 Bagging은, 이렇게 랜덤하게 뽑아내는 과정을 아주 많이 반복하고, 그렇게 만들어진 데이터셋들 각각으로 새로운 모델을 만든 다음 합쳐서 최종적인 모델을 만드는 과정이다.)
그림을 보면 형형색색의 공들이 있는 원데이터에서 중복을 허용하여 공을 뽑았음을 볼 수 있다. (모든 색의 공이 2개씩 들어있으나 추출한 데이터에선 3개씩도 들어있다.) 중복을 허용하는 이유는, 중복을 허용하지 않는다면 뽑는 개수가 늘어날수록 원데이터에 가까워지기 때문에 추정치의 유의미한 표준편차를 구할 수가 없게 되어버리면서 원래의 목적을 상실하게 되어버린다. 그렇다면 Bootstrap이 강력한 성능을 보이는 이유는 무엇일까?
Bootstrap이 강력한 이유
참고자료(수업시간에 사용했던 자료이기도 하다.)에서는 다음과 같은 상황을 들어서 Bootstrap 이 좋은 이유를 설명하려고 한다.
하지만 이건 오히려 내가 Bootstrap을 이해하는 것을 방해하기만 했을 뿐이다... 예시가 이해하기에 별로 적절하지 않은 것 같다. 그래서 내가 이해한 내용을 기반으로 재해석하여 Bootstrap이 강력한 이유를 설명해보고자 한다.
통계학을 얕게 공부한 사람들이라도 중심극한정리(Central Limit Theorem, CLT)에 대해서는 알고 있으리라 짐작된다.
https://ko.wikipedia.org/wiki/%EC%A4%91%EC%8B%AC_%EA%B7%B9%ED%95%9C_%EC%A0%95%EB%A6%AC
CLT를 간단하게 설명하자면, "모집단의 평균과 표준편차에 대해 모르더라도 표본을 많이 추출하면 정규분포를 따르게 되는데, 이를 통해 모집단의 평균과 표준편차를 유추할 수 있다" 는 이론이다. 300년도 더 전에 그 유명한 수학자 라플라스가 처음 논의했다고 하는데, 통계학에선 정말로 중요하고 강력한 이론으로 취급받는다. 정보를 아예 모르는 확률분포에 대해서도 그 평균과 표준편차를 구할 수 있다니, 생각해보면 정말 대단한 이론이다.
Bootstrap이 강력한 이유가 바로 CLT 때문이 아닐까 싶다. Bootstrap은 정해진 데이터셋(모집단) 으로부터 무작위하게 중복을 허용하여 데이터들을 추출하는 것이다. 이 과정을 반복한다면 데이터셋이 굉장히 많이 나올 것이다. 예를 들어 데이터셋 1000개를 새로 추출해서 만들었다면, 그 각각의 데이터셋으로부터 모델을 만들고, 모델의 추정치 (ex $\widehat{\beta}$) 를 구할 수 있을 것이다. 이때 중심극한정리가 발동한다! $\beta$ 의 원래 값을 몰라서(혹은 정확하지 않아서) 추출된 데이터셋으로부터 추정하여 $\widehat{\beta}$을 구하는 것인데, 중심극한정리에 의해 $\widehat{\beta}$을 많이 구한다면 결국 모집단으로 만든 $\widehat{\beta}$을 구할 수 있게 되는 것이다.
한 줄 정리 : Bootstrap이 강력한 이유는 중심극한정리 때문!
Bootstrap 사용 예시
마지막으로 R에서 bootstrap을 사용한 예시를 간단히 살펴보고, 얼마나 강력한지 느껴보도록 하겠다.
예시를 보기 위해 Default 라는 데이터셋을 사용해보겠다. (Default는 ISLR2 패키지에 있다.)
default 는 Yes or No 두 값을 가진 범주형 (categorical) 변수이다. 이를 balance 와 income을 사용해 로지스틱 회귀를 이용해 분류해보도록 하겠다. (R에서 로지스틱 회귀는 glm 함수로 구현 가능하다.)
data(Default)
set.seed(1)
logit_model <- glm(default ~ income + balance, data = Default, family = binomial)
summary(logit_model)
눈여겨봐야 할 부분은 절편과 income, balance 의 Estimate(추정치) 와 Std. Error(표준편차) 이다.
여기까지는 bootstrap 없이 원데이터셋으로 추정했을 때의 결과다. 그렇다면 bootstrap을 사용해보자.
boot.fn <- function(data, index) {
fit <- glm(default ~ income + balance, data = data[index, ], family = binomial)
return(coef(fit))
}
library(boot)
set.seed(1)
boot_results=boot(Default, boot.fn, R = 1000)
boot_results
코드를 간단히 해석하자면 다음과 같다.
1. boot.fn 이라는 function 하나를 만든다. boot.fn은 로지스틱 회귀분석을 한 뒤 추정치의 계수들을 반환해준다.
2. R의 boot 함수를 사용해 bootstrap을 진행한다. Parameter는 차례대로 진행할 데이터셋, bootstrap을 통해 확인하고 싶은 값, 반복횟수 이다. 이외에도 추가적인 Parameter들이 존재한다.
아래는 실행 결과다.
t1, t2, t3 순서대로 Intercept, income, balance 이다. 추정치와 표준편차 모두 원데이터와 큰 차이가 없음을 확인할 수 있다. 모집단으로 추정한 것이 아닌데도, CLT에 의해 결과가 같게 나온 것이다. 추가적으로 bias 라는 지표를 통해 추정치의 신뢰구간의 길이도 대략적으로 확인 가능하다.
이상으로 Bootstrap의 이론과 사용에 대해 정리해보았다. Bootstrap을 이용해 모델의 추정치의 계수 말고 데이터의 결과를 예측하는 것은 Bagging 방식으로 넘어가서 정리해보도록 하겠다.
'머신러닝' 카테고리의 다른 글
머신러닝 - Naive Bayes Classifier(분류) 정리 (0) | 2023.06.17 |
---|---|
머신러닝 - Regularization 과 LASSO, Ridge 정리 (0) | 2023.06.09 |
머신러닝 - 차원 축소와 PCA (3) (0) | 2023.04.15 |
머신러닝 - 차원 축소와 PCA (2) (0) | 2023.04.14 |
머신러닝 - 차원 축소와 PCA (1) (0) | 2023.04.12 |