들어가며
AdaBoost와 그레이디언트 부스팅을 알아보기 전에 우선 부스팅이라는 개념에 대해 알아야한다
부스팅은 약한 학습기(랜덤 추측보다 조금 더 높은 성능을 내는 학습기)를 여러 개 연결해서
강한 학습기를 만드는 앙상블 기법을 말한다
이 기법을 활용하여 가장 많이 쓰이는 방법이 AdaBoost와 그레이디언트 부스팅인 것이다
AdaBoost
AdaBoost는 이전 모델이 과소적합했던(오차가 크거나 오분류된) 훈련 샘플의 가중치를 더 높여서
이전 예측기를 보완하는 새로운 예측기를 만드는 방법을 사용한다
이러면 새로운 예측기는 학습하기 어려운 샘플에 점점 맞춰지게 되며
이런식으로 계속 가중치를 업데이트하는 방식으로 예측기를 만들어 나간다

그림에서 볼 수 있듯이
매 스텝마다 잘못 분류된 샘플에 집중해서 이 샘플들을 더 잘 예측할 수 있도록 보완한다
이런식으로 모델의 훈련을 마쳤다면 모델은 최종 예측을 할 때
학습 과정에서 사용된 모든 예측기들을 사용하여 최종 예측을 만든다
이 때 예측기마다 정확도에 따라 계산된 서로 다른 가중치가 적용되며(모델 가중치라고 부름)
최종 예측은 이 가중치들을 반영한 가중 투표 방식으로 진행된다

위 사진은 어떤 데이터셋에 AdaBoost 방법으로 훈련시킨 5개의 연속된 예측기의 결정 경계를 나타낸다
우선 왼쪽 그림을 보면 2번째 학습이 경계가 적당히 유연하며 패턴을 과하지 않게 잡는 모습인데
3번째 학습부터는 경계가 점점 더 복잡해지며 4번째 5번째를 보면 특정 노이즈에 끌려가는 것을 볼 수 있다
즉 많이 학습 할수록 성능적으로 무조건 좋아지는 것은 아니며
과대적합이 될 수 있다는 것을 염두에 두어야 한다
또한 오른쪽 그래프는 왼쪽 그래프의 학습률에서 절반을 낮춘 모습인데
이 그래프가 왼쪽 모델보다 결정 경계가 더 부드럽고 일반화가 잘되는 것을 볼 수 있다
적절한 반복과 학습률 조합을 선택하여 모델을 구성하는 것이 중요하다는 것을 알려준다
AdaBoost 알고리즘 학습 과정
AdaBoost 알고리즘의 조금 더 세부적인 학습 과정을 알아보자면
우선 각 샘플의 가중치 w는 초기에 1/m으로 초기화된다(m은 샘플 수)
이후 예측기의 학습이 진행되고 오류율 r이 계산된다

yi != ht(xi)는 예측값과 실제값이 다른 경우 1, 같은 경우 0을 나타낸다
그래서 전체 식은 틀린 샘플의 가중치 합 / 전체 샘플의 가중치 합을 의미한다
오류율이 계산되면 예측기의 가중치(모델 가중치)가 계산될 수 있다

η는 학습률 하이퍼파라미터를 나타내고
예측기가 정확할수록 즉 오류율이 낮을 수록 모델 가중치 값이 커지고
예측기가 부정확할수록 오류율이 높아지므로 모델 가중치 값이 작아지게된다
모델 가중치까지 계산되면 AdaBoost 알고리즘은 샘플의 가중치를 업데이트한다

업데이트는 위의 식을 활용하고
예측값이 실제값과 같은 경우 가중치를 그대로 두고
다른 경우 가중치에 eαt라는 업데이트 계수를 곱하여 다음 모델이 이 값에 더 집중할 수 있도록 한다
이후 새 예측기가 업데이트된 가중치를 사용하여 훈련하고 위 과정이 다시 반복된다
만약 AdaBoost 알고리즘이 지정된 예측기 수에 도달하거나 완벽한 예측기가 만들어지면 이 과정은 중지된다
사이킷런에서 AdaBoost를 사용하려면 AdaBoostClassifier 클래스를 사용하면 된다
from sklearn.ensemble import AdaBoostClassifier
ada_clf = AdaBoostClassifier(
DecisionTreeClassifier(max_depth=1), n_estimators=30,
learning_rate=0.5, random_state=42)
ada_clf.fit(X_train, y_train)
코드를 보면 30개의 깊이가 1인 얇은 결정 트리를 사용하여 AdaBoost를 사용하는 것을 알 수 있다
만약 이 앙상블이 훈련 세트에 과대적합 되었다면 추정기의 수를 줄이거나 규제를 더 강하게 해야한다
그레이디언트 부스팅
AdaBoost와 더불어서 많이 쓰이는 부스팅 알고리즘으로는 그레이디언트 부스팅이 있다
그레이디언트 부스팅은 AdaBoost처럼 매 단계마다 모든 샘플을 보는 것이 아니라
이전 예측기가 만든 잔여 오차를 새로운 예측기에 학습시키는 구조이다
그레이디언트 부스팅 방식을 이용한 회귀 모델을 예로 들어 설명을 이어나가보겠다
tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42)
tree_reg1.fit(X, y)
어떤 데이터셋을 결정 트리 회귀모델에 학습시킨 모습이다
y2 = y - tree_reg1.predict(X)
tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=43)
tree_reg2.fit(X, y2)
이후 첫번째 예측기에서 생긴 잔여 오차를 y2라고 정의하고
이를 새로운 레이블로 생각하고 두번째 예측기에 학습시킨다
y3 = y2 - tree_reg2.predict(X)
tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=44)
tree_reg3.fit(X, y3)
똑같은 방식으로 세번째 예측기까지 학습시킨다
이렇게하면 세 개의 트리를 가지는 하나의 앙상블 모델이 완성되고
이 앙상블 모델에서 예측을 만들 때는 샘플에 대한 3개 트리의 예측을 더하면 된다
훈련 과정을 그래프를 통해 자세히 알아보자면

왼쪽 열은 위의 3개의 모델 reg1, reg2, reg3의 예측을 나타낸 것이고
오른쪽 열은 앙상블의 예측을 나타낸다
첫번째 행에서는 앙상블에 트리가 1개 뿐이여서 트리의 예측과 앙상블의 예측이 동일하고
2개,3개로 늘어나고 오차를 학습하면서 예측이 점차 좋아지는 것을 볼 수 있다
사이킷런의 GradientBoostingRegressor 클래스를 사용하면 그레디언트 부스팅을 간단히 훈련시킬 수 있게된다
from sklearn.ensemble import GradientBoostingRegressor
gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3,
learning_rate=1.0, random_state=42)
gbrt.fit(X, y)
learning_rate 매개변수는 각 단계에서 새로 추가되는 모델의 기여도를 조절한다
이 값을 낮게설정하면 많은 양의 트리가 요구되지만 성능은 좋아진다
이를 축소라는 규제 방법으로써 부른다

오른쪽 그래프는 왼쪽에 비해 학습률이 낮아 트리가 더 많은 모습이고
왼쪽에 비해 성능은 좋지만 더 과대적합될 위험이 있는 모습이다
학습률을 낮춰 트리가 많아지면 성능이 좋아지지만
과대적합될 위험성이 증가한다
그래서 적절한 트리 개수를 찾아야 한다
이 때 사용할 수 있는 것이 n_iter_no_change라는 매개변수이다
만약 이 값을 10으로 설정했다면 훈련 중 마지막 10개의 트리가 도움이 되지 않는 경우
트리 추가를 중지하는 조기 종료 기법으로 쓰인다
여기서 도움이 안된다는 것의 기준이 무엇인지 궁금할 수 있다
기준은 tol이라는 매개변수로 설정하는데 무시할 수 있는 최대 성능 향상을 결정한다
즉 tol로 설정한 값보다 성능 개선량이 작은게 n_iter_no_change로 설정한 횟수만큼 지속되면
조기종료시키는 구조로 사용된다
이 값을 너무 낮게 설정한다면 훈련이 너무 일찍 종료될 수 있어 모델이 과소적합될 수 있다
하지만 그렇다고 너무 높게 설정하면 오히려 과대적합이 되어버릴 수 있다
그래서 학습률을 낮춰 추정기 개수를 늘려 성능을 높이는 구조에
조기 종료 기법을 적용시켜 적절한 추정기 개수를 설정하는 전략이 실제로 자주 쓰인다
마치며
이번 글에서는 부스팅 기법 중 AdaBoost 와 그레이디언트 부스팅 기법에 대해 알아보았다
개인적으로는 AdaBoost가 이상치에 민감하고 모델 구조가 단순해서
그레이디언트 부스팅이 복잡한 데이터와 정교한 해석을 요구하는 문제에 더 적합해 보인다는 생각을 했다
모델을 학습시킬 때 파라미터의 단순 값들도 중요하지만
관련있는 다른 여러 파라미터들과 어떤 조합으로 어떤 값을 가질 지 결정하는것도 굉장히 중요한 부분이라고 느꼈다
'AI > Machine Learning' 카테고리의 다른 글
| [AI] 존슨-린덴스트라우스 정리를 통한 랜덤 투영, 지역 선형 임베딩(LLE) (0) | 2026.05.07 |
|---|---|
| [AI] 주성분 분석(PCA) (0) | 2026.05.03 |
| [AI] 스태킹(Stacking) (1) | 2026.04.25 |
| [AI] 랜덤 패치, 랜덤 서브스페이스, 랜덤 포레스트 (0) | 2026.04.21 |
| [AI] 앙상블 알고리즘(투표 기반 분류기, 배깅과 페이스팅) (0) | 2026.04.19 |
