앙상블 분류 모델

2023. 5. 1. 16:43개인활동/파이썬 머신러닝 완벽가이드

1. 개요

1) 앙상블이란?

  • 여러개의 classifier를 생성하고 각 classifier가 예측한 값들을 결합함으로써 정확한 최종 예측 결과를 도출하는 기법
  • 대부분의 정형데이터 분류 시 앙상블 모델들이 뛰어난 성능을 나타냄
  • 랜덤 포레스트, 그래디언트 부스팅 등의 모델들이 있음

2) 학습 유형

  • 투표를 통해 최종 예측 결과 결정
    • 보팅
    • 배깅
  • 여러개의 분류기가 순차적으로 삭습 수행, 예측이 틀린 데이터에 대해서는 가중치 부여
    • 부스팅
  • 여러가지 다른 모델들의 예측 결과값을 학습 데이터로 만들고, 다른 모델(메타모델)에 이를 재학습시켜 결과를 예측
    • 스태킹
  • 이 외에도 다양한 유형이 있음

2. 앙상블 학습 유형

1) 보팅

  • 일반적으로 서로 다른 알고리즘을 가진 classifier를 결합함
  • 보팅 유형
    • 하드보팅
      • 다수결의 원칙과 비슷한 분류
      • 예측 결과값 중 다수의 분류기가 결정한 예측값을 최종 보팅 결과값으로 선정
    • 소프트보팅
      • 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균을 내어 확률이 가장 높은 레이블 값을 최종 보팅 결과값으로 선정
      • 일반적으로 많이 사용되는 유형임
    • 보팅 예제 실행 시 주의점
      • logistic regression 모델의 하이퍼파라미터 중 max_iter의 값을 넣어주지 않는 경우 이런 에러가 뜸
      • 이 경우 max_iter에 충분히 큰 값을 넣어주면 사라짐
...\\anaconda3\\lib\\site-packages\\sklearn\\linear_model\\_logistic.py:814: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    <https://scikit-learn.org/stable/modules/preprocessing.html>
Please also refer to the documentation for alternative solver options:
    <https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression>
  n_iter_i = _check_optimize_result(
  • 특성
    • 보팅 분류기가 항상 성능이 좋게 나오는 것은 아님
    • 데이터의 특성, 분포 등 다양한 조건에 의해 예측 성능이 달라짐
    • 머신러닝 모델에서 가장 주의해야 하는 점은 편향-분산 트레이드오프

2) 배깅(Bootstrapping Aggregating)

  • 각각의 classifier가 모두 같은 유형의 알고리즘 기반이지만 데이터 샘플링을 서로 다르게 가져가면서 학습을 수행해 보팅을 수행함
  • 이때 데이터 샘플링시 일부 데이터들이 중첩되도록 하고 각 classifier에게 할당하는 것을 Bootstrapping 분할 방식이라고 부름
  • 배깅 대표 모델
    • Random Forest
      • Decision Tree 모델을 여러개 이용해 예측 후 보팅으로 최종 결정을 내림
      • 주요 하이퍼파라미터
        • n_estimators
          • 랜덤포레스트에서 결정트리의 개수를 지정함
          • default=10
          • 많이 설정할 수록 성능이 좋아질 수 있으나 무조건적으로 향상되는 것은 아니며, 학습 수행시간이 오래걸림
        • max_features
          • decision tree에서 사용되는 하이퍼파라미터와 똑같은 것
          • default = ‘auto’
          • 트리 분할 시 전체 feature를 모두 참조하는 것이 아닌 sqrt(전체 feature)만큼 참조함 (sqrt = 루트)
        • max_depth
          • 트리의 최대 깊이 설정
        • min_samples_leaf
          • 최소 리프노드의 수
      • 예제

3) 부스팅

  • 여러개의 classifier가 순차적으로 학습, 앞에서 학습한 분류기가 예측이 틀린 데이터의 경우에는 가중치를 부여해 올바르게 예측할 수 있도록 함
  • 예측 성능이 뛰어나 앙상블 학습을 주도하고 있으며 대표적인 부스팅
  • 부스팅 구현
    • AdaBoost(Adaptive Boosting)
      • 잘못 분류된 데이터에 대하여 가중치를 부여하고 더 잘 분류할 수 있도록 함
      • 이때 학습 회차가 늘어날 수록 가중치가 점점 더 커짐
      • 여러번의 학습 결과를 합쳐 예측 결과를 내놓음
    • Gradient Boosting
      • AdaBoost와 방법이 유사하나 가중치 업데이트 시 경사하강법을 이용함
      • 결과값을 y, 예측 함수를 F(x)라고 할 때 에러값 h(x) = y - F(x)
      • 이 식의 값을 최소화 시키기 위해 반복적으로 가중치를 업데이트 하는 방식임
  • 부스팅 대표 모델
    • GBM(Gradient Boosting Machine)
      • 일반적으로 랜덤포레스트보다 나은 성능을 보이나 수행시간이 오래걸리고, 하이퍼파라미터 튜닝 노력도 필요함
      • 주요 하이퍼파라미터
        • max_depth, max_features
        • loss
          • 경사 하강법에서 사용할 비용함수 지정
          • default=deviance
        • learning_rate
          • 학습 진행 시 적용하는 학습률로 에러 값을 보정할 때 사용하는 계수
          • 0~1 사이의 값을 가지며 default는 0.1
          • 너무 작은 값을 지정하는 경우 업데이트를 해도 값이 작아 최소 오류를 정교하게 찾을 수 있지만 수행시간이 너무 오래걸리며 학습 반복이 완료되기 전에 최소 오류값을 못찾는 경우가 생길 수 있음.
          • 너무 큰값을 지정하는 경우 업데이트된 값이 너무 커져 최소 오류를 지나쳐 예측 성능이 떨어질 수 있으나 수행 시간은 짧아짐
          • n_estimators와 상호보완적으로 조합해 사용함
        • n_estimators
          • weak learner의 개수로 각 weak learner가 순차적으로 오류를 보정하므로 개수가 많을수록 예측 성능이 좋아질 수 있으나 수행시간이 오래걸림
          • default=100
        • subsample
          • weak learner가 학습에 사용하는 데이터의 샘플링 비율
          • default=1
          • 0~1사이의 값을 가짐
      • 예제
      • https://github.com/cAhyoung/dacon_stars_type_clf/blob/main/practive_code/gbm_study.ipynb
    • XGBoost(eXtra Gradient Boost)
      • 트리기반 앙상블 학습
      • GBM 기반이지만 느린 수행시간, 과적합 규제의 부재 등의 문제를 해결해 각광받음
      • 병렬 CPU 환경에서 병렬학습이 가능해 GBM보다 빠르게 학습을 완료할 수 있음뛰어난 예측 성능 분류와 회귀 영역에서 뛰어난 예측 성능을 보임
        GBM 대비 빠른 수행시간 병렬 수행 및 다양한 기능을 통해 GBM보다 빠른 속도를 보임. 다만 GBM을 제외한 다른 모델들과 비교했을 때 빠른 것은 아님
        과적합 규제(Regurarization) 표준 GBM의 경우 과적합 규제 기능이 업승나 XGBoost는 자체적으로 과적합 규제 기능을 가지고 있음 → 더 강한 내구성을 보임
        Tree pruning GBM은 분할 시 부정 손실이 발생하면 분할을 더이상 수행하지 않으나이러한 방식은 지나치게 많은 분할을 일으킬 수 있음. 이따 XGBoost의 경우 max_depth와 같은 하이퍼파라미터를 조절하는 방법도 있지만 긍정적인 이득이 존재하지 않는 분할의 경우 가지치기를 함으로써 분할되는 수를 줄일 수 있음
        자체 내장 교차검증 반복 학습 시 내부적으로 train set과 test set을 이용해 교차검증을 수행하여 최적화된 반복 수행 횟수를 찾아냄. 이때 지정된 횟수 전에 최적화된 값을 찾아내면 조기 중단할 수 있는 기능이 있음
        결손값 자체 처리 결손값 자체 처리 기능을 가짐
      • 원래는 사이킷런과 호환되는 패키지가 아니였으나 사이킷런을 많이 사용하기에 추가적으로 사이킷런과 연동되는 래퍼 클래스를 제공
      • 아나콘다 인터프리터에 없는 모델이기에 아나콘다 프롬프트를 이용해 설치해줘야 함
        • 아나콘다 프롬프트를 관리자 권한으로 실행
        • conda install -c anaconda py-xgboost
      • 주요 하이퍼파라미터-파이썬래퍼용 파라미터(사이킷런 래퍼용 파라미터)
        • 일반 파라미터: 실행 시 스레드 개수, 모드 등을 선택, 디폴트 파라미터를 주로 사용
          • booster: gbtree 또는 gblinear → default=gbtree
          • silent: 출력 메세지를 나타낼까말까? default=0 (나타냄)
          • nthread: CPU 실행 스레두 개수를 조절, default=전체다씀
        • 부스터 파라미터: 최적화, 부스팅, regularization 등과 관련된 파라미터 설정
          • eta(learning_rate): 학습률과 같은 파라미터로 0~1 사이의 값을 지정하나 일반적으로 0.01~0.2 사이의 값을 선호. default=0.3(0.1)
          • num_boost_rounds: n_estimators와 같은 파라미터
          • min_child_weight: 트리에서 추가적으로 가지를 나눌 것인지 결정할 weight의 총합으로 클수록 분할을 자제함. default=1
          • gamma(min_split_loss): 트리의 리프노드를 추가적으로 나눌지를 결정하는 최소 손실 감소 값으로 해당 값보다 큰 loss가 감소했을 때 리프노드를 분리하여 과적합을 감소시킬 수 있음. default=1
          • max_depth: 트리 기반 알고리즘의 max_depth와 같은 파라미터로 0으로 설정 시 깊이에 제한이 없으며 값이 높을수록 특정 피쳐 조건에 특화된 룰이 만들어지므로 과적합 가능성이 높아지며 3~10의 값을 주로 이용함. default=6
          • sub_sample: GBM의 supsample과 같은 파라미터로 트리가 커져 과적합되는 것을 제어하기 위해 데이터 샘플링 비율을 설정하고, 일반족으로 0.5~1의 값을 사용함. default=1
          • colsample_bytree(): GBM의 max_features와 유사하며 트리 생성에 필요한 피쳐를 임의로 샘플링하는데 사용. 피쳐가 많은 경우 과적합 조정 시 사용됨. default=1
          • lambda(reg_lambda): L2 regularization 적용, 피쳐 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있음. default=1
          • alpha(reg_alpha): L1 regularization 적용, 피쳐 개수가 많을 경우 적용을 검토하며 값이 클수록 과적합 감소 효과가 있음. default=0
          • scale_pos_weight: 특정 값으로 치우친 비대칭 클래스로 구성된 데이터셋의 균형을 유지하기 위한 파라미터. default=1
        • 학습 태스크 파라미터: 학습 수행 시 객체 함수, 평가를 위한 지표 등을 설정
          • objective: 최솟값을 가져야하는 손실함수를 정의. 이진분류인지 다중분류인지에 따라서 달라짐
            • binary:logistic: 이진분류일 때 적용하는 손실함수
            • multi:softmax: 다중분류일 때 적용하는 손실함수로 이 경우 label class의 개수인 num_class 파라미터를 설정해줘야 함
            • multi:softprob: softmax와 유사하나 개별 label class에 해당되는 예측 확률을 반환함
          • eval_metric: 검증에 사용되는 함수를 정의하며 default=rmse(회귀인 경우), default=error(분류인 경우)
            • rmse: Root Mean Square Error
            • mae: Mean Absolute Error
            • logloss: Negative log-likelihood
            • error: Binary classification error rate (0.5 threshold)
            • merror: Multiclass classification error rate
            • mlogloss: Multiclass logloss
            • auc: Area under the curve
      • 과적합 문제가 발생한 경우 해결 방법
        • eta값을 낮추고 num_round값을 높여줌
        • max_depth값을 높임
        • min_child_weight 값을 높임
        • gamma 값을 높임
        • subsample과 colcample_bytree를 조정하는 방식을 통해 트리가 복접하게 생성되는 것을 막음
    • LightGBM
      • XGBoost보다 시간이 훨신 적게 걸리며 메모리 사용량도 상대적으로 적음
      • 한가지 단점은 적은 데이터셋을 학습시키는 경우 과적합이 발생하기 쉬움 → 일반적으로 10000건 이하의 경우 과적합이 발생하기 쉽다고 함
      • GBM의 트리 분할 방식과는 다른 리프 중심 트리 분할 방식을 사용해 균형잡힌 트리로 만드는 것이 아닌 최대 손실값을 가지는 리프노드를 지속적으로 분할하여 비대칭적인 트리가 만들고, 예측 오류 손실을 최소화 할 수 있음
      • 사이킷런 래퍼 모듈이 존재하며 분류용 모델과 회귀용 모델이 모두 존재
      • 하이퍼파라미터
        • 주요 파라미터
          • num_iterations(n_estimators): 반복 수행하려는 트리의 개수를 지정하며 크게 지정할 수록 예측 성능이 높아질 수 있으나 오히려 과적합을 불러올 수 있음. default=100
          • learning_rate: 0~1 사이의 값을 가지며 부스팅을 반복적으로 수행할 때 업데이트되는 학습률로 지나치게 작아지면 과적합 이슈가 발생할 수 있고, 학습 시간이 길어지게 됨. default=0.1
          • max_depth: 0보다 작은 값을 지정하면 깊이에 제한이 없으며 Leaf Wise 기반으로 Depth Wise보다 상대적으로 깊이가 더 깊음. default=1
          • min_data_in_leaf(min_child_samples): decision tree의 min_samples_leaf와 같은 파라미터이며 최종적으로 결정되는 클래스인 리프노드가 되기 위해서 최소한으로 필요한 값을 설정하는 것임. 마찬가지로 과적합을 제어하기 위한 파라미터임. default=20
          • num_leaves: 하나의 트리가 가질 수 있는 최대 리프의 개수. default=31
          • boosting: 부스팅 트리를 생성하는 알고리즘을 기술하는 것으로 gbdt 또는 rf로 설정할 수 있음. default=gbdt
          • bagging_fraction(subsample): 데이터 샘플링 비율을 지정하는 파라미터로 과적합을 막는데 도움을 줌. default=1.0
          • feature_fraction(colsample_bytree): 각각의 트리를 학습시킬 때 무작위로 선택하는 피쳐의 비율이며 마찬가지로 과적합을 막기위해 사용됨. default=1.0
          • lambda_l2(reg_lambda): L2 Regulation을 위한 값으로 피쳐의 개수가 많을수록 적용을 검토하고 값이 클수록 과적합 감소 효과가 있음. default=0.0
          • lambda_l1(reg_alpha): L1 regulation을 위히ㅏㄴ 값으로 과적합 제어를 위한 하이퍼파라미터임. default=0.0
        • Learning Task 파라미터
          • objective: 최솟값을 가져야 할 손실함수를 정의하며 회귀, 다중클래스 분류, 이진분류에 따라 손실함수 지정
        파이썬 래퍼 LightGBM 사이킷런 래퍼 LightGBM 사이킷런 래퍼 XGBoost
        num_iterations n_estimators n_estimators
        learning_rate leaning_rate leaning_rate
        max_depth max_depth max_depth
        min_data_in_leaf min_child_samples  
        bagging_fraction subsamples subsamples
        feature_fraction colsample_bytree colsample_bytree
        lambda_l2 reg_lambda reg_lambda
        lambda_l1 reg_alpha reg_alpha
        early_stopping_round early_shoppimg_rounds early_shoppimg_rounds
        num_leaves num_leaves  
        min_sum_hessian_in_leaf min_child_weight min_child_weight
      • 하이퍼파라미터 튜닝
        • num_leaves는 개별 트리가 가질 수 있는 최대 리프의 개수로 높이면 정확도가 높아지나 트리의 갚이가 깊어지며 모델 복잡도가 커져 과적합 영향도가 커짐
        • min_data_in_leaf는 사이킷런 래퍼 클래스에서 min_child_samples로 이름이 바뀌며 과적합 개선을 위한 중요한 파라미터 중 하나임. 값이 클수록 트리가 깊어지는 것을 방지함
        • max_depth는 명시적으로 깊이의 크기를 제한하며, num_leaves와 min_data_in_leaf랑 결합하여 과적합을 개선하는데 사용함
      • 예제
# 아나콘다 프롬프트를 관리자권한으로 실행
conda install -c conda-forge lightgbm
  • 해당 메세지는 다음 두 파라미터가 사라질 예정이라고 하니 참고하자
\\anaconda3\\lib\\site-packages\\lightgbm\\sklearn.py:726: UserWarning: 'early_stopping_rounds' argument is deprecated and will be removed in a future release of LightGBM. Pass 'early_stopping()' callback via 'callbacks' argument instead.
  _log_warning("'early_stopping_rounds' argument is deprecated and will be removed in a future release of LightGBM. "
\\anaconda3\\lib\\site-packages\\lightgbm\\sklearn.py:736: UserWarning: 'verbose' argument is deprecated and will be removed in a future release of LightGBM. Pass 'log_evaluation()' callback via 'callbacks' argument instead.
  _log_warning("'verbose' argument is deprecated and will be removed in a future release of LightGBM. "

 

'개인활동 > 파이썬 머신러닝 완벽가이드' 카테고리의 다른 글

Regression Evaluation  (0) 2023.08.03
Classification Evaluation  (0) 2023.08.02