앙상블
| 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'
- 모델이 학습되는 동안 성능을 평가할 때 사용할 지표
mlogloss는 Multi-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) # ✅ 작동함