article thumbnail image
Published 2021. 11. 22. 15:33

Ensemble Learning

Ensemble Learning : 여러 개의 Classifier를 생성하고, 예측을 결합해서, 단일 Classifier보다 정확한 예측 결과를 도출하는 기법

 

Voting, Bagging, Boosting 으로 구분할 수 있다.

+ Stacking

 

Bagging : Random forest

Boosting : 에이다 부스팅, 그래디언트 부스팅, XGBoost, LightGBM

 

특징

단일 Classifier의 약점을 다수의 모델들을 결합하여 보완

뛰어난 성능의 모델로만 구성하는 것보단 성능이 떨어지더라도, 서로 다른 유형의 모델을 섞는 것이 나을 수 있다.


Voting & Bagging

Voting & Bagging

 

Voting과 Bagging은 여러개의 Classifier가 투표를 통해 최종 예측 결과를 결정하는 방식이다.

 

Voting

  1. 서로 다른 알고리즘을 가진 Classifier를 결합하는 것
  2. 다른 알고리즘 & 같은 데이터

Bagging

  1. 같은 유형의 알고리즘 기반이지만, 데이터 샘플링을 서로 다르게 한 후, 학습을 하고 나서 Voting 하는 것
  2. 같은 알고리즘 & 다른 데이터

Hard Voting & Soft Voting

Hard Voting & Soft Voting

Voting 유형은 2가지가 있다.

Hard Voting다수결로 결정하는 방식이다.

Soft Voting클래스별 확률을 평균을 내서 결정하는 방식이다.

predict_proba() 메쏘드를 이용한다.

 

일반적으로 Soft Voting이 더 성능이 뛰어나기 때문에 주로 사용된다.

사이킷런은 VotingClassfier로 Voting을 지원한다.


위스콘신 유방암 데이터 로드

import pandas as pd

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

cancer = load_breast_cancer()

data_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
data_df.head(3)


VotingClassifier로 Logistic Regression과 KNN을 Voting 방식으로 결합하고 성능 비교

# 개별 모델은 로지스틱 회귀와 KNN 임. 
lr_clf = LogisticRegression()
knn_clf = KNeighborsClassifier(n_neighbors=8)

# 개별 모델을 소프트 보팅 기반의 앙상블 모델로 구현한 분류기 
vo_clf = VotingClassifier( estimators=[('LR',lr_clf),('KNN',knn_clf)] , voting='soft' )

X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.2 , random_state= 156)

# VotingClassifier 학습/예측/평가. 
vo_clf.fit(X_train , y_train)
pred = vo_clf.predict(X_test)
print('Voting 분류기 정확도: {0:.4f}'.format(accuracy_score(y_test , pred)))

# 개별 모델의 학습/예측/평가.
classifiers = [lr_clf, knn_clf]
for classifier in classifiers:
    classifier.fit(X_train , y_train)
    pred = classifier.predict(X_test)
    class_name= classifier.__class__.__name__
    print('{0} 정확도: {1:.4f}'.format(class_name, accuracy_score(y_test , pred)))

 

VotingClassifier의 인자의 estimators 는 리스트 형태로 받는다. 리스트 안은 튜플 형으로 넣어준다.

[('키이름', estimator), ('키이름', estimator)] 형태로 넣어준다.

Voting 방식은 디폴트가 hard이므로 soft로 설정해준다.

 

그런 다음 학습을 한다.

그러면 개별 모델들이 학습하고, 예측한 결과를 가지고 평가를 하게 된다.

 

또 개별적인 모델로도 비교해보면

 

 

이정도의 정확도가 나오는데 꼭 개별 모델보다 좋아진다는 보장은 없다.

좋을 수도 있고, 그렇지 않을 수도 있다.


Bagging

데이터셋을 중첩되게 분리하는 것을 Bootstrapping 분할 방식이라고 한다.

Bagging은 bootstrap aggregating의 줄임말이다.

 

데이터를 중첩해서 여러번 추출한 것


Bagging이 가장 많이 쓰이는 RandomForestClassifier

RandomForestClassifier 하이퍼파라미터

 

  1. n_estimators 
    1. 랜덤 포레스트에서 결정 트리의 개수를 지정한다. 디폴트 = 10
    2. 많이 설정할수록 좋은 성능이 나오지만 성능이 무조건 향상되는 것은 아니다.
  2. max_features
    1. Decision Tree의 max_features와 같다.
    2. sqrt(전체 피처 개수)만큼 참조한다.
  3. max_depth
  4. min_samples_leaf

 


Boosting

  1. 여러 개의 weak learner를 순차적으로 학습-예측 하면서 error 계산
  2. 잘못 예측한 데이터에 weight 부여
  3. error를 감소시키는 새로운 모델 학습

Boosting 기법은 Sample이 error에 기여하는 정도, Sample Weight을 조절(계산)하는 방법에 따라 종류가 매우 다양하다.

대표적으로 AdaBoost(Adaptive boosting) 과 Gradient Boosting이 있다.

순차적으로 학습-예측 하다보니까 시간이 오래 걸릴 수 밖에 없다.


AdaBoost

AdaBoost의 학습 예측

 

Step 1: 분류 기준 1로 +/- 구분. 동그라미는 잘못 분류된 데이터.
Step 2: 동그라미에 가중치 부여
Step 3: 분류 기준 2로 +/- 구분. 동그라미 잘못 분류된 데이터.
Step 4: 동그라미에 더 큰 가중치 부여
Step 5: 분류 기준 3으로 +/- 구분.
Final: 분류 기준 1, 2, 3을 결합한 예측 결과


GBM (Gradient Boost Machine)

AdaBoost와 유사하지만 가중치 업데이트를 경사 하강법을 이용

 

  1. 경사 하강법: 오류식(h(x) = y - F(x), F(x): 예측함수, y: 실제 결과값)을 최소화하는 방향성을 가지고 반복적으로 가중치 값을 업데이트하는 것
  2. GradientBoostingClassifier
  3. 장점: 일반적으로 랜덤 포레스트보다는 에측 성능이 조금 뛰어남, 과적합에도 강한 뛰어난 예측 성능
  4. 단점: 수행 시간 오래 걸림, 하이퍼 파라미터 튜닝 노력 필요

 

하이퍼 파라미터

  1. loss : 경사하강법에서 사용할 비용함수 지정. 보통 기본값인 'deviance' 적용
  2. learning_rate
    1. 학습 진행 시마다 적용하는 학습률.
    2. 0~1 (default=0.1)
    3. 너무 작은 값은 업데이트 값이 작아져 최소 오류 값을 찾아 예측 성능이 높아질 수 있지만 시간이 오래 걸린다.
    4. 너무 큰 값은 최소 오류 값을 찾지 못하여 예측 성능은 떨어지지만 빠른 수행이 가능.
  3. n_estimators 
    1. weak learner의 개수
    2. (default=100)
    3. 개수가 많을수록 예측 성능이 좋아지지만 시간이 오래 걸린다.
    4. learning_rate와 상호 보완적으로 조합해 사용한다.
  4. subsample 
    1. weak learner가 학습에 사용하는 데이터의 샘플링 비율
    2. (default=1: 전체 학습 데이터를 기반으로 학습)

XGBoost (eXtra Gradient Boost)

  1. 분류와 회귀 영역에서 뛰어난 예측 성능
  2. GBM 대비 빠른 수행 시간 : 병렬 수행 및 다양한 기능, but 다른 머신러닝 알고리즘에 비해서 빠르다는 것은 아님
  3. Overfiting Regularization(과적합 규제)
  4. Tree pruning(가지치기) : 더이상 긍정 이득이 없는 분할을 가지치기 해서 분할 수를 더 줄임
  5. 자체 내장된 교차 검증 : 반복 수행 시마다 교차 검증을 수행해 최적화된 반복 수행 횟수를 가질 수 있음
  6. Early Stopping(조기 중단 기능) : n_estimators에 지정한 부스팅 반복 횟수에 도달하지 않더라도 예측 오류가 더 이상 개선되지 않으면 반복을 중지해 수행 시간 개선
  7. 결손값 자체 처리

 

부스트는 특히 하이퍼 파라미터가 굉장히 많다. 모두 다 알 필요도 없고 튜닝 하려고 너무 시간 낭비 안해도 된다.

XGBoost는 파이썬 Wrapper도 있고 사이킷런 Wrapper도 있다.

사이킷런 Wrapper의 경우 GBM에 동일한 하이퍼 파라미터가 있다면 이를 사용하고, 그렇지 않다면 파이썬 Wrapper의 하이퍼파라미터를 사용한다.

 

사이킷런 Wrapper 하이퍼 파라미터

  1. learning_rate : GBM의 학습률. 0~1 사이의 값을 지정하며, 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값. 보통 0.01~0.2 값을 선호.
  2. n_estimators : GBM의 n_estimators와 동일한 기능
  3. min_child_weight : weight값이 특정값이 넘으면 child를 만들 거냐, 안 만들 거냐? 결정트리의 min_child_leaf 와 유사. 과적합 조절용
  4. gamma : 트리의 리프 노드를 추가적으로 나눌지를 결정할 최소 손실 감소 값. 해당 값보다 큰 손실이 감소된 경우에 리프 노드를 분리. 값이 클수록 과적합 감소 효과가 있음.
  5. max_depth : 트리의 최대 길이. 트리 기반 알고리즘의 max_depth와 동일한 기능
  6. sub_sample : 트리가 커져서 과적합되는 것을 제어하기 위해 데이터를 샘플링하는 비율(GBM의 subsample과 동일한 기능)
  7. reg_lambda : L2 Regularization
  8. reg_alpha : L1 Regularization
  9. scale_pos_weight : 비대칭한 클래스로 구성된 데이터 세트의 균형을 유지하기 위한 파라미터
  10. colsample_bytree: 트리 생성에 필요한 피처를 임의로 샘플링하여 과적합을 조정하는 데 적용. GBM의 max_feautres와 유사

 

XGBoost Early Stopping

XGBoost는 특정 반복 횟수 만큼 더 이상 비용함수가 감소하지 않으면 지정된 반복횟수를 다 완료하지 않고 수행을 종료할 수 있다.

학습을 위한 시간을 단축시킬 수 있다. 최적화 튜닝 단계에서 적절하게 사용 가능.

너무 반복 횟수를 단축할 경우, 예측 성능 최적화가 안된 상태에서 학습이 종료될 수도 있다.

 

 

 

 

'💡 AI > ML' 카테고리의 다른 글

ML - interview  (0) 2022.04.11
ML - Decision Tree  (0) 2021.11.21
ML - F1 score, ROC-AUC  (0) 2021.11.19
ML - Confusion Matrix, Precision, Recall  (0) 2021.11.18
ML - 평가(evaluation)  (0) 2021.11.12
복사했습니다!