
AdaBoost - Adaptive Boosting 개념 정리
들어가며
AdaBoost는 부스팅(Boosting) 계열 앙상블 알고리즘의 시초로, 1997년 Freund와 Schapire가 제안한 알고리즘입니다. "Adaptive"라는 이름처럼, 이전 모델이 틀린 샘플에 더 집중하도록 적응적으로 가중치를 조정하며 학습합니다.
시험 준비를 예로 들어 보겠습니다. 첫 번째 모의고사에서 틀린 문제를 표시해 두고, 두 번째 공부할 때 그 문제에 더 많은 시간을 투자합니다. 세 번째에는 여전히 틀린 문제에 또 집중합니다.
AdaBoost는 이 과정을 데이터에 적용합니다. 틀린 샘플의 가중치를 높여 다음 모델이 그 샘플에 더 집중하도록 만드는 것입니다. 이 글에서는 AdaBoost의 동작 원리, 수식, 그리고 파이썬 구현 예제를 설명합니다.
- 부스팅이란?
- AdaBoost 동작 원리
- AdaBoost 수식 정리
- 단계별 예제
- 파이썬을 활용한 AdaBoost
- 장점과 한계점
부스팅이란?
앙상블(Ensemble) 은 여러 모델을 결합하여 하나의 강한 모델을 만드는 방식입니다. 앙상블에는 크게 두 가지 전략이 있습니다.
| 전략 | 방식 | 대표 알고리즘 |
| 배깅(Bagging) | 여러 모델을 병렬로 독립적으로 학습 | 랜덤 포레스트 |
| 부스팅(Boosting) | 여러 모델을 순차적으로 학습, 이전 모델의 오류를 보완 | AdaBoost, GBM, XGBoost, LightGBM |
부스팅의 핵심 아이디어는 약한 학습기(Weak Learner)를 여러 개 순서대로 결합하여 강한 학습기(Strong Learner)를 만드는 것입니다. 여기서 약한 학습기란, 무작위 예측보다 약간 더 나은 수준의 모델을 의미합니다. AdaBoost에서는 일반적으로 깊이 1짜리 의사결정나무, 즉 스텀프(Stump) 를 사용합니다. 먼저, 스텀프에 대해 자세히 알아보겠습니다.
스텀프란?
스텀프는 하나의 조건(분기)만 가진 의사결정나무. 루트 노드 하나와 리프 노드 두 개로 구성됩니다.
스텀프 하나만으로는 왜 부족한가
스텀프는 조건 하나만 봅니다. 예를 들어 과일을 분류하는 문제에서 "색깔이 빨강이면 사과"라는 규칙 하나만 사용하는 것과 같습니다. 이 규칙만으로는 초록 사과나 노란 사과를 모두 틀리게 됩니다. 무작위 예측(50%)보다는 낫지만, 혼자서는 완벽하지 않습니다. 이것이 약한 학습기입니다.

왜 스텀프를 순서대로 쌓는가
단순히 스텀프를 여러 개 합치는 것이 아닙니다. 앞 스텀프가 틀린 샘플을 다음 스텀프가 집중적으로 교정하는 것이 핵심입니다.
- 1라운드 스텀프: 초록 사과 3개를 틀림
- 2라운드 스텀프: 틀린 그 3개에 집중해서 학습
- 3라운드 스텀프: 아직 틀리는 샘플에 집중
위 과정을 반복하면 각 스텀프가 서로 다른 약점을 보완하고, 전체를 합산했을 때 강한 분류기가 됩니다.
약한 학습기를 합산하는 방법
스텀프 3개를 과일 분류 예제에 적용하면 다음과 같습니다.
| 스텀프 | 조건 | 정확도 |
| 스텀프 1 | 색깔이 빨강? → 사과 | 65% |
| 스텀프 2 | 모양이 길쭉? → 바나나 | 70% |
| 스텀프 3 | 색깔이 노랑? → 바나나 | 60% |
각각은 약하지만, 세 가지 의견을 가중 합산하면 더 정확해집니다. 최종 예측 수식은 다음과 같습니다.
$$ F(x) = \text{sign}(\alpha_1 \times \text{스텀프}_1 + \alpha_2 \times \text{스텀프}_2 + \alpha_3 \times \text{스텀프}_3) $$
여기서 $\alpha$는 각 스텀프의 신뢰도(기여도 가중치)입니다. 정확도가 높은 스텀프일수록 $\alpha$가 크고, 최종 예측에 더 큰 영향을 미칩니다. $\alpha$를 구체적으로 어떻게 계산하는지는 동작 원리 섹션에서 설명합니다.
랜덤 포레스트와의 차이
부스팅의 이 철학(순차적 오류 보완)은 AdaBoost, GBM, XGBoost, LightGBM 모두에 공통으로 적용됩니다. AdaBoost는 이 보완 방식을 샘플 가중치 조정으로 구현합니다. 구체적인 방법은 다음 섹션에서 설명합니다.
AdaBoost 동작 원리
AdaBoost는 다음 순서로 반복 학습합니다.
1단계: 초기 가중치 부여
모든 훈련 샘플에 동일한 가중치를 부여합니다. 샘플이 $N$개라면 각 샘플의 초기 가중치는 다음과 같습니다.
$$ w_i^{(1)} = \frac{1}{N} $$
2단계: 약한 학습기 학습
가중치를 반영하여 스텀프를 학습합니다. 이 스텀프는 가중치가 높은 샘플을 더 중요하게 여기며 분류합니다.
3단계: 오류율 계산
학습된 스텀프의 가중 오류율(Weighted Error Rate)을 계산합니다.
$$ \epsilon_m = \sum_{i: \hat{y}_i \neq y_i} w_i^{(m)} $$
- $\epsilon_m$: $m$번째 스텀프의 가중 오류율
- 오류율이 0.5보다 낮아야 무작위 예측보다 나은 모델입니다.
4단계: 학습기 가중치 계산
오류율이 낮을수록 이 스텀프의 최종 예측에 대한 기여도(가중치)를 높게 설정합니다.
$$ \alpha_m = \frac{1}{2} \ln \left( \frac{1 - \epsilon_m}{\epsilon_m} \right) $$
- $\alpha_m$: $m$번째 스텀프의 기여도 가중치
- 오류율이 낮을수록 $\alpha_m$이 커집니다. 오류율이 0이면 $\alpha_m \to \infty$, 오류율이 0.5이면 $\alpha_m = 0$
5단계: 샘플 가중치 업데이트
다음 라운드를 위해 샘플 가중치를 업데이트합니다.
$$ w_i^{(m+1)} = w_i^{(m)} \cdot \exp\left(-\alpha_m \cdot y_i \cdot \hat{y}_i^{(m)}\right) $$
- 이전 스텀프가 맞춘 샘플의 가중치는 감소합니다.
- 이전 스텀프가 틀린 샘플의 가중치는 증가합니다.
업데이트 후 전체 가중치의 합이 1이 되도록 정규화합니다.
6단계: 최종 예측
모든 스텀프의 예측에 각 스텀프의 기여도 $\alpha_m$을 곱해 합산합니다.
$$ F(x) = \text{sign}\left(\sum_{m=1}^{M} \alpha_m \cdot h_m(x)\right) $$
- $h_m(x)$: $m$번째 스텀프의 예측값 (+1 또는 -1)
- $\text{sign}$: 합이 양수면 +1, 음수면 -1로 최종 클래스를 결정
수식 정리
AdaBoost의 핵심 수식 4개를 한눈에 정리합니다.
| 수식 | 의미 |
| $w_i^{(1)} = \frac{1}{N}$ | 초기 가중치 균등 배분 |
| $\epsilon_m = \sum_{i:\hat{y}_i \neq y_i} w_i^{(m)}$ | $m$번째 스텀프의 가중 오류율 |
| $\alpha_m = \frac{1}{2} \ln\left(\frac{1-\epsilon_m}{\epsilon_m}\right)$ | $m$번째 스텀프의 기여도 가중치 |
| $F(x) = \text{sign}\left(\sum_{m=1}^{M} \alpha_m h_m(x)\right)$ | 최종 예측 (모든 스텀프의 가중 합산) |
단계별 예제
4개의 샘플로 AdaBoost의 첫 두 라운드를 직접 계산합니다.
초기 데이터 (N=8)
| 샘플 | 실제 클래스 | 초기 가중치 |
| 1 | + | 0.125 |
| 2 | + | 0.125 |
| 3 | + | 0.125 |
| 4 | + | 0.125 |
| 5 | - | 0.125 |
| 6 | - | 0.125 |
| 7 | - | 0.125 |
| 8 | - | 0.125 |
라운드 1
첫 번째 스텀프가 샘플 1, 2, 3을 오분류했다고 가정합니다.
- 가중 오류율: $\epsilon_1 = 0.125 \times 3 = 0.375$
- 기여도 가중치: $\alpha_1 = \frac{1}{2} \ln\left(\frac{1-0.375}{0.375}\right) \approx 0.255$
- 오분류된 샘플 1, 2, 3의 가중치는 증가, 나머지는 감소
라운드 2
두 번째 스텀프는 가중치가 높아진 샘플 1, 2, 3을 더 잘 분류하는 방향으로 학습됩니다. 이 과정을 $M$번 반복한 뒤, 모든 스텀프의 예측을 $\alpha_m$으로 가중 합산하여 최종 클래스를 결정합니다.
파이썬을 활용한 AdaBoost
파이썬에서는 sklearn의 AdaBoostClassifier를 사용합니다.
기본 분류 예제
와인 데이터셋을 활용한 다중 분류 예제입니다.
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
import pandas as pd
# 데이터 로드
데이터 = load_wine()
X = pd.DataFrame(데이터.data, columns=데이터.feature_names)
y = 데이터.target
# 학습/테스트 분리
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 약한 학습기: 깊이 1짜리 스텀프 정의
스텀프 = DecisionTreeClassifier(max_depth=1)
# AdaBoost 모델 정의 및 학습
model = AdaBoostClassifier(
estimator=스텀프, # 약한 학습기 지정
n_estimators=100, # 스텀프 개수
learning_rate=1.0, # 각 스텀프의 기여도 스케일
random_state=42
)
model.fit(X_train, y_train)
# 예측 및 평가
y_pred = model.predict(X_test)
print(f"정확도: {accuracy_score(y_test, y_pred):.4f}")
print(classification_report(y_test, y_pred))
출력 결과에서 단일 의사결정나무보다 높은 정확도를 확인할 수 있습니다.

주요 파라미터
| 파라미터 | 설명 | 기본값 |
| estimator | 약한 학습기 지정 (기본값: 깊이 1 의사결정나무) | DecisionTreeClassifier(max_depth=1) |
| n_estimators | 사용할 약한 학습기(스텀프)의 수 | 50 |
| learning_rate | 각 스텀프의 기여도 스케일 조정 | 1.0 |
| algorithm | 가중치 업데이트 알고리즘 (SAMME 또는 SAMME.R) | SAMME.R |
학습 과정 시각화
라운드가 증가함에 따라 정확도가 어떻게 변하는지 확인합니다.
import matplotlib.pyplot as plt
from sklearn.metrics import accuracy_score
# 라운드별 누적 정확도 계산
라운드별_정확도 = []
for y_pred_step in model.staged_predict(X_test):
라운드별_정확도.append(accuracy_score(y_test, y_pred_step))
# 시각화
plt.figure(figsize=(8, 4))
plt.plot(range(1, len(라운드별_정확도) + 1), 라운드별_정확도)
plt.xlabel('라운드 수 (n_estimators)')
plt.ylabel('테스트 정확도')
plt.title('AdaBoost - 라운드별 정확도 변화')
plt.grid(True)
plt.tight_layout()
plt.show()
staged_predict()는 각 라운드까지의 누적 예측값을 반환합니다. 일반적으로 라운드가 증가할수록 정확도가 높아지다가, 일정 시점 이후 수렴하거나 과적합이 발생합니다.

특성 중요도 확인
# 특성 중요도 추출 및 시각화
중요도 = pd.Series(
model.feature_importances_,
index=X.columns
).sort_values(ascending=False).head(10)
plt.figure(figsize=(8, 5))
중요도.plot(kind='barh')
plt.title('AdaBoost Feature Importance (상위 10개)')
plt.xlabel('Importance')
plt.gca().invert_yaxis()
plt.tight_layout()
plt.show()

장점과 한계점
장점
- 구현이 단순합니다.
약한 학습기와 가중치 업데이트 규칙만으로 강한 분류기를 만들 수 있습니다. - 과적합에 비교적 강합니다.
이론적으로 라운드를 늘려도 일정 수준까지는 과적합이 크게 증가하지 않습니다. - 특성 스케일링이 불필요합니다.
트리 기반 약한 학습기를 사용하므로 정규화 없이도 사용 가능합니다. - 이진 분류뿐 아니라 다중 분류도 지원합니다.
SAMME 알고리즘을 통해 다중 클래스 문제에 적용할 수 있습니다.
한계점
- 이상치(Outlier)에 민감합니다.
오분류된 샘플의 가중치가 계속 증가하므로, 노이즈나 이상치가 있으면 성능이 크게 저하될 수 있습니다. - 순차 학습이라 병렬화가 어렵습니다.
각 라운드가 이전 결과에 의존하므로, 랜덤 포레스트처럼 병렬로 학습할 수 없습니다. - 그래디언트 부스팅 대비 성능이 낮습니다.
잔차를 직접 학습하는 GBM, XGBoost, LightGBM에 비해 대부분의 태스크에서 성능이 낮습니다.
| 비교 항목 | 배깅(랜덤 포레스트) | 부스팅(AdaBoost) |
| 학습 순서 | 병렬(독립적) | 순차(이전 결과 반영) |
| 오류 보완 방식 | 다양성으로 분산 감소 | 틀린 샘플 집중으로 편향 감소 |
| 이상치 민감도 | 낮음 | 높음 |
| 속도 | 빠름(병렬화 가능) | 느림 |
마무리하며
AdaBoost는 약한 학습기(스텀프)를 순차적으로 학습하되, 이전 모델이 틀린 샘플에 더 높은 가중치를 부여해 다음 모델이 집중하도록 만드는 부스팅 알고리즘입니다.
오류율이 낮은 스텀프일수록 최종 예측에 더 큰 기여도($\alpha$)를 가지며, 모든 스텀프의 가중 합산으로 최종 클래스를 결정합니다. 부스팅 계열 알고리즘(GBM, XGBoost, LightGBM)의 핵심 아이디어인 "순차적 오류 보완"을 가장 직관적으로 이해할 수 있는 알고리즘입니다.
'이론' 카테고리의 다른 글
| [알고리즘] 랜덤 포레스트 Random Forest 개념 정리 (1) | 2026.08.05 |
|---|---|
| [알고리즘] 주성분 분석 PCA - 개념 정리 (2) | 2026.07.29 |
| [알고리즘] 라쏘 회귀 - Lasso Regression 개념 정리 (2) | 2026.07.23 |
| [알고리즘] 의사결정나무 Decision Tree - 개념 정리 (2) | 2026.07.07 |
| [이론] CVRP, Capacitated Vehicle Routing Problem - 기초 개념 정리 (3) | 2026.06.29 |