앙상블

topics 100-데이터분석 & AI 101 머신러닝 105 기법(방법론)
types 이론 실습
tags

앙상블 (Ensemble)

앙상블이란?

**앙상블(Ensemble)**은 여러 개의 약한 모델을 결합해서 강력한 예측 모델을 만드는 기법이다. "여러 사람의 의견을 종합하면 더 정확하다"는 아이디어를 머신러닝에 적용한 것이다.

왜 필요한가?

하나의 모델은 한계가 있다

  • 단일 모델은 특정 패턴에만 강하고, 다른 패턴에는 약할 수 있다
  • 과적합(Overfitting)이 쉽게 발생한다
  • 노이즈에 민감하다

앙상블로 해결

  • 여러 모델의 강점을 결합해서 약점을 보완한다
  • 예측이 안정적이고 일반화 성능이 높다
  • 과적합을 줄인다

핵심 아이디어: 약한 모델 하나보다, 여러 약한 모델을 합친 게 더 강하다.


주요 앙상블 기법

배깅 (Bagging)

Bootstrap Aggregating의 줄임말이다. 데이터를 여러 번 샘플링해서 각각 모델을 학습시킨 뒤, 결과를 평균내거나 투표로 결정한다.

대표 알고리즘: Random Forest

  • 여러 개의 결정트리를 만들어서 결합
  • 각 트리는 랜덤하게 선택된 데이터와 특성으로 학습
  • 예측 시 모든 트리의 결과를 다수결로 결정

장점

  • 과적합 방지
  • 병렬 학습 가능 (빠름)

단점

  • 해석이 어렵다 (블랙박스)

부스팅 (Boosting)

이전 모델의 오차를 다음 모델이 보완하면서 순차적으로 학습하는 방식이다. Feedback 느낌이다.

대표 알고리즘: XGBoost, LightGBM

  • 틀린 부분에 집중해서 학습
  • 성능이 점점 좋아진다
  • 순차적 학습 (배깅보다 느림)

장점

  • 예측 성능이 매우 높다
  • 대회에서 자주 우승

단점

  • 과적합 위험 (하이퍼파라미터 튜닝 필수)
  • 학습 시간이 오래 걸린다

XGBoost

XGBoost(eXtreme Gradient Boosting)는 여러 개의 약한 결정트리(Decision Tree)를 순차적으로 학습시켜 강력한 예측 모델을 만드는 부스팅 앙상블 기법이다.

특징

  • Gradient Boosting 방식 사용: 이전 트리의 오차를 다음 트리가 보완하면서 성능을 점점 높인다
  • 빠른 속도: 병렬 처리 지원
  • 높은 성능: Kaggle 대회 단골 우승 알고리즘
  • 과적합 방지: 정규화 기능 내장
  • 결측값 자동 처리: 전처리 필요 없음

주요 파라미터

n_estimators

  • 사용할 트리(약한 학습기)의 개수
  • 값이 클수록 성능 ↑, 과적합 위험 ↑
  • 기본값: 100

use_label_encoder=False

  • 예전에는 y값을 자동으로 라벨 인코딩했지만, 비효율적이어서 비추천
  • 경고 메시지 없이 깔끔하게 쓰려면 이 옵션을 False로 설정
  • y값이 이미 숫자라면 아무 영향 없다

eval_metric='mlogloss'

  • 모델이 학습되는 동안 성능을 평가할 때 사용할 지표
  • mloglossMulti-class Log Loss (다중 클래스 로그 손실)
  • 예측 확률과 실제 정답이 얼마나 비슷한지 측정 (작을수록 좋음)
  • 주로 다중 클래스 분류 문제에서 사용

사용 예시

from xgboost import XGBClassifier

model = XGBClassifier(
    n_estimators=100,           # 트리 100개
    use_label_encoder=False,    # 경고 방지
    eval_metric='mlogloss'      # 평가 지표
)
model.fit(X_train, y_train)

주의: n_estimators=3 같은 매우 작은 값은 테스트용이다. 실제로는 100 이상 사용한다.


LightGBM

LightGBM(Light Gradient Boosting Machine)은 트리 기반의 Gradient Boosting 프레임워크다.

특징

  • 빠른 훈련 속도: XGBoost보다 훨씬 빠르다
  • 적은 메모리 사용: 대용량 데이터에 효율적
  • Leaf-wise 트리 성장: 균형 잡힌 트리보다 더 정확한 모델을 빠르게 학습
  • 범주형 변수 자동 처리: 원-핫 인코딩 필요 없음
  • 결측값 자동 처리: 전처리 불필요

주요 파라미터

파라미터 설명
n_estimators 생성할 트리 개수 (기본값: 100). 작으면 빠르지만 과소적합 위험 ↑
random_state 결과 재현을 위한 난수 시드 (42는 관례적으로 사용)
objective 학습 목적. multiclass(다중 분류), binary(이진 분류), regression
verbosity 출력 정보 조절. -1은 모든 출력 생략
num_leaves 하나의 트리가 가질 수 있는 최대 잎 노드 수 (기본값: 31)
learning_rate 학습률 (기본값: 0.1). 작을수록 정확도 ↑, 학습 시간 ↑

사용 예시

from lightgbm import LGBMClassifier

model = LGBMClassifier(
    n_estimators=100,
    random_state=42,
    objective='multiclass',
    verbosity=-1
)
model.fit(X_train, y_train)

범주형 변수 처리

# <span id="범주형-변수-지정"></span>범주형 변수 지정
model = LGBMClassifier(n_estimators=100)
model.fit(
    X_train,
    y_train,
    categorical_feature=['gender', 'city']  # 범주형 변수 명시
)

왜 이렇게 했냐면: LightGBM은 범주형 변수를 자동으로 최적 처리한다. 원-핫 인코딩보다 효율적이다.


XGBoost vs LightGBM

비교 항목 XGBoost LightGBM
속도 빠름 매우 빠름
메모리 보통 적음
정확도 매우 높음 매우 높음 (비슷)
범주형 변수 수동 인코딩 필요 자동 처리
트리 성장 Level-wise (균형) Leaf-wise (정확도 우선)
사용 경우 중소규모 데이터 대용량 데이터

언제 뭘 쓸까?

XGBoost

  • 데이터 크기가 작거나 중간 정도
  • 안정성과 성능의 균형이 중요
  • Kaggle 대회 (전통적으로 많이 씀)

LightGBM

  • 데이터 크기가 매우 큼
  • 학습 속도가 중요
  • 범주형 변수가 많음

개인적 경험: 둘 다 해보고 성능 비교하는 게 제일 좋다. 데이터마다 다르다.


주의사항

1. n_estimators는 충분히 크게

# <span id="나쁜-예"></span>나쁜 예
model = XGBClassifier(n_estimators=3)  # ❌ 너무 작음

# <span id="좋은-예"></span>좋은 예
model = XGBClassifier(n_estimators=100)  # ✅

2. 과적합 주의

부스팅은 성능이 좋지만 과적합되기 쉽다. 하이퍼파라미터 튜닝 필수다.

# <span id="과적합-방지-옵션"></span>과적합 방지 옵션
model = XGBClassifier(
    n_estimators=100,
    max_depth=3,           # 트리 깊이 제한
    learning_rate=0.1,     # 학습률 낮춤
    subsample=0.8          # 데이터 샘플링 비율
)

3. 범주형 변수 처리

LightGBM은 범주형 변수를 명시적으로 지정해야 자동 처리한다.

# <span id="범주형-변수가-있다면"></span>범주형 변수가 있다면
model.fit(X_train, y_train, categorical_feature=['col1', 'col2'])

4. 결측값은 알아서 처리됨

XGBoost와 LightGBM 모두 결측값을 자동으로 처리하므로 전처리 필요 없다.

# <span id="결측값-있어도-ok"></span>결측값 있어도 OK
X_train_with_nan = X_train  # NaN 포함
model.fit(X_train_with_nan, y_train)  # ✅ 작동함

관련 문서