[머신러닝 완벽 가이드] 4장_분류 - GBM

이경민·2023년 1월 8일
0

📌 GBM (Gradient Boosting Machine)

✅ 개요

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

(1) AdaBoost

  • 개별 약한 학습기에 각각 가중치를 부여한 후, 모두 결합해 예측을 수행한다.

(2) GBM

  • 에이다부스트와 유사하나, 가중치 업데이트를 경사 하강법을 이용하는 것이 큰 차이

📝 경사 하강법(Gradient Descent)
오류식을 최소화하는 방향성을 가지고 반복적으로 가중치 값을 업데이트한다.
즉, 반복 수행을 통해 오류를 최소화할 수 있도록 가중치의 업데이트 값을 도출하는 기법

오류식:
h(x)=yF(x)h(x) = y - F(x)

y:y: 실제 결괏값
x1,x2,,xn:x_1, x_2, ···, x_n: 피처
F(x):F(x): 피처에 기반한 예측 함수

✅ 실습

  • GradientBoostingClassifier: GBM 기반의 분류를 지원

    • n_estimators: weak learner의 개수 (default=100)

    • subsample: weak learner가 학습에 사용하는 데이터의 샘플링 비율

    • max_depth: 트리의 최대 깊이, 과적합 제어

    • loss: 경사하강법에서 사용할 비용 함수를 지정

    • learning_rate: GBM이 학습을 진행할 때마다 적용하는 학습률

      • Weak learner가 순차적으로 오류 값을 보정해 나가는 데 적용하는 계수
      • 0~1 사이의 값을 지정할 수 있으며, 기본값은 0.1
      • 너무 작은 값을 적용하면 업데이트되는 값이 작아져서 최소 오류 값을 찾아 예측 성능이 높아질 가능성은 있으나 수행 시간이 오래 걸리고, 최소 오류 값을 찾지 못할 수도 있다.
      • 너무 큰 값을 적용하면 최소 오류 값을 찾지 못하고 그냥 지나쳐 버려 예측 성능이 떨어질 가능성이 높아지지만, 빠른 수행이 가능하다.
# 기본 모델
from sklearn.ensemble import GradientBoostingClassifier
import warnings
warnings.filterwarnings('ignore')

X_train, X_test, y_train, y_test = get_human_dataset()

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))
  • 일반적으로 GBM이 랜덤 포레스트보다 예측 성능이 조금 뛰어난 경우가 많다.
  • 하지만 약한 학습기의 순차적인 예측 오류 보정을 통해 학습을 수행하므로 멀티 CPU 코어 시스템을 사용하더라도 병렬 처리가 지원되지 않아서 대용량 데이터의 경우 학습에 많은 시간이 필요하다는 단점이 있다.
# 최종 모델
from sklearn.model_selection import GridSearchCV

params = {'n_estimators':[100, 500],
          'learning_rate' : [0.05, 0.1]}

grid_cv = GridSearchCV(gb_clf, param_grid=params, cv=2, verbose=1)
grid_cv.fit(X_train , y_train)

print('최적 하이퍼 파라미터:\n', grid_cv.best_params_)
print('최고 예측 정확도: {0:.4f}'.format(grid_cv.best_score_))

# GridSearchCV를 이용하여 최적으로 학습된 estimator로 predict 수행
gb_pred = grid_cv.best_estimator_.predict(X_test)
gb_accuracy = accuracy_score(y_test, gb_pred)
print('GBM 정확도: {0:.4f}'.format(gb_accuracy))

[참고]
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html

profile
열정 가득한 공간

0개의 댓글