TOP
class="layout-aside-left paging-number">
본문 바로가기
데이터분석 만능열쇠 [파이썬]/<파이썬 머신러닝>

[파이썬] 분류 > 앙상블 - 3 : GBM

by 기록자_Recordian 2024. 6. 30.
728x90
반응형
시작에 앞서
해당 내용은 '<파이썬 머신러닝 완벽 가이드> 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.

앙상블 학습(Ensemble Learning)
 

[파이썬] 분류: 앙상블 학습(Ensemble Learning) - 1

시작에 앞서해당 내용은 ' 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.앙상블 학습(Ensemble Learning) 

puppy-foot-it.tistory.com


부스팅 알고리즘

 

부스팅 알고리즘: 여러 개의 약한 학습기를 순차적으로 학습-예측 하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식.

 

[부스팅의 대표적인 구현]

- AdaBoost: 오류 데이터에 가중치를 부여하면서 부스팅을 수행하는 대표적인 알고리즘

- GBMl: AdaBoost와 유사하나, 가중치 업데이트를 경사 하강법(Gradient Descent)을 이용


에이다부스트(AdaBoost) 동작 원리
출처: 티스토리 블로그 '준비하는 대학생' (https://gsbang.tistory.com/)

 

AdaBoost는 아래와 같은 순서로 동작:

  1. 데이터셋의 각 샘플에 동일한 가중치가 부여다. 초기 가중치는 1/N으로 설정되며, N은 샘플의 개수.
  2. *약한 학습기가 훈련 데이터에 적합하도록 학습. 학습기는 간단한 의사결정나무와 같은 단순한 모델을 사용.
  3. 각 학습기는 가중치가 적용된 데이터셋에서 오류를 최소화하는 방향으로 학습.
  4. 학습기의 오류를 계산하고, 학습기에 가중치(alpha)를 부여. 여기서 alpha는 학습기의 정확도에 따라 결정.
  5. 샘플의 가중치를 업데이트. 잘못 분류된 샘플의 가중치는 증가시키고, 올바르게 분류된 샘플의 가중치는 감소.
  6. 여러 개의 학습기를 순차적으로 학습시키며 3-5단계를 반복.
  7. 최종적으로, 학습기들의 예측을 가중합하여 최종 예측을 생성.

* 약한 학습기를 사용하는 이유

  • 계산 효율성: 약한 학습기는 일반적으로 단순한 모델로 구성되며, 학습과 예측이 빠르다. 이로 인해 에이다 부스트는 여러 개의 약한 학습기를 조합하여 복잡한 문제를 해결할 수 있으면서도 계산상 효율적.
  • 과적합 방지: 복잡한 모델은 과적합(overfitting)되기 쉽다. 약한 학습기는 단순하기 때문에 과적합되기 어렵고, 이를 통해 에이다 부스트는 일반화 성능을 향상시킨다.
  • 가중치 조절에 의한 특징 학습: 에이다 부스트는 학습 과정에서 약한 학습기가 잘못 분류한 샘플에 더 높은 가중치를 부여한다. 이는 각 약한 학습기가 데이터셋의 다른 부분에 초점을 맞추도록 하여, 다양한 특징을 학습할 수 있게 한다.
  • 앙상블 학습의 강점 활용: 단일 복잡한 모델 대신 여러 개의 약한 학습기를 결합함으로써, 각 학습기의 장점을 취합하고 단점을 상쇄시킬 수 있다. 이를 통해 에이다 부스트는 더 높은 정확도와 안정성을 달성한다.
  • 특성 선택: 약한 학습기가 단순한 모델인 경우, 예를 들어 결정 트리의 경우, 데이터의 일부 특성에만 초점을 맞추게 된다. 이를 통해 에이다 부스트는 자연스럽게 특성 선택(feature selection)이 이루어지며, 더욱 효율적인 학습이 가능해진다.

GBM

 

◆ 가중치 업데이트를 경사 하강법(Gradient Descent)을 이용

※ 경사하강법: 반복 수행을 통해 오류를 최소화할 수 있도록 가중치의 업데이트 값을 도출하는 기법

 

GBM은 CART 기반의 다른 알고리즘과 마찬가지로 분류와 회귀가 가능하며, 사이킷런은 GBM 기반의 분류를 위해서 GradientBoostingClassifier 클래스를 제공한다.

  • step 1은 첫 번째 weak learner가 분류 기준 1+와 -를 분류한 것이며, 동그라미로 표시된 + 데이터는 +데이터가 잘못 분류된 오류 데이터
  • step 2에서는 이 오류 데이터에 대해 가중치 부여. 가중치가 부여된 오류 + 데이터는 다음 weak learner가 더 잘 분류할 수 있게 크기가 커짐
  • step 3은 두 번째 weak learner가 분류 기준 2로 +와 -를 분류. 동그라미로 표시된 - 데이터는 분류된 오류 데이터
  • step 4에서는 잘못 분류된 이 - 오류 데이터에 대해 다음 weak learner 가 잘 분류할 수 있게 더 큰 가중치를 부여(오류 - 데이터 크기 커짐)
  • setp 5는 세 번째 weak learner가 분류 기준 3으로 +와 -를 분류하고 오류 데이터를 찾음.
  • 마지막으로 맨 아래에는 첫 번째, 두 번째, 세 번째 약한 학습기(weak learner)를 모두 결합한 결과 예측. (개별 약한 학습기보다 정확도가 훨씬 높아짐)

[GBM을 이용한 사용자 행동 데이터 세트 예측 분류]

# # GBM (사용자 행동 인식 데이터 세트 활용)
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
# GBM
import time

X_train, X_test, y_train, y_test = get_human_dataset()

#GBM 수행 시간 측정을 위함. 시작 시간 설정
start_time = time.time()

gb_clf = GradientBoostingClassifier(random_state=0)
gb_clf.fit(X_train, y_train)
gb_pred = gb_clf.predict(X_test)
gb_accuracy = accuracy_score(y_test, gb_pred)

print('GBM 정확도: {0:.4f}'.format(gb_accuracy))
print("GBM 수행시간: {0:.4f} 초". format(time.time() - start_time))

▶ 기본 하이퍼 파라미터 만으로도 랜덤 포레스트(91.96%) 보다도 나은 예측 성능을 나타내지만, 수행 시간이 오래 걸린다.

 

사이킷런의 GradientBoostingClassifier 는 약한 학습기의 순차적인 예측 오류 보정을 통해 학습을 수행하므로 멀티 CPU 코어 시스템을 사용하더라도 병렬처리가 지원되지 않아서 대용량 데이터의 경우 학습에 매우 많은 시간이 필요하다.

(랜덤 포레스트는 예측 성능이 보다 낮으나, 상대적으로 빠른 수행 시간을 보장)


GBM 하이퍼 파라미터

 

n_estimators, max_depth, max_features 와 같은 트리 기반 자체의 파라미터는 하단 내용 참고

 

[파이썬] 분류 > 앙상블 - 2 : 랜덤 포레스트

시작에 앞서해당 내용은 ' 권철민 지음. 위키북스' 를 토대로 작성되었습니다. 보다 자세한 내용은 해당 서적에 상세히 나와있으니 서적을 참고해 주시기 바랍니다.앙상블 학습(Ensemble Learning) [

puppy-foot-it.tistory.com

 

  • loss: 경사 하강법에서 사용할 비용 함수 지정. (디폴트는 deviance)
  • learning_rate: GBM이 학습을 진행할 때마다 적용하는 학습률. Weak learner 가 순차적으로 오류 값을 보정해 나가는 데 적용하는 계수. (0~1 사이의 값. 기본값은 0.1)

▶ 너무 작은 값 입력 시: 업데이트 되는 값이 작아져 최소 오류 값을 찾아 예측 성능이 높아질 가능성이 높음. 많은 weak learner는 수행 시간이 오래 걸리고, 모든 weak learner의 반복이 완료돼도 최소 오류 값을 찾지 못할 수 있음.

▶ 너무 큰 값 적용 시: 최소 오류 값을 찾지 못하고 그냥 지나쳐 버려 예측 성능이 떨어질 가능성이 높으나, 수행시간이 짧음.

따라서, learning_rate는 n_estimators와 상호 보완적으로 조합해 사용. (수행 시간 오래 걸림)

  • n_estimators: weak learners의 개수. 개수가 많을수록 예측 성능 좋아지나, 수행 시간 오래 걸림. 기본값은 100
  • subsample: weak learner가 학습에 사용하는 데이터의 샘플링 비율. 기본값은 1이며, 이는 전체 학습 데이터를 기반으로 학습한다는 의미. (0.5일 경우 학습 데이터의 50%).

▶ 과적합이 염려될 경우, 1보다 작은 값으로 설정.


다음에는 GBM 기반 ML 패키지인 XGBoost와 LightGBM에 대해 알아본다.

728x90
반응형