본문 바로가기
통계학/BITAmin

11주차 : Bagging, Boosting - AdaBoost, GBM, XGBoost, LightGBM

by zzyunzz 2021. 1. 4.

1. 배깅(Bagging) ; Bootstrap Aggregation

- 샘플을 여러 번 뽑아(복원 추출; bootstrap) 각 샘플 별로 모델을 학습시키고 결과물을 집계(Aggregation)

- 장점

* 의사결정트리 모델은 depth가 깊어질수록 오버피팅이 심해져서 편향은 감소, 분산은 증가

→ 배깅을 통해 tree 모델을 결합하면 낮아진 편향에서 전체 분산도 감소하여 오버피팅의 부작용을 줄일 수 있게 됨

 

- 과정 :

(1) 여러 개의 weak learners를 만들어서 개별적으로 학습하고, 결과를 합쳐서 하나의 strong learner으로 만듦

(2) 범주형(categorial; 이진 분류 또는 다중분류를 위한) 데이터의 경우 보팅(voting) 방식으로 결과를 집계

    * hard voting vs. soft voting

(3) 연속형(numeric) 데이터의 경우 예측값에 평균을 취해 최종 결과로 활용

 

예시 ) RandomForestClassifier - DecisionTreeClassifier을 bagging한 대표적인 앙상블(ensemble) 알고리즘

출처 : How does the random forest model work? How is it different from bagging and boosting in ensemble models? (sebastianraschka.com)

2. 부스팅(Boosting) ; 순차 학습-예측, 가중치 수정 방식

- 여러 개의 weak learner순차적으로 학습-예측하고, 잘못 예측된 데이터에는 가중치 부여를 통해 오류를 개선해나가는 방식 

* 이 지점에서 tensorflow 배울 때 GradientDescentAlgorithm에서 learning rate 수정하면서 loss function의 global minimum으로 가는 방식과 유사하다고 느낌 ‼

- 처음 모델이 예측을 하면 예측 결과와 실제 데이터를 비교해 잘못 예측된 데이터에 가중치가 부여되고, 부여된 가중치는 다음 weak learner에 사용되어 예측을 반복하게 됨.

→ 배깅은 일반적인 모델 구축에 이용된다면, 부스팅은 맞추기 어려운 문제에 좀 더 집중하고 있음

(** 분류하기 어려운 데이터를 더 잘 분류하고 싶다 !)

- 장점 : 배깅에 비해 오류가 적다, 알고리즘에 대한 해석이 쉽다(모델의 예측 결과를 해석하는데에 용이하다)

cf. 랜덤포레스트 알고리즘의 경우 모델 예측 결과를 그대로 해석하는 데에는 어려움이 있었음

- 단점 :

(1) 속도가 느리고(recursive mechanism 자체의 문제?)

(2) 과적합될 가능성이 배깅보다 높음

→ train set에 최적화하고자 하는 메커니즘이 배깅쪽보다는 부스팅쪽에서 높으니(가중치를 부여하며 반복적 학습) 당연한 문제

(3) recursive하게 추정되는 estimator들이 이전 모델의 정확성에 기반하여 갱신되기 때문에 확장시키기 어려움

- 대표적 알고리즘 : AdaBoost, GBM, XGBoost, LightGBM

배깅(Bagging)과 부스팅(Boosting) 정리

- 배깅 : 데이터가 추출될 확률이 모두 같음 (uniform dist)
→ 확률이 같으므로 독립적인 모델을 동시에 병렬적(parallel)으로 실행해도 됨.
- 부스팅 : 잘못 분류되는 데이터에 가중치를 부여하면서 예측을 수정해나가야 함
→ 가중치 갱신을 통해 모델링을 계속해나갈수록 특정 데이터가 추출될 확률이 점점 더 높아짐
→ 병렬 처리가 불가능!

3. AdaBoost ; Boosting의 대표적 알고리즘

- 메커니즘 :

(1) 부트스트래핑된 하나의 샘플에 대해서 split을 한 번만 시행하는 stump tree 생성. 즉 weak learner 하나 생성

(2) 모델링 결과와 실제 데이터(label)을 비교하여 오분류된 데이터에 대해 가중치를 부여하여 데이터셋을 갱신 

(3) 갱신된 데이터셋에 대한 두 번째 weak learner를 생성

(4) 데이터가 완벽하게 분류될 때까지 위 과정을 반복

 

- 예제 

from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix

df = pd.read_excel('./banknote.xlsx')
df = df.drop(["Unnamed: 0"],axis = 1)
df.head()

ada_clf = AdaBoostClassifier(base_estimator = DecisionTreeClassifier(max_depth = 1), 
                             n_estimators = 200,algorithm = 'SAMME', learning_rate = 0.5, random_state = 156)
ada_clf.fit(X_train, y_train)

predictions = ada_clf.predict(X_test)
confusion_matrix(prediction, y_test)

오차행렬 출력 결과 : 

array([[150,   0],
       [  0, 125]], dtype=int64)

정확하게 분류된 것을 확인할 수 있다.

댓글