[파머완] ch4.5 GBM

­반소희·2022년 7월 1일

이전 글에서 보팅, 배깅 알고리즘에 대해 다루었다면, 이번 글에서는 부스팅 알고리즘을 정리한다. 앙상블 방법의 부스팅 알고리즘의 대표적인 예가 바로 GBM이다!

ch4.5 부스팅 알고리즘

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

  • 부스팅 알고리즘의 대표적인 예

    • AdaBoost (Adaptive boosting)

      오류 데이터에 가중치를 부여하며 부스팅을 수행하는 대표적인 알고리즘이다.

      1) (k-1) 번째 약한 학습기가 분류 기준에 따라 분류
      2) 오류 데이터에 대해 가중치를 부여
      3) (k) 번째 약한 학습기는 가중치가 부여된 데이터를 분류 기준에 따라 분류
      4) 이 과정을 반복하고, 최종적으로 얻어진 (n) 개의 분류 기준들을 모두 결합하여 최종 예측 반환 (단, 개별 약한 학습기는 각각 가중치 (예 - 학습기 1은 0.3, 학습기 2는 0.5, 학습기 3은 0.8) 를 부여하여 결합)

    • GBM (Gradient Boosting Machine, 그래디언트 부스팅)

      GBM은 AdaBoost와 유사하지만, 가중치 업데이트를 '경사 하강법' (Gradient Descent) 을 이용하는 것이 큰 차이이다.

ch4.5 GBM

GBM은 부스팅 알고리즘의 대표적인 예로, 여러 개의 약한 학습기를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 경사 하강법을 이용하여 가중치 업데이트를 하는 알고리즘을 말하며, 이때 경사 하강법은 오류 값인 y - y^ 을 최소화하는 방향성을 가지고 반복적으로 가중치 값을 업데이트 하는 것을 의미한다.

사이킷런은 GBM 분류를 위해 GradientBoostingClassifer 클래스를 제공한다.

  • 데이터 로드
from sklearn.ensemble import GradientBoostingClassifier
import time
import warnings
import pandas as pd
def get_human_dataset( ):
    
    feature_name_df = pd.read_csv('/content/drive/MyDrive/파이썬 머신러닝 완벽 가이드/data/human_activity/features.txt', sep='\s+', header=None, names=['column_index', 'column_name']) ## features.txt 로드
    new_feature_name_df = get_new_feature_name_df(feature_name_df) ## 중복 feature명 처리 (+ _n 형태)
    feature_name = new_feature_name_df.iloc[:, 1].values.tolist()  ## feature name list 생성
    
    ## X data
    X_train = pd.read_csv('/content/drive/MyDrive/파이썬 머신러닝 완벽 가이드/data/human_activity/train/X_train.txt', sep='\s+', names=feature_name)
    X_test = pd.read_csv('/content/drive/MyDrive/파이썬 머신러닝 완벽 가이드/data/human_activity/test/X_test.txt', sep='\s+', names=feature_name)
    
    ## y data
    y_train = pd.read_csv('/content/drive/MyDrive/파이썬 머신러닝 완벽 가이드/data/human_activity/train/y_train.txt', sep='\s+', header=None, names=['action'])
    y_test = pd.read_csv('/content/drive/MyDrive/파이썬 머신러닝 완벽 가이드/data/human_activity/test/y_test.txt', sep='\s+', header=None, names=['action'])
    
    return X_train, X_test, y_train, y_test

## 데이터 로드
X_train, X_test, y_train, y_test = get_human_dataset()
  • GBM 모델 학습 및 검증
## GBM 수행 시간 측정을 위해 시작 시간 설정
start_time = time.time()

## GBM 
gbm_clf = GradientBoostingClassifier(random_state=0)
gbm_clf.fit(X_train, y_train)

## 테스트 데이터셋에 대한 에측 수행
gbm_pred = gbm_clf.predict(X_test)

## 정확도 확인
from sklearn.metrics import accuracy_score
gbm_acc = accuracy_score(y_test, gbm_pred)

## 수행시간 확인
gbm_time = time.time() - start_time

print('acc:', gbm_acc)
print('time:', gbm_time)
  • GBM 특징
    • 일반적으로 랜덤 포레스트에 비해 예측 성능이 뛰어남
    • 수행 (학습) 시간이 상대적으로 많이 필요함
    • 학습 시간이 오래 걸리는 단점이 있지만 과적합에도 강하며 예측 성능이 뛰어나다는 장점이 존재함
    • GBM 등장 이후 GBM을 기반으로 하는 새로운 알고리즘이 소개되었고, 그래디언트 부스팅 기반 알고리즘의 대표적인 예로는 XGBoost, LightGBM이 있음

ch4.5 GBM 하이퍼 파라미터

  • loss

    • 경사 하강법에서 최적화 할 손실 함수를 지정하는 하이퍼 파라미터
    • 기본값은 deviance
  • learing_rate

    • 학습을 진행할 때마다 적용하는 학습률
    • 기본값은 0.1
  • n_estimators

    • 약한 학습기의 개수
    • 기본값은 100
  • subsample

    • 약한 학습기가 학습에 사용하는 데이터의 샘플링 비율
    • 기본값은 1
    • 과적합을 방지하기 위해서는 1보다 작은 값으로 설정 필요
  • 그 외에도 max_depth, max_features 등의 파라미터가 있음

요약

앙상블 방법의 부스팅 알고리즘 중 GBM이 있다. GBM은 경사 하강법을 이용하여 가중치를 업데이트한다. 사이킷런 GradientBoostingClassifer로 구현이 가능하다. 수행 시간이 오래 걸리지만, 높은 예측 성능과 과적합 방지에 대한 기대를 할 수 있다. 이를 기반으로 하는 대표적인 알고리즘으로는 XGBoost, LightGBM가 있다. 다음 글에서 이어서 정리한다.

profile
행복한 소히의 이것저것

0개의 댓글