함께하는 데이터 분석

[ML] Gradient Boosting Machine 본문

데이터분석 공부/ML | DL

[ML] Gradient Boosting Machine

JEONGHEON 2023. 1. 15. 22:26

Gradient Boosting Machine

Gradient Boosting Machine, GBM은 이름에서도 알다시피 Boosting 알고리즘입니다

 

앙상블과 부스팅에 관한 설명은 이전 포스팅을 참고해 주세요

2022.08.19 - [데이터분석 공부/ML | DL] - [Ensemble] 머신러닝 앙상블 기법

 

[Ensemble] 머신러닝 앙상블 기법

오늘은 머신러닝에서 자주 등장하는 앙상블 기법에 대해 알아볼게요! 우선 앙상블(Ensemble)이란 여러 개의 분류기를 생성하여 예측값을 종합하여 보다 정확한 예측값을 구하고 각각의 분류기를

tnqkrdmssjan.tistory.com

 

GBM을 알기 위해서는 AdaBoost에 대해서도 알아야 하는데

 

AdaBoost는 오류 데이터에 가중치를 부여하면서 부스팅을 수행하는 알고리즘입니다

 

<AdaBoost>

제일 왼쪽의 그림에 원과 세모로 된 feature 데이터셋이 있습니다

 

첫 번째 약한 학습기가 분류기준1으로 원과 세모를 분류하고 보라색으로 표시된 원 데이터는 잘못 분류된 오류 데이터입니다

 

이후 오류데이터에 가중치를 부여하고, 더 잘 분류할 수 있게 데이터의 크기가 커진 것을 확인할 수 있습니다

 

두 번째 약한 학습기가 분류기준2로 원과 세모를 분류합니다

 

또 잘못 분류된 빨간색으로 표시된 세모에 가중치를 부여하고 데이터의 크기가 커집니다

 

이렇게 총 약한 학습기 3개를 모두 결합한 결과 아래의 그림으로 최종 예측합니다

 

결합된 학습기가 개별 약한 학습기보다 훨씬 정확하게 분류하는 것을 볼 수 있습니다

 

GBM은 AdaBoost와 유사하지만 경사하강법(Gradient Descent)을 이용하여 가중치를 업데이트한다는 점이 차이입니다

 

GBM은 residual fitting으로 bias를 줄일 수 있지만 과적합의 우려가 있습니다

 

추가적으로 tree기반 알고리즘이지만 다른 tree기반 알고리즘과 달리 구조가 수직적으로 확장한다는 특징이 있습니다

 

 

 

 

경사하강법(Gradient Descent)

<Gradient Descent>

경사하강법은 경사를 줄여나가면서 오류를 최소화하는 방법을 말합니다

 

실제값과 모델의 예측값의 차이에 따른 오류를 잔차(Residual)라고 하는데 이러한 잔차의 제곱합인 RSS(Residual Sum of Square)를 비용함수라고 합니다

 

경사하강법은 이러한 비용함숫값을 지속적으로 감소시켜 최종적으로 더 이상 감소하지 않는 최소의 값을 구하는 방향으로 학습이 진행됩니다

 

비용함수에 미분을 한 뒤, 이 미분값이 계속 감소하는 방향으로 x값을 찾아가다가 미분값이 더 이상 감소하지 않는 지점을 찾습니다

 

경사가 0, 즉 비용함수의 미분계수가 0이 되는 지점 x를 찾아가는 것이 경사하강법의 원리입니다

 

 

 

GBM 실습

import numpy as np
import pandas as pd
import sklearn

import warnings
warnings.filterwarnings('ignore')
from sklearn.datasets import load_iris
iris = load_iris()

X = iris['data']
y = iris['target']
# train test셋 분리
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.2, random_state=5555)
from sklearn.ensemble import GradientBoostingClassifier

model = GradientBoostingClassifier(random_state=5555)

model.fit(X_train, y_train)
pred = model.predict(X_test)
# 교차검증
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

print('-------------- Gradient Boosting Machine --------------')
print('GBM Accuracy : ', round(accuracy_score(y_test, pred) * 100, 2))

kfold = KFold(n_splits=5, random_state=5555, shuffle=True)
cross_result = cross_val_score(model, X_train, y_train, cv=kfold, scoring='accuracy')

print('GBM Cross Validation Accuracy : ', round(cross_result.mean() * 100, 2))

>>> -------------- Gradient Boosting Machine --------------
    GBM Accuracy :  90.0
    GBM Cross Validation Accuracy :  97.5
# 하이퍼파라미터 튜닝
from sklearn.model_selection import GridSearchCV

parm_grid = {'n_estimators' : [100, 200],
            'max_depth' : [1, 2, 3]}

model_GBM = GridSearchCV(model, param_grid=parm_grid, cv=5, scoring='accuracy')
model_GBM.fit(X_train, y_train)

print('GBM Hyperparameter Tuning Accuracy : ', round(model_GBM.best_score_ * 100, 2))
print('GBM Hyperparameter Tuning Parameter : ', model_GBM.best_params_)

>>> GBM Hyperparameter Tuning Accuracy :  98.33
    GBM Hyperparameter Tuning Parameter :  {'max_depth': 1, 'n_estimators': 100}

'데이터분석 공부 > ML | DL' 카테고리의 다른 글

[ML] LightGBM  (0) 2023.01.20
[ML] 분류 모델 성능 평가 지표  (0) 2023.01.17
[ML] 교차검증과 하이퍼파라미터 튜닝  (2) 2023.01.14
[Pytorch] 순환 신경망 모델 학습  (2) 2022.09.20
[RNN] 순환 신경망  (2) 2022.09.20