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) 알고리즘
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)
정확하게 분류된 것을 확인할 수 있다.
'통계학 > BITAmin' 카테고리의 다른 글
unicodedecodeerror: 'utf-8' codec can't decode byte 0xc3 in position 9382: invalid continuation byte (오류해결?) (0) | 2021.07.18 |
---|---|
13주차 - (1) : 불균형데이터의 처리 (0) | 2021.01.21 |
12주차 : 2학기 기말고사, 복습과제로 오답정리 (0) | 2021.01.12 |
10주차 복습 : KNN, SVM, Ensemble (0) | 2020.12.11 |
댓글