AI/ML

[ML] Bagging 과 Boosting

hyunjoo 2025. 3. 27. 04:48

앞서 앙상블 학습의 대표적인 두 축인 Bagging과 Boosting의 개념과 차이를 살펴보았다. 이를 기반으로 실제로 널리 사용되는 모델들의 주요 특징과 차이점을 정리해보자

 

1. Bagging 계열 모델

모델 개념 특징
Random Forest 여러 개의 결정 트리를 만들고 평균 또는 다수결로 예측 - 부트스트랩 샘플링
- 피처 무작위 선택
- 트리 앙상블
ExtraTrees Random Forest와 유사하지만 분할 기준이 랜덤 - 무작위성 추가

 

1) Random Forest

항목 설명
기본 구조 결정트리 + 배깅 + 피처 랜덤 선택
작동 방식 부트스트랩 샘플링 + 다수결/평균
주요 하이퍼파라미터 n_estimators, max_depth, max_features, min_samples_split 등
장점 과적합에 강함, 변수 중요도 확인 가능, 병렬 처리
단점 해석 어려움, 트리 수 많으면 느릴 수 있음

 

▶ 각 트리가 서로 다른 피처를 사용해 학습되므로, 모델 간 다양성커지고, 예측 결과가 덜 유사해진다.

다양한 예측을 평균 내면, 특정 데이터에 과하게 반응하는 현상(분산)이 줄어든다.

예를 들어, 사람의 운동 능력을 예측하기 위해 ‘키’, ‘몸무게’, ‘나이’라는 3개의 피처를 사용한다고 가정해보자.

일반적인 결정 트리에서는 각 노드에서 가장 정보를 많이 주는 피처(예: 키, 클래스 구분이 가장 명확해지는 피처, 정보 이득이나 지니 계수 등 수치 기준을 통해 자동 선택됨 )를 반복적으로 선택하게 되며 대부분의 트리가 유사한 구조를 갖게 된다. 이처럼 모든 트리가 비슷한 기준으로 학습되면 결과적으로 모델 간 예측 결과의 차이가 작아지고, 데이터의 작은 변화에 전체 모델이 함께 민감하게 반응할 가능성, 즉 분산이 커질 수 있다.

반면, Random Forest에서는 각 트리를 만들 때 무작위로 일부 피처만 선택하여 노드 분할에 사용한다.
예를 들어, 어떤 트리는 ‘몸무게’와 ‘나이’를 기반으로, 다른 트리는 ‘키’와 ‘나이’를 기반으로 학습할 수 있다.
이처럼 각 트리가 서로 다른 피처 조합에 기반해 학습되면 트리 간 예측 방식에 다양성이 생기고, 이러한 다양한 예측들을 평균내면 과도한 민감함이 상쇄되어 분산이 줄어들게 된다.

 

 

 Out-of-Bag Error(OOB score)로 검증하는 방법

Out-of-Bag Error(OOB Error)는 Random Forest에서 별도의 검증 데이터 없이도 모델의 성능을 추정할 수 있는 방법이다.

Random Forest는 학습 시 각 트리를 만들기 위해 부트스트랩 샘플링을 사용하여 전체 데이터에서 중복을 허용하며 일부 샘플만 선택하여 각 트리를 학습된다.

 

이 과정에서:

  • 어떤 트리에서는 포함되지 않은 샘플이 존재하게 되고 이 샘플들을 Out-of-Bag 데이터(OOB 데이터)라고 부른다.
  • 각 샘플은 여러 트리의 OOB로 존재하게 되며,이 샘플들은 자신이 속하지 않은 트리들로부터 예측을 받을 수 있다.

→ OOB 데이터에 대한 평균 예측 결과를 사용해 성능을 추정하며, 이를 전체 평균 내면 OOB Error 또는 OOB Score

 

 

 

 변수 중요도 해석 시 주의점 (ex. 카디널리티 높은 변수에 편향)

변수 중요도 (Feature Importance):  피처가 모델의 예측 성능에 얼마나 기여했는지를 수치로 나타낸 것
→ 트리 기반 모델에서는 보통 분할 기준에서 얼마나 자주, 얼마나 잘 썼는지를 기반으로 계산

 

카디널리티(Cardinality): 피처가 가질 수 있는 고유 값의 개수
→ 예: 성별 → 2개 (낮은 카디널리티),  우편번호, ID, 이름 등 → 수천~수만 개 (높은 카디널리티)

 

변수 중요도는 왜 문제가 될 수 있을까?

트리 기반 모델에서는 값의 종류가 다양한 피처일수록 노드 분할을 위한 후보로 더 자주 선택되고 우연히 좋은 분할을 만들 가능성도 높아진다. 이로 인해, 실제로는 예측에 큰 영향을 주지 않더라도, 카디널리티(고유값 개수)가 높은 피처가 중요 피처로 과대평가되는 경향이 발생할 수 있다.

예를 들어, '이름'이나 'ID'와 같은 식별자 컬럼은 실제 예측 성능에 기여하지 않음에도 불구하고, 트리가 이를 기준으로 거의 완벽하게 데이터를 분리할 수 있기 때문에 중요도가 높게 계산되는 경우가 많다. 이처럼, 실질적인 인사이트가 없는 피처가 중요 변수로 오해되면,
모델 해석이나 의사결정에 오류를 일으킬 수 있으므로 주의가 필요하다. 이름이나 아이디 피쳐같은 경우, 당연히 처음에 제외하고 학습시키는 게 일반적이지만 이처럼 고유값이 많은 피쳐들 중 중요도가 떨어지는 피쳐는 제외하고 학습하는 것이 중요할 것 같다.

 


2) ExtraTrees (Extremely Randomized Trees)

항목 설명
구조 Random Forest와 유사하지만, 분할 기준도 랜덤
특징 더 빠르고 랜덤성이 큼
차이점 트리 간 다양성 더 큼, 학습 속도 빠름

 

 분할 기준도 무작위 → 정확도는 낮을 수도 있지만 과적합 방지에 효과적

 

Random Forest와 유사하게 여러 개의 결정 트리를 앙상블하는 모델이지만 한 가지 중요한 차이는 분할 기준까지 무작위로 선택한다는 점이다. 일반적인 결정 트리는 각 노드에서 선택된 피처에 대해 여러 임계값을 시도한 후, 정보 이득이나 지니 계수 등을 기준으로 가장 최적인 분할 임계값을 선택합니다.

하지만 ExtraTrees는 이러한 최적화 과정을 거치지 않고 임의의 임계값을 무작위로 선택하여 데이터를 분리한다. 이처럼 분할 기준까지 무작위화함으로써 각 트리 간의 다양성이 높아지고 모델이 훈련 데이터에 과도하게 적합되는 것을 방지한다.

 


2. Boosting 계열 모델

모델 개념 특징
AdaBoost 틀린 샘플에 가중치 ↑ 하며 반복 학습 - 약한 학습기 반복
- 오류 보완에 집중
Gradient Boosting (GBM) 이전 오차(잔차)를 예측하는 방식으로 학습 - 손실 함수 미분값 기반 학습
XGBoost GBM 개선형: 속도 + 정규화 추가 - L1/L2 정규화
- 병렬 처리 가능
- 가지치기
LightGBM 대용량 데이터 최적화 부스팅 - 히스토그램 기반 학습
- 빠르고 메모리 효율적
CatBoost 범주형 데이터에 최적화된 부스팅 - 자동 인코딩
- 튜닝 쉬움
- 과적합 방지 기능 내장

 

1) AdaBoost

항목 설명
기본 원리 틀린 샘플의 가중치 ↑, 약한 모델 순차 학습
기본 학습기 DecisionTree(max_depth=1) (stump)
최종 예측 여러 모델의 예측을 가중합
튜닝  - n_estimators: 사용할 약한 학습기의 개수 (반복 횟수)
- learning_rate: 각 약한 학습기의 가중치 축소 비율 (작을수록 느리게 학습, 과적합 방지)
- base_estimator: 사용할 기본 약한 학습기 (기본값은 깊이 1의 결정트리)
- algorithm: 가중치 업데이트 방식 (SAMME, SAMME.R, 기본은 SAMME.R)
장점 단순 구조, 과소적합 보완
단점 노이즈 민감, 이상치 영향 큼

 

 가중치 갱신 방식과 직관적 의미

AdaBoost는 학습 데이터의 각 샘플에 가중치를 부여하여 모델을 학습하는 알고리즘이다. 초기에는 모든 샘플에 동일한 가중치가 주어지지만, 학습이 진행되면서 예측을 틀린 샘플의 가중치를 점점 높이는 방식으로 동작한다.

첫 번째 약한 모델이 학습 후, 해당 모델이 틀린 샘플에는 더 큰 가중치를 부여하고 맞춘 샘플은 가중치를 줄이는 방식으로 데이터의 중요도를 동적으로 조절한다. 다음에 학습되는 모델은 오류가 발생했던 샘플에 더 집중하여 학습하게 되며 이 과정을 반복하면서 모델은 점차 이전 모델의 실수를 보완하는 방향으로 학습하게 된다. 비유하자면, 마치 학생이 틀린 문제를 복습하며 점점 실력을 늘려가는 과정과 비슷하다. 처음에는 전체 문제를 고르게 풀지만, 틀렸던 문제를 반복해서 다시 풀며 실수를 줄여 나가는 것처럼 AdaBoost도 틀린 데이터에 더 많은 비중을 두어 모델의 예측력을 향상시킨다.

 


2. Gradient Boosting (GBM)

항목 설명
기본 원리 잔차(residual)를 예측하는 방식
예측 방식 이전 모델의 오차를 보완하며 추가 학습
손실 함수 MSE, CrossEntropy 등 선택 가능
튜닝  - n_estimators: 생성할 트리의 개수 (반복 학습 횟수)
- learning_rate: 각 트리의 기여도 조절 (작을수록 안정적, 느리게 수렴)
- max_depth: 개별 트리의 최대 깊이 (모델 복잡도 조절)
- min_samples_split: 노드를 분할하기 위한 최소 샘플 수
- min_samples_leaf: 리프 노드에 필요한 최소 샘플 수
- subsample: 전체 데이터 중 트리 학습에 사용할 샘플 비율
- max_features: 분할에 사용할 피처 수 또는 비율
- loss: 사용할 손실 함수 (회귀: ‘squared_error’, 분류: ‘log_loss’ 등)

 

 왜 오차(잔차)를 예측하는가? → 경사하강법 관점

Gradient Boosting은 이름 그대로 경사하강법(Gradient Descent)의 원리를 기반으로 동작하는 Boosting 기법이다.
기본 아이디어는 “모델의 예측값이 실제값에 가까워지도록, 손실(loss)을 줄이는 방향으로 조금씩 보정해 나가자” 이다.

이를 위해 GBM은 각 반복(iteration)마다 이전 모델이 만든 예측 오차(잔차)를 계산하고, 이 잔차를 예측하는 새로운 모델을 학습한다.

다음 모델은 “무엇을 얼마나 잘못 예측했는가?”를 바탕으로 그 오차를 줄이는 방향으로 보완 학습을 하는 것이다. 이 과정을 경사하강법 관점에서 보면, 전체 손실 함수를 최소화하기 위해 현재 위치에서 손실 함수의 기울기(gradient)를 계산하고 그 기울기를 따라 이동하면서 점점 손실을 줄여가는 방식과 같다. 결국, 잔차를 예측하는 것 = 손실 함수의 기울기를 따르는 것이며 이러한 방식으로 GBM은 반복적으로 예측 오류를 줄여가며 모델을 개선한다.

 

 

 Overfitting을 방지하려면 learning_rate를 어떻게 조정해야 할까?

learning_rate는 Gradient Boosting 계열 모델에서 각 반복 단계마다 학습된 보정값(잔차 예측 결과)을 최종 예측에 얼마나 반영할지를 조절하는 계수이다. 모델은 반복적으로 이전까지의 예측값에 새로운 보정값을 더하면서 성능을 개선한다. 이때 learning_rate가 크면 보정값이 예측값에 강하게 반영되어 예측이 크게 변경된다. 반대로 learning_rate가 작으면 보정값의 영향력이 줄어들어 예측이 조금씩만 조정된다. 이는 경사하강법에서 학습률(step size)이 손실 함수의 기울기를 따라 얼마만큼 이동할지를 결정하는 원리와 같다.
learning_rate가 크면 빠르게 수렴할 수 있지만 그만큼 과도하게 학습해 과적합이 발생할 가능성이 높다. 반면 너무 작으면 학습이 느려지고 충분한 반복 없이 수렴하지 못할 수 있다. 따라서 일반적으로 learning_rate는 작게 설정하고(0.01~0.1) , n_estimators를 늘려 충분한 반복 학습을 통해 모델이 점진적으로 오차를 보완하도록 한다.

 

Gradient Boosting에서는 예측 모델을 다음과 같이 반복적으로 갱신

  • F_t(x): t번째 반복에서의 최종 예측값
  • F_{t-1}(x): 이전까지의 예측값
  • h_t(x): 잔차 또는 그래디언트를 학습한 새 모델
  • η (learning_rate): 보정값의 반영 비율

learning_rate는 h_t(x)의 영향을 얼마나 반영할지를 결정

  • η↑: 예측값이 크게 조정됨 → 빠르게 수렴하지만 과적합 위험
  • η↓: 예측값이 조금만 조정됨 → 느리지만 안정적인 학습

학습률이 너무 크면 모델이 손실 함수의 최솟값을 지나쳐 과적합되거나 발산할 수 있고 너무 작으면 충분히 학습되지 않아 성능이 제한될 수 있다.


3) XGBoost

항목 설명
GBM 개선 모델 정규화 포함, 가지치기 최적화
주요 특징 L1/L2 규제, 병렬 처리, early stopping
튜닝  - subsample: 트리 학습 시 사용할 샘플의 비율 (과적합 방지)
- colsample_bytree: 트리마다 사용할 피처의 비율 (피처 다양성 확보)
- gamma: 노드 분할 최소 손실 감소 기준 (작으면 분할 억제)
- reg_alpha: L1 정규화 계수 (불필요한 리프 가중치를 0으로 만들어 단순화)
- reg_lambda: L2 정규화 계수 (가중치 크기를 제한해 과적합 방지)
장점 빠르고 강력한 성능, 정규화로 과적합 방지

 

 Pruning 방식 (pre-pruning vs post-pruning)

일반적인 결정트리 알고리즘은 트리를 성장시킨 뒤에 불필요한 가지를 제거하는 방식(post-pruning)을 사용하는 경우가 많다.
하지만 XGBoost는 이와는 달리 사전 가지치기(pre-pruning) 방식을 적용한다.

Post-pruning은 트리를 완전히 성장시킨 후, 성능에 기여하지 않거나 오히려 손실을 증가시키는 노드를 나중에 제거하여 과적합을 방지하는 방식으로 예측 성능을 기반으로 트리 구조를 사후 최적화하는 방식이다.

반면, XGBoost는 트리를 성장시키는 과정에서 각 노드의 분할이 유의미한지 판단하여, 분할 기준이 충분하지 않으면 해당 노드를 더 이상 분할하지 않고 멈추는 사전 가지치기(pre-pruning)를 적용한다.

XGBoost에서는 이를 위해 분할의 이득(Gain)을 계산하고 이득이 설정된 임계값(기본값 gamma)보다 작으면 분할을 하지 않고 가지치기를 수행한다.

 

 regularization이 왜 중요한지 (과적합 방지 관점)

XGBoost는 모델 손실 함수에 정규화 항을 추가하여 트리의 복잡도와 가중치 크기에 패널티를 부여합니다. 이를 통해 모델이 복잡해지는 것을 막고 과적합을 방지하며 일반화 성능을 높인다.

 

 

XGBoost는 gamma, lambda, alpha와 같은 정규화 파라미터를 통해 트리의 성장과 가중치 크기를 제어한다.

하이퍼파라미터 역할
gamma 노드 분할 최소 이득 기준. 이득이 gamma보다 작으면 분할 X → pre-pruning 효과
lambda L2 정규화 계수. 리프 노드 가중치에 패널티 부여 → 가중치 크기 억제, 안정성 증가
alpha L1 정규화 계수. 일부 노드 가중치를 0으로 만들어 모델을 더 단순하게 만듦

 

 

 tree 구조 (level-wise 방식)

level-wise

XGBoost는 트리를 확장할 때 level-wise 방식을 사용한다. 이는 트리를 성장시킬 때, 한 레벨의 모든 노드를 고르게 확장한 뒤 다음 레벨로 넘어가는 방식이다. 예를 들어, 현재 깊이가 2인 트리의 모든 리프 노드를 동시에 확장하여 깊이 3으로 만들고 그다음 다시 전체를 확장하는 식으로 트리 전체를 균형 있게 뻗어 나간다. 이 방식은 병렬 처리가 쉽고 트리 구조가 균형 있게 성장하므로 계산 효율이 좋다는 장점이 있다.


4) LightGBM

항목 설명
설계 목적 대용량 데이터에 최적화된 부스팅
트리 성장 방식 리프 중심 성장(leaf-wise)
학습 방식 히스토그램 기반
튜닝 - num_iterations 또는 n_estimators: 부스팅 반복 횟수 (트리 개수)
- learning_rate: 학습률 (작게 설정하면 느리지만 안정적인 학습)
- max_depth: 트리의 최대 깊이 (과적합 방지)
- num_leaves: 하나의 트리에서 생성할 최대 리프 노드 수 (트리 복잡도 조절)
- min_data_in_leaf: 하나의 리프 노드가 가져야 할 최소 샘플 수
- feature_fraction: 트리 학습 시 사용할 피처 비율 (colsample_bytree와 유사)
- bagging_fraction: 트리 학습 시 사용할 샘플 비율 (subsample과 유사)
- bagging_freq: 배깅 수행 주기 (0이면 배깅 사용 안 함)
- lambda_l1: L1 정규화 계수 (리프 가중치 절댓값 제어)
- lambda_l2: L2 정규화 계수 (리프 가중치 크기 제어)
- min_gain_to_split: 노드 분할을 위한 최소 이득 (분할 조건 완화/제어)
- boosting_type: 부스팅 방식 (gbdt, dart, goss 등 선택 가능)
장점 속도 빠름, 메모리 효율적
단점 과적합 주의, 소규모 데이터엔 불안정할 수 있음

 

 

leaf-wise 방식

leaf-wise

LightGBM은 리프 중심 성장(leaf-wise) 방식으로 매번 전체 트리 중 손실 감소량(Gain)이 가장 큰 리프 노드 하나만 선택하여 해당 노드만 깊게 분할한다. 결과적으로 트리는 불균형하게 자라지만 가장 성능 향상에 효과적인 방향으로 성장하므로 예측 정확도가 높고 더 빠르게 수렴한다. 다만, 리프 중심 방식은 과하게 성장한 한쪽 방향의 트리 때문에 과적합 가능성이 더 커질 수 있어, max_depth와 같은 하이퍼파라미터로 적절한 제어가 필요하다.

 


5) CatBoost

항목 설명
주요 특징 범주형 변수 자동 인코딩, 순열 기반 학습 , 대칭 트리 구조 , 결측치 및 텍스트 자동 처리
튜닝 - iterations: 트리 수 (부스팅 반복 횟수)
- learning_rate: 학습률
- depth: 트리 깊이
- l2_leaf_reg: L2 정규화
- bagging_temperature: 샘플 다양성 조절
- border_count: 연속형 변수 이산화 정밀도
장점 - 범주형 변수 전처리 불필요, 결측값 및 텍스트 자동 처리

 

 

  순열 기반 처리(permutation)의 개념

순열 기반 처리는 학습 데이터의 순서를 무작위로 섞은 뒤, 해당 순서에 따라 통계값을 점진적으로 계산하는 방식이다.
CatBoost에서는 이 방식을 주로 범주형 변수 인코딩 시 정보 누수를 방지하기 위해 사용한다.

범주형 피처를 수치로 변환할 때 흔히 쓰는 방식 중 하나는 Target Encoding인데 이는 각 범주의 평균 타겟값(예: 클릭률 등)을 계산하여 해당 범주에 매핑하는 방식이다.
그러나 이때 모든 샘플의 타겟값을 기준으로 평균을 계산하면 자기 자신의 정보가 인코딩에 포함되는 문제인 정보 누수(leakage)가 발생할 수 있다. CatBoost는 이 문제를 해결하기 위해 데이터를 무작위 순서로 섞은 후, 각 샘플보다 앞에 있는 샘플들만 사용하여 평균값을 계산한다. 즉, 학습 중에도 미래 정보는 사용하지 않고 항상 현재보다 앞선 순서의 데이터만 반영하여 순차적으로 인코딩을 수행한다.

이러한 순열 기반 처리를 통해 CatBoost는 실제 예측 환경과 유사한 조건 하에서 학습할 수 있으며 범주형 변수 인코딩 시에도 정보 누수를 방지할 수 있다.

 

 

 

 

반응형