본문 바로가기

파이썬/머신러닝

배깅(bagging) 기본 개념과 예시, 사이킷런 BaggingClassifier

앙상블 훈련 방법 중 가장 많이 쓰이는 방법은 배깅, 부스팅, 스태킹이 있다. 오늘은 그 중에서 배깅에 대해서 알아보자.

 

 

앙상블 방법은 여러개의 괜찮은 예측기를 연결해 더 좋은 예측기를 만드는 방법이다. 각각의 예측기의 성능이 뛰어날 필요는 없다. 각 분류기가 weak learner여도 충분히 많고 다양한 분류기를 결합해서 만든 앙상블은 strong learner가 될 수 있다.

 

 

배깅이란?

 

다양한 분류기를 만드는 방법은 2가지가 있다.

 

1. 각기 다른 훈련 알고리즘을 사용하기

2. 훈련 세트의 서브셋을 무작위로 구성하여 하나의 분류기를 다르게 학습시키기

 

 

 

이 때 두번째 방법에서 중복을 허용해서 샘플링하는 것이 배깅(Bootstrap aggregation), 중복을 허용하지 않는 것이 페이스팅(pasting)이다. 배깅만이 같은 훈련 샘플을 여러번 샘플링 할 수 있다.

 

 

*부트스트랩: 중복을 허용한 리샘플링

1) X개의 표본 중 하나를 뽑아 기록하고 다시 제자리에 둔다.

2) 이를 n번 반복

3) n번 재표본추출한 값의 평균 구하기

4) 1~3번을 R번 반복 (R: 부트스트랩 반복 횟수)

5) 평균에 대한 결과 R개를 사용해서 신뢰구간 구하기

 

 

이렇게 여러 번 예측을 하면 각각의 결과값을 모아서 새로운 샘플에 대한 예측값을 만든다. 

분류 모델에서는 최빈값/최댓값을, 회귀 모델에서는 평균값을 구하는게 일반적이다.

 

 

사이킷런 모듈과 주요 파라미터

 

사이킷런에서는 배깅과 페이스팅울 위해 BaggingClassifier, BaggingRegressor 모듈을 제공한다. 페이스팅으로 사용하려면 파라미터를 bootstrap=False로 지정해주면 된다.

 

base_estimator : 앙상블 학습을 위한 베이스 예측기 (Decision Tree, SVM, LogisticRegression 등)

n_estimators : 앙상블에 사용할 분류기의 수

bootstrap : True는 배깅, False는 페이스팅

n_jobs : fit, predict에 사용할 CPU 코어 수 지정 (None(=1)이 기본값, -1로 설정하면 모든 프로세서를 다 사용)

oob_score : True로 설정하면 자동으로 oob평가 수행

 

 

oob_score에 대해서 조금 더 알아보자.

배깅을 사용해서 샘플링을 하면 평균적으로 각 예측기의 훈련샘플의 63%만 샘플링되고 나머지 37%는 선택되지 않는다. 이렇게 선택되지 않은 샘플이 바로 oob(out-of-bag) 샘플이다. 당연히 예측기마다 oob 샘플은 다르다.

 

 

oob 샘플은 훈련에 쓰이지 않기 때문에 별도의 test set을 만들지 않고도 oob샘플로 검증이 가능하다. 결과 점수는 oob_score_변수에 저장되어 있다.

 

 

배깅 코드 예제

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

X, y = make_moons(n_samples=500, noise=0.30, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

 

사이킷런의 make_moons 데이터로 배깅 예제 코드를 실습해보자.

 

bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=100, bootstrap=True, n_jobs=-1)

bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)

accuracy_score(y_test, y_pred)
>>>0.912

 

결정트리를 base_estimator로 사용했고 분류기의 수는 500개로 지정, oob_score=False(디폴트값)으로 지정했다. 이 때는 accuracy_Score로 테스트 세트 정확도를 확인한다.

 

bag_clf2 = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=100, bootstrap=True, n_jobs=-1, oob_score=True)

bag_clf2.fit(X_train, y_train)
bag_clf2.oob_score_
>>>0.9253333333333333

 

두번째로는 oob_score=True로 설정해서 oob_score_ 점수를 확인해보자. 테스트 세트를 활용해서 검증을 했을 때와 oob샘플로 검증을 했을 때의 정확도 값이 크게 차이나지는 않는다.

 

 

랜덤패치와 랜덤 서브스페이스

 

BaggingClassifier 는 feature 샘플링도 가능하다. 주로 이미지와 같은 고차원 데이터셋을 다룰 때 사용한다.max_features, bootstrap_features 파라미터로 조절할 수 있다. 특성을 샘플링하게 되면 더 다양한 예측기를 만들 수 있다는 장점이 있지만 편향이 늘어난다는 단점이 있다. (편향은 늘어나고 분산은 낮아짐)

 

랜덤패치 : 훈련 feature와 샘플을 모두 샘플링하는 것랜덤서브스페이스 : 훈련샘플을 모두 사용하고 특성은 샘플링(bootstrap=False, max_samples=1.0) 또는 (bootstrap_features=True, max_features는 1.0보다 작게)