[TIL | 230612] 앙상블 학습-보팅, 배깅, 부스팅

sun_U·2023년 6월 12일
0

TIL

목록 보기
4/21
post-thumbnail

참고 도서: 파이썬 머신러닝 완벽 가이드 개정 2판

Ensemble Learning🧩

: 여러개의 분류기를 생성하고, 그 예측을 결합해 보다 정확한 최종 예측을 도출하는 기법.

목적 : 다양한 분류기의 예측 결과 결합을 통해 단일 분류기보다 신뢰성이 높은 예측값 얻기
종류 : Voting, Bagging, Boosting, Stacking 등


1. Voting

  • 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정. 서로 다른 알고리즘을 가진 분류기를 결합.

Hard Voting

  • 예측한 결괏값들 중 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정하는 것. (다수결)

Soft Voting

일반적으로 Soft Voting 사용

  • 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정

사용

from sklearn.ensemble import VotingClassifier

  • estimators - voting에 사용된 Classifier 객체들 튜플 형식으로 입력
  • voting - 'hard', 'soft' 방식 선택(default값은 'hard')

2. Bagging

  • 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정. 같은 알고리즘으로 여러 개의 분류기를만들어서 보팅으로 최종 결정하는 알고리즘으로, 데이터 샘플링을 서로 다르게 가지며 학습 수행

Random Forest

from sklearn.ensemble import RandomForestClassifier

  • 결정 트리 기반. 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한 뒤 최종적으로 모든 분류기가 보팅을 통해 예측 결정.

  • 부트스트래핑(bootstrapping) 분할 방식으로 subset data 생성.

  • Bootstrapping : 여러 개의 데이터 세트를 중첩되게 분리하는 것.

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import warnings
warnings.filterwarnings('ignore')

X_train, X_test, y_train, y_test = get_human_dataset()

rf_clf = RandomForestClassifier(random_state=0, max_depth=8)
rf_clf.fit(X_train, y_train)
pred = rf_clf.predict(X_test)
accuracy = accuracy_score(pred, y_test)
print('랜덤 포레스트 정확도: {:.4f}'.format(accuracy))

출력 결과 : 랜덤 포레스트 정확도: 0.9196

Random Forest Hyperparameter, Tuning

  • n_estimators : 랜덤 포레스트에서 결정 트리의 개수 지정, default = 10
  • max_features : 결정 트리에 사용된 max_features 파라미터와 같지만 기본은 'auto', 'sqrt'와 같음.
  • max_depth, min_samples_leat, min_samples_split
  • GridSearchCV 이용해 최적 파라미터 구한 뒤 재학습
  • n_jobs = -1 - 모든 CPU 코어를 이용해 학습 가능

3. Boosting

  • 여러 개의 분류기가 순차적으로 학습을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에는 잘못 예측한 데이터에 가중치(weight)를 부여하면서 학습과 예측을 진행하는 것.
  • 대표적인 구현
    • AdaBoost(Adaptive boosting)
    • GBM

GBM(Gradient Boosting Machine)

from sklearn.ensemble import GradientBoostingClassifier

  • AdaBoost와 유사하지만 가중치 업데이트를 경사 하강법을 이용.
  • 학습 시간이 오래 걸림.
  • hyperparameter
    • loss - 경사 하강법에서 사용할 비용 함수 지정. 기본값은 'deviance'
    • learning_rate - GBM이 학습을 진행할 때마다 적용하는 학습률. n_estimators와 상호 보완적으로 사용
    • n_estimators - weak learner의 개수.
    • subsample - weak learner가 학습에 사용하는 데이터의 샘플링 비율. 기본값 1.

XGBoost(eXtra Gradient Boost)

  • GBM에 기반하지만 GBM의 단점을 극복해 많이 사용되고 있음.
  • 수행 속도 향상을 위한 Early Stopping 사용 가능
  • 파이썬 래퍼 XGBoost는 전용 데이터 객체 DMatrix 사용.
  • 사이킷런의 predict()와 달리 예측 결괏값이 아닌 예측 결과를 추정할 수 있는 확률 값 반환
  • plot_importance() : 패키지에 내장된 API로 features의 중요도를 막대그래프 형식으로 나타냄
  • cv() : GridSearchCV와 유사하게 데이터 세트에 대한 교차 검증 수행 후 최적 파라미터를 구하는 방법. 반환값은 DataFrame 형태

장점
1. 뛰어난 예측 성능
2. GBM 대비 빠른 수행 시간
3. 과적합 규제
4. 나무 가지치기(Tree pruning)
5. 자체 내장된 교차 검증
6. 결손값 자체 처리

하이퍼 파라미터 유형

1. 일반 파라미터
: 일반적으로 실행 시 스레드의 개수나 silent 모드 등의 선택을 위한 파라미터로서 디폴트 파라미터 값을 바꾸는 경우는 거의 없음.

2. 부스터 파라미터
: 트리 최적화, 부스팅, regularization 등과 관련 파라미터 등을 지칭하며 대부분의 하이퍼 파라미터는 Booster 파라미터에 속함.

  • eta : GBM의 learning_rate와 같은 파라미터. defalut는 0.3. 과적합 발생 시 값 낮추기.
  • num_boost_rounds : GBM의 n_estimators와 같은 파라미터
  • min_child_weight : 트리에서 추가적으로 가지를 나눌지 결정하기 위해 필요한 데이터들의 weight 총합. 값이 클수록 분할을 자제.
  • gamma : 트리의 리프 노드를 추가적으로 나눌지를 결정할 최소 손실 감소 값. 값이 클수록 과적합 감소
  • max_depth : 트리 기반 알고리즘의 max_depth와 같음. default는 6이며 보통 3~10사이의 값을 가짐. 0을 지정할 경우 깊이에 제한이 없음.
  • sub_sample : GBM의 subsample과 동일. 데이터 샘플링 비율을 지정.
  • colsample_bytree : GBM의 max_features와 유사. 트리 생성에 필요한 feature를 임의로 샘플링 하는 데 사용.

3. 학습 태스크 파라미터
: 학습 수행 시의 객체 함수, 평가를 위한 지표 등을 설정하는 파라미터

  • eval_metric : 검증에 사용되는 함수
    • rmse (회귀 기본값), mae, logloss, error (분류 기본값), merror, mlogloss, auc

LightGBM(Light Gradient Boost)


Stacking

  • 여러 가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어 다른 모델(메타 모델)로 재학습시켜 결과를 예측하는 방법

실습 코드

profile
Data Engineer🐣

0개의 댓글