앙상블 훈련 방법 중 가장 많이 쓰이는 방법은 배깅, 부스팅, 스태킹이 있다. 오늘은 그 중에서 배깅에 대해서 알아보자.
앙상블 방법은 여러개의 괜찮은 예측기를 연결해 더 좋은 예측기를 만드는 방법이다. 각각의 예측기의 성능이 뛰어날 필요는 없다. 각 분류기가 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보다 작게)
'파이썬 > 머신러닝' 카테고리의 다른 글
light GBM이란? 파라미터 설명과 코드 실습 (1) | 2021.07.11 |
---|---|
에이다부스트와 그라디언트부스팅 기본 개념과 코드, 부스팅과 배깅의 차이 (0) | 2021.06.22 |
랜덤 포레스트 원리와 구현 사이킷런 예제로 코드 실습해보기 (1) | 2021.06.19 |
캐글 heart 데이터로 EDA부터 로지스틱회귀, 트리모델 적합까지 총정리 (0) | 2021.06.17 |
타이타닉 데이터 전처리와 결정트리 모델 (0) | 2021.06.15 |