Tech/ML, DL

Data Sampling에 관하여 - (2) Bootstrap, 부트스트랩

Julie's tech 2022. 4. 2. 13:39
728x90

이전 글에서는 데이터 샘플링에 대한 개념과 랜덤샘플링, 편향(Bias)에 대해 간단하게 살펴보았다.

이번 글은 Bootstrap 이라는 개념에 대해 알아보자.

통계량의 표본 분포에 대해 측정하려고할 때 가장 쉽고도 효과적인 방법은, 반복해서 샘플링을 추출해내는 것이다. 이 때 복원 추출을 허용한다.

우리가 A라는 모집단에서 A', A'', A'''..., 로 표본을 계속해서 뽑고 그 표본의 통계량을 반복해서 계산한다고 생각해보자.

표본을 추출하는 횟수를 늘려갈수록 이 통계량들의 평균은 A 모집단의 통계량 평균과 유사해질 것이다.

이 과정을 Bootstrap이라고 부른다. 부트스트랩은 표준분포와 같은 일반적인 가정을 포함하여 어떠한 조건도 요구하지 않아 간단하다.

Bootstrap 과정을 간단하게 절차로 정리하자면 :

1) 표본을 추출하고 표본에 대해 기록한 뒤 다른 표본과 교체한다.

2) 1번 과정을 n번 반복한다.

3) n번 반복되어 샘플된 표본들의 통계량(ex. 평균)을 계산한다.

4) 1~3번 과정을 R번 반복한다.

5) 4번의 결과에 대해 표준편차를 계산하고 신뢰구간을 계산한다. 즉 우리는 모집단의 통계량에 대한 표준편차와 신뢰구간을 대신하여 얻는다.

* 여기서 R은 임의의 숫자이지만 R을 무한대로 늘릴 수록 모집단의 통계량에 대한 추정치 정확도가 높아진다.

# Python으로 간단하게 구현한 Bootstrap
from sklearn.utils import resample ## scikit-learn에서 제공하는 resample 함수 사용

sample_statistics = []
for R in range(10000):
     sample = resample(data)
     sample_statistics.append(sample.median())
sample_statistics = pd.Series(sample_statistics)
print("median of original data: ", data.median())
print("meidan of bootstrapped data: ", sample_statistics.median())
print("bias between two : ", sample_statistics.median() - data.median())
print("std error : ", sample_statistics.std())

* 부트스트랩은 다변수 데이터에도 적용될 수 있다.

이를 단순한 통계를 넘어서 머신러닝에 개념을 적용해보면, Bootstrap은 모델의 예측력을 높일 수 있는 방법으로 활용된다.

트리형 모델에서도 흔히 접할 수 있는 용어 중에 하나인데, 트리 앙상블 방법 중 하나인 배깅(Bagging)이 Bootstrap Aggregation의 약자이다.

이 때 배깅은 모델의 오버피팅을 막기 위한 방법으로 부트스트랩 데이터로 여러 가지의 모델을 만든 뒤, 모델들의 결과값을 평균하거나 voting한다.

이과정에서 일부 모델은 오버피팅이 되어있더라도 이를 평균하거나 다수 모델의 결과를 활용함으로써 최종 모델의 오버피팅 확률을 낮추는 것이다.

이처럼 부트스트랩은 굉장히 단순한 방식이지만 높은 연산량을 요구한다는 단점이 있다.

가끔 Resampling과 Bootstrap이 동일한 용어로 사용되기도 하는데, 사실 Resampling은 순열의 개념이 포함되어있다.

즉 여러 개의 샘플을 추출하는 건 동일하지만, 이 때 표본은 복원 추출을 허용하지 않을 때가 많다.

반면 Bootstrap은 일반적으로 복원을 허용하는 기법으로 사용된다.

반응형