오늘은 앙상블 학습에 대해 공부해 봤습니다.
현재 분류에 대해 공부하고 있으므로 앙상블 학습 분류에 대해 작성했습니다.
회귀도 거의 비슷한 원리로 동작합니다.😀
여기서는 대표적인 앙상블 알고리즘인 보팅, 배깅, 부스팅에 대해 다룹니다.
(스태킹은 따로 공부할 예정입니다.)
앙상블 학습을 통한 분류는 여러 개의 분류기(Classifier)를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법을 말합니다.
대부분의 정형 데이터 분류 시에는 앙상블이 뛰어난 성능을 나타내고 있습니다.
앙상블 알고리즘의 대표적인 예로, 랜덤 포레스트와 그래디언트 부스팅 알고리즘이 있습니다.
보팅과 배깅은 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식입니다.
보팅과 배깅의 다른 점은 보팅의 경우 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합하는 것이고, 배깅의 경우 각각의 분류기가 모두 같은 유형의 알고리즘 기반이지만, 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행해 보팅을 수행하는 것입니다.
배깅 방식은 같은 알고리즘에 학습하는 데이터가 다릅니다.
학습 데이터는 원본 데이터에서 샘플링해서 추출합니다.
이런 방식을 Bootstrapping(부트스트래핑) 분할 방식이라고 부릅니다.
교차 검증은 데이터를 중복하지 않지만, 부트스트래핑은 중복을 허용한다는 점에서 차이가 있습니다.
보팅 방법은 하드 보팅과 소프트 보팅으로 나뉩니다.
하드 보팅은 다수결의 원칙이라고 생각하면 되고, 소프트 보팅은 클래스 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 가장 높은 클래스 값을 최종 보팅 결과값으로 선정합니다.
일반적으로 소프트 보팅 방법을 사용합니다.
sklearn에서는 VotingClassifier 클래스에서 보팅 방식을 사용할 수 있습니다.
vo_clf = VotingClassifier(estimators=[('LR', lr_clf), ('KNN', knn_clf)], voting='soft')
랜덤 포레스트는 배깅의 대표적인 알고리즘 입니다.
랜덤 포레스트에 weak learner로 사용되는 알고리즘은 DecisionTree입니다.
랜덤 포레스트는 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한 뒤 최종적으로 모든 분류기가 보팅을 통해 예측 결정을 하게 됩니다.
데이터를 샘플링 할 때, 부트스트래핑 분할 방식을 이용합니다.
sklearn에서는 RandomForestClassifier 클래스를 통해 랜덤 포레스트 기반의 분류를 지원합니다.
랜덤 포레스트는 병렬도가 매우 뛰어난 알고리즘 이므로 학습 속도가 상대적으로 빠릅니다.
sklearn 랜덤 포레스트에서 주요 파라미터는 다음과 같습니다.
파라미터를 보면, 결정 트리에 존재하는 파라미터가 대부분 입니다.
랜덤 포레스트 알고리즘은 매우 뛰어난 앙상블 알고리즘이지만, 과적합을 주의해야 합니다.
부스팅 알고리즘은 여러 개의 모델이 순차적으로 학습을 수행하되, 앞에서 학습한 모델이 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 모델에게는 데이터에 weight(가중치)를 부여하면서 학습과 예측을 진행하는 것입니다.
이때, 각 모델을 weak learner라고 합니다.
부스팅의 weak learner는 보통 DecisionTree를 사용합니다. (분류)
이런 부스팅 알고리즘은 과적합에 강하다는 장점이 있지만, 결과에 대한 해석이 불가능하고, Noise가 많은 데이터에 대해서는 별로 좋은 결과를 얻지 못할 수도 있습니다.
부스팅의 대표적인 구현은 AdaBoost(에이다 부스트)와 GBM(그래디언트 부스트)이 있습니다.
에이다 부스트는 오류 데이터에 가중치를 부여하면서 부스팅을 수행하는 대표적인 알고리즘입니다.
기존 부스팅 방식이 가중치를 부여한 데이터에 대해 학습한 모델의 단순 종합이었다면, 에이다 부스트는 개별 weak learner에 각각 가중치를 부여합니다.
가중치는 각 모델의 데이터에 대한 오류로 인해 결정됩니다.
weak learner의 데이터 가중치가 고려된 오류율을 Em이라고 하면, 각 개별 모델에 적용되는 가중치는 다음과 같습니다.
L은 learning rate입니다.
에이다 부스트의 작동 원리를 그림으로 보면 다음과 같습니다.
sklearn은 AdaBoostClassifier 클래스를 제공합니다.
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
ad_clf = AdaBoostClassifier(
estimator=DecisionTreeClassifier(),
n_estimators=100,
learning_rate=0.02,
)
ad_clf.fit(X, y)
그래디언트 부스팅도 에이다 부스트와 유사하나, 가중치 업데이트를 Gradient Descent(경사 하강법)를 이용하는 것이 가장 큰 차이 입니다.
실제 정답을 y라고 하고, 모델의 알고리즘을 F(x)라고 할 때, 오류식 h(x) = y - F(x)를 최소화하는 방향성을 가지고 반복적으로 가중치 값을 업데이트 하는 것이 경사 하강법 입니다.
에이다 부스트에서는 손실 함수로 Exponential Error Function(지수 손실 함수)를 사용했지만, 그래디언트 부스팅은 내가 원하는 손실 함수를 정할 수 있다는 장점이 있습니다.
sklearn은 GradientBoostingClassifier 클래스를 제공합니다.
from sklearn.ensemble import GradientBoostingClassifier
gb_clf = GradientBoostingClassifier(
n_estimators=100,
learning_rate=0.2,
loss='log_loss',
subsample=0.5,
min_samples_leaf=2,
min_samples_split=2,
max_depth=4,
max_features='sqrt',
verbose=1
)
gb_clf.fit(X_train, y_train)
그래디언트 부스팅의 주요 하이퍼 파라미터는 다음과 같습니다.
[개정판] 파이썬 머신러닝 완벽 가이드
AdaBoost, GBM, XGBoost
scikit-learn 공식 문서