⊢MachineLearning

앙상블 학습 - 그래디언트 부스팅 머신(Gradient Boosting Machine, GBM)

최 수빈 2025. 3. 18. 02:45

 

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

 

여러 개의 약한 학습기(weak learner)를 순차적으로 학습시키고, 그 예측 결과를 결합하여 강한 학습기(strong learner)를 만드는 앙상블 학습 기법 중 하나

 

이전 모델이 잘못 예측한 데이터 포인트에 가중치를 부여하여, 다음 모델이 이를 더 잘 학습하도록 함 (각 단계에서 잔여 오차를 줄이도록 설계되어 있음)

GBM은 과적합을 방지하면서도 높은 예측 성능을 제공하는 강력한 알고리즘

다양한 하이퍼파라미터 튜닝을 통해 성능 최적화 가능

 

GBM의 구조

  • 여러 개의 결정 트리(Desicion Tree)로 구성됨
  • 각 결정 트리는 이전 트리의 예측 오류를 보완하는 방식으로 학습
  • 최종 예측 값은 개별 트리의 예측을 가중합하여 계산

 

GBM의 학습 원리

  1. 초기 모델 학습: 첫 번째 결정 트리를 학습하여 초기 모델 생성
  2. 잔여 오차 계산: 초기 모델의 예측 결과와 실제 값의 차이를 계산하여 잔여 오차(residual error)를 구함
  3. 잔여 오차 학습: 잔여 오차를 예측하는 새로운 결정 트리 학습
  4. 모델 업데이트: 새로운 결정 트리를 기존 모델에 추가하여 모델 업데이트
  5. 반복 학습: 잔여 오차가 충분히 작아질 때까지 2 ~ 4 단계 반복

 

GBM 실습

유방암 데이터셋을 활용한 GBM 모델 구현

 

 

데이터 로드 및 전처리

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 유방암 데이터 로드
cancer_data = load_breast_cancer()
X, y = cancer_data.data, cancer_data.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 데이터 스케일링
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

 

 

모델 구현 및 평가

 

Scikit-learn의 GradientBoostingClassifier를 사용하여 GBM을 구현하고 평가

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import accuracy_score

# GBM 모델 생성
gbm_model = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)

# 모델 학습
gbm_model.fit(X_train_scaled, y_train)

# 예측
y_pred_gbm = gbm_model.predict(X_test_scaled)

# 평가
accuracy_gbm = accuracy_score(y_test, y_pred_gbm)
print(f'GBM 모델의 정확도: {accuracy_gbm:.4f}')

"""
GBM 모델의 정확도: 0.9561
"""

 

 

 

GBM 모델의 하이퍼파라미터 조정

 

GBM의 성능을 최적화하기 위해 주요 하이퍼파라미터를 조정

  • n_estimators: 부스팅 단계를 수행할 트리의 개수 (기본값: 100)
  • learning_rate: 각 트리가 오류를 수정하는 정도를 조절하는 학습률 (기본값: 0.1)
  • max_depth: 개별 결정 트리의 최대 깊이 (기본값: 3)
  • subsample: 각 트리 학습 시 사용할 샘플의 비율 (기본값: 1.0, 전체 데이터 사용)

GridSearchCV를 사용하여 최적의 하이퍼파라미터를 찾아봄

from sklearn.model_selection import GridSearchCV

param_grid = {
    'n_estimators': [100, 200],
    'learning_rate': [0.01, 0.1],
    'max_depth': [3, 5]
}

gbm_grid = GridSearchCV(GradientBoostingClassifier(random_state=42), param_grid, cv=5, scoring='accuracy')
gbm_grid.fit(X_train_scaled, y_train)

print(f'최적 하이퍼파라미터: {gbm_grid.best_params_}')
print(f'최고 검증 정확도: {gbm_grid.best_score_:.4f}')

"""
최적 하이퍼파라미터: {'learning_rate': 0.1, 'max_depth': 3, 'n_estimators': 200}
최고 검증 정확도: 0.9648
"""