해설 · 기계학습 · 정형 데이터
XGBoost 깊이 읽기
작은 결정 트리 수백 개를 순서대로 쌓아 오차를 조금씩 깎아내는 알고리즘. 이 단순한 발상에 영리한 수학과 공학적 최적화가 더해지면서, XGBoost(eXtreme Gradient Boosting, 익스트림 그래디언트 부스팅)는 표 형태의 데이터를 다루는 거의 모든 현장에서 기본 도구로 자리 잡았다.
2026 · 부스팅의 원리부터 형제 라이브러리, 그리고 표 데이터에서 강한 이유까지
01 — 발상약한 트리를 모아 강하게 만든다
혼자서는 변변치 않은 학습기를 여러 개 결합해 강력한 예측기를 만드는 방법을 앙상블(ensemble)이라 부른다. XGBoost가 쓰는 부스팅(boosting)은 그중에서도 순차적 결합 방식이다. 가장 작은 단위는 보통 깊이가 얕은 결정 트리(decision tree)다. 결정 트리는 "나이가 40 이상인가?", "소득이 5천만 원 이상인가?" 같은 예/아니오 질문을 가지처럼 이어 붙여 답을 내는 모델이다.
깊이가 1~2단인 작은 트리 하나는 예측력이 보잘것없다. 이런 모델을 약한 학습기(weak learner)라 한다. 부스팅의 핵심 통찰은 단순하다. 약한 트리를 한 번에 하나씩 추가하되, 새로 추가하는 트리는 지금까지의 모델이 틀린 부분에 집중하게 만든다. 이 과정을 수백 번 반복하면 전체 모델은 점점 정교해진다.
시험공부를 떠올려 보자. 첫 모의고사를 본 뒤 틀린 문제만 모아 오답 노트를 만든다. 다음 회차에는 그 약점을 집중적으로 보완하고, 또 틀린 부분을 다시 노트에 더한다. 회차가 거듭될수록 약점이 줄어들어 전체 점수가 올라간다. 부스팅에서 각 트리는 바로 이 '오답 노트'에 해당한다. 매번 직전까지의 오차를 겨냥해 그 부분만 손본다.
02 — 대비배깅과 부스팅은 어떻게 다른가
앙상블에는 크게 두 갈래가 있다. 하나는 배깅(bagging), 다른 하나가 부스팅이다. 둘 다 트리 여러 개를 쓰지만 결합 방식이 정반대다.
배깅은 트리들을 서로 독립적·병렬적으로 학습시킨 뒤 결과를 평균(회귀)하거나 다수결(분류)로 합친다. 대표 주자가 랜덤 포레스트(Random Forest)다. 각 트리는 데이터의 일부를 무작위로 뽑아 따로 자라므로, 서로의 실수를 보지 않는다. 여러 사람의 독립된 의견을 모아 분산을 줄이는 방식이다.
부스팅은 트리들을 순차적으로 학습시킨다. 두 번째 트리는 첫 번째 트리가 남긴 오차를 보고 그것을 메우려 하고, 세 번째 트리는 다시 그 나머지 오차를 겨냥한다. 트리들이 사슬처럼 이어져 앞 모델의 약점을 차례로 보정한다. 그래서 부스팅은 편향(bias)을 줄이는 데 강하고, 배깅은 분산(variance)을 줄이는 데 강하다.
03 — 핵심 엔진그래디언트 부스팅: 오차를 깎아내다
그렇다면 "앞 트리의 오차를 겨냥한다"는 말을 수학적으로 어떻게 구현할까. 답이 그래디언트 부스팅(gradient boosting)이다. 통계학자 제롬 프리드먼이 2001년에 정리한 GBM(Gradient Boosting Machine, 그래디언트 부스팅 머신)이 그 토대다.
핵심 아이디어는 이렇다. 우리가 줄이고 싶은 것은 손실 함수(loss function), 즉 예측이 정답에서 얼마나 벗어났는지를 재는 척도다. 매 단계에서 새 트리는 현재 손실을 가장 빠르게 줄이는 방향, 다시 말해 손실 함수의 음의 그래디언트(기울기)를 학습한다. 평균제곱오차를 손실로 쓰면 이 음의 그래디언트는 그냥 '정답 − 현재 예측', 곧 잔차(residual)가 된다. 그래서 직관적으로는 "새 트리가 남은 잔차를 예측한다"가 맞다.
한 가지 안전장치가 더 있다. 새 트리가 가리키는 방향으로 한 번에 전부 가지 않고, 그 일부만 반영한다. 이 보폭의 크기를 학습률(learning rate) 또는 eta라 부른다. 보폭을 작게 하면 트리가 더 많이 필요하지만 과적합(overfitting) 위험이 줄고 더 매끄럽게 수렴한다.
대리석 덩어리에서 조각상을 깎아내는 조각가를 생각해 보자. 첫 끌질로 큰 형태를 잡고, 그다음에는 아직 어긋난 부분만 골라 조금씩 다듬는다. 한 번에 깊게 파면 형태가 망가지므로 얕게 여러 번 친다. 그래디언트 부스팅에서 각 트리는 한 번의 끌질이고, 학습률은 끌을 얼마나 깊게 댈지 정하는 손의 힘이다. 끌질(트리)을 많이 하되 살살 다듬을수록 매끄러운 결과가 나온다.
04 — 차별점XGBoost가 더한 두 가지
그래디언트 부스팅 자체는 XGBoost 이전부터 있었다. XGBoost가 판도를 바꾼 비결은 거기에 두 가지를 정교하게 결합한 데 있다. 정규화된 목적함수와 2차 테일러 전개다.
① 정규화 — 복잡함에 매기는 벌점
전통적 부스팅은 오차를 줄이는 데만 집중하다 보니 트리가 지나치게 복잡해져 과적합되기 쉬웠다. XGBoost는 학습 목표 안에 모델 복잡도에 대한 벌점을 직접 넣었다. 잎(leaf)의 개수가 많을수록, 잎의 가중치가 클수록 손해를 보게 만든 것이다. 구체적으로는 잎 개수에 매기는 벌점 γ(가지치기 역할), 잎 가중치에 매기는 L2 정규화(릿지) 계수 λ, 그리고 별도로 L1 정규화(라쏘) 계수 α를 쓴다. 이름의 'X(eXtreme, 극한)'는 바로 이런 극한까지 밀어붙인 정규화와 최적화를 가리킨다.
② 2차 테일러 전개 — 기울기에 곡률까지
전통적 GBM은 손실 함수의 1차 미분(그래디언트)만 사용했다. XGBoost는 손실을 2차 항까지 근사해 1차 미분 g(그래디언트)와 2차 미분 h(헤시안, Hessian)를 함께 쓴다. 곡률 정보를 더 가져오는 셈이다. 이 두 통계량만 있으면, 트리 구조가 정해졌을 때 각 잎의 최적 가중치와 어떤 분할이 얼마나 좋은지를 계산식 하나로 곧바로 구할 수 있다. 그래서 분할 결정이 더 정확하고 계산도 효율적이다.
트리 구조가 고정되면 각 잎의 최적 가중치는 그 잎에 모인 표본들의 g 합과 h 합만으로 정해진다. 그리고 어떤 후보 분할(예: "특징 x가 임계값 t보다 작은가?")이 얼마나 이로운지는 분할 전후의 점수 차이, 곧 이득(gain)으로 계산한다. XGBoost는 모든 후보 분할의 이득을 비교해 가장 큰 것을 고르고, 이득이 γ에도 못 미치면 아예 분할하지 않는다. 이것이 곧 가지치기다.
안개 낀 산에서 가장 빠르게 내려가려 한다. 발밑의 경사(1차 미분)만 보면 어느 쪽이 내리막인지는 알지만 얼마나 가파른지, 곧 바닥에 도착할지는 알기 어렵다. 여기에 지형이 얼마나 휘어 있는지(2차 미분, 곡률)까지 함께 보면, 가파른 곳에서는 작게, 완만한 곳에서는 크게 보폭을 정해 더 빠르고 안정적으로 내려갈 수 있다. XGBoost가 헤시안을 함께 쓰는 것이 바로 이 곡률 정보를 활용하는 일이다.
05 — 공학속도와 규모를 떠받치는 설계
알고리즘이 영리해도 큰 데이터에서 느리면 쓸모가 줄어든다. XGBoost가 널리 퍼진 또 다른 이유는 시스템 차원의 최적화에 공을 들였다는 점이다. 원논문 제목에 'Scalable(확장 가능한)'이 들어간 까닭이다.
결측치 자동 처리가 대표적이다. XGBoost는 각 분할마다 '기본 방향(default direction)'을 학습해 둔다. 어떤 표본에 그 특징 값이 비어 있으면 미리 정해 둔 방향으로 흘려보낸다. 결측값을 평균으로 채우는 등의 전처리 없이도 빈 칸을 자연스럽게 다룬다. 희소 데이터에 맞춘 이 기법을 희소성 인식 분할 탐색(sparsity-aware split finding)이라 한다.
근사 분할도 핵심이다. 모든 가능한 분할점을 일일이 따지는 대신, 분위수에 기반한 후보 분할점만 검토한다(가중 분위수 스케치, weighted quantile sketch). 버전 2.0부터는 연속값을 구간(bin)으로 묶는 히스토그램 방식이 기본이 되어, 후보 수가 크게 줄고 대용량에서 빠르게 동작한다.
그 밖에 캐시 친화적 메모리 접근, 데이터를 열 단위 블록으로 나눠 두는 구조, 분할 탐색의 병렬화, 메모리보다 큰 데이터를 디스크 블록으로 처리하는 코어 외(out-of-core) 연산이 더해진다. 나아가 스파크(Spark)·대스크(Dask) 기반 분산 학습과 GPU(Graphics Processing Unit, 그래픽 처리 장치) 가속을 지원하며, 2025년 3.0 판부터는 외부 메모리 구현이 개선되어 테라바이트(terabyte)급 데이터까지 다룰 수 있게 됐다.
여행 중 갈림길에 섰는데 표지판 글씨가 지워져 어디로 갈지 모를 때가 있다. 이때 "정보가 없으면 일단 왼쪽" 같은 기본 규칙이 있다면 멈추지 않고 길을 이어갈 수 있다. XGBoost의 기본 방향이 정확히 그 역할이다. 값이 비어 있어도 학습해 둔 기본 방향으로 보내므로, 결측치를 따로 메우지 않고도 모델이 끊김 없이 작동한다.
06 — 조율모델을 다루는 손잡이들
XGBoost의 성능은 하이퍼파라미터(hyperparameter) 설정에 크게 좌우된다. 손잡이는 크게 두 부류로 나뉜다. 하나는 모델의 표현력을 키우는 쪽, 다른 하나는 과적합을 억제하는 쪽이다. 둘 사이의 균형을 맞추는 것이 조율의 핵심이다.
| 파라미터 | 조절 대상 | 키울 때의 효과 |
|---|---|---|
| n_estimators | 트리 개수 | 표현력 ↑, 과적합 위험 ↑ (학습률과 함께 조절) |
| learning_rate (eta) | 한 트리의 보폭 | 작을수록 안정·과적합 ↓, 대신 트리가 더 필요 |
| max_depth | 트리 깊이 | 복잡한 상호작용 포착 ↑, 과적합 위험 ↑ |
| min_child_weight | 분할의 보수성 | 클수록 보수적으로 분할, 과적합 ↓ |
| subsample | 행(표본) 표집 비율 | 작을수록 무작위성 ↑, 과적합 ↓ |
| colsample_bytree | 열(특징) 표집 비율 | 작을수록 트리 다양성 ↑, 과적합 ↓ |
| gamma | 분할 최소 이득 | 클수록 가지치기 강함, 과적합 ↓ |
| lambda / alpha | 잎 가중치 정규화(L2/L1) | 클수록 가중치 억제, 과적합 ↓ |
실무에서 자주 쓰는 전략은 학습률을 작게(예: 0.05) 두고 트리 개수를 넉넉히 잡되, 조기 종료(early stopping)를 함께 쓰는 것이다. 별도의 검증 데이터에서 성능이 더 나아지지 않으면 트리 추가를 자동으로 멈춘다. 이렇게 하면 적당한 트리 개수를 사람이 일일이 맞추지 않아도 되고 과적합도 막을 수 있다.
07 — 형제들LightGBM과 CatBoost
XGBoost의 성공 이후 같은 그래디언트 부스팅 계열에서 두 라이브러리가 나란히 자리를 잡았다. 마이크로소프트의 LightGBM과 얀덱스(Yandex)의 CatBoost다. 셋의 가장 큰 차이는 트리를 키우는 방식에 있다.
LightGBM은 잎 단위(leaf-wise) 성장으로 손실을 가장 많이 줄이는 잎부터 깊게 판다. 여기에 그래디언트가 큰 표본을 우선 보는 GOSS(Gradient-based One-Side Sampling, 그래디언트 기반 단측 표집)와 거의 함께 나타나지 않는 특징들을 묶는 EFB(Exclusive Feature Bundling, 상호배타 특징 묶기)를 더해, 대용량 데이터에서 가장 빠른 축에 든다. 다만 작은 데이터에서는 과하게 깊어져 과적합되기 쉬워 잎 수나 깊이를 제한해야 한다.
CatBoost는 한 깊이에서 모든 노드가 같은 분할 조건을 쓰는 대칭 트리(oblivious tree)를 만든다. 구조가 단순해 예측이 빠르고 과적합에 강하다. 또 순서형 부스팅(ordered boosting)으로 타깃 정보가 새어 드는 것을 막으며, 무엇보다 범주형(categorical) 변수를 별도 인코딩 없이 그대로 받아들인다. 범주형이 많은 데이터에서 특히 편리하다.
XGBoost는 기본적으로 레벨 단위로 자라지만, 설정으로 잎 단위 성장도 고를 수 있다. 범주형 변수도 3.1 판(2025년)부터 정식 지원한다. 무엇보다 문서·생태계·여러 언어 바인딩이 가장 두텁고 안정적이어서, 새 문제에 가장 먼저 던져 보는 든든한 기준점 역할을 한다.
| 항목 | XGBoost | LightGBM | CatBoost |
|---|---|---|---|
| 개발 주체 | 오픈소스(텐치 첸 외) | 마이크로소프트 | 얀덱스 |
| 기본 트리 성장 | 레벨 단위(잎 단위 선택 가능) | 잎 단위 | 대칭(oblivious) |
| 범주형 변수 | 정식 지원(3.1+) | 지정 시 지원 | 네이티브(자동) |
| 대용량 속도 | 빠름(히스토그램 기본) | 매우 빠름 | 빠름 |
| 대표 강점 | 생태계·안정성·기준점 | 대용량 최속 | 범주형·과적합 억제 |
성능은 데이터에 따라 다르므로 일반화는 조심해야 한다. 대체로 XGBoost와 LightGBM은 정확도가 비슷하고, 대용량에서는 LightGBM·CatBoost가 더 빠른 경향이 보고된다. 셋을 기본 설정으로 함께 돌려 기준선을 잡고 비교하는 것이 흔한 출발점이다.
08 — 의문왜 표 데이터에서는 여전히 강한가
딥러닝(deep learning, 심층 학습)이 이미지와 언어를 평정한 시대에도, 행과 열로 정리된 표 형식(tabular) 데이터에서는 트리 기반 앙상블이 여전히 앞선다는 보고가 꾸준하다. 그르넨슈테인(Grinsztajn) 등이 2022년 신경정보처리시스템 학회(NeurIPS)에서 발표한 분석(arXiv:2207.08815)은 중간 규모의 표 데이터에서 트리 앙상블이 신경망을 앞서는 까닭을 세 가지 귀납 편향(inductive bias)으로 설명한다. 귀납 편향이란 모델이 데이터를 보기 전부터 가지고 있는 가정의 기울기를 뜻한다.
첫째, 트리는 쓸모없는 변수에 덜 흔들린다. 정보가 없는 열이 잔뜩 섞여 있어도 분할 이득이 낮은 변수는 자연히 외면하므로 성능 저하가 작다. 신경망은 이런 잡음 변수에 더 취약하다. 둘째, 트리는 데이터의 축 방향을 보존한다. 한 번에 한 열의 임계값으로 자르는 방식이라 각 변수의 고유한 의미가 그대로 살아 있다. 셋째, 트리는 매끄럽지 않은 불규칙한 함수를 쉽게 학습한다. 신경망은 부드러운 함수 쪽으로 치우치는 경향이 있어, 계단처럼 꺾이는 관계를 표현하려면 더 애를 써야 한다. 이 분석은 또한 그 격차가 범주형 변수 때문만은 아니며, 하이퍼파라미터를 충분히 조율해도 사라지지 않는다고 지적한다.
사진은 픽셀 격자를 조금 회전해도 여전히 같은 고양이다. 그래서 회전에 둔감한 신경망이 잘 맞는다. 반면 표는 다르다. ‘나이’ 열과 ‘소득’ 열을 섞어 새로운 축으로 회전하면 그 값은 아무 의미가 없어진다. 트리는 애초에 열을 섞지 않고 하나씩 기준선을 긋기에, 의미가 열마다 고정된 표 데이터와 궁합이 좋다.
09 — 적용언제 쓰고 언제 피하나
XGBoost가 잘 맞는 영역은 분명하다. 행과 열로 정리된 정형 데이터, 분류와 회귀는 물론 검색 결과를 정렬하는 순위 학습(ranking)까지 폭넓게 다룬다. 수천에서 수십만 행 규모의 중소형 데이터에서 특히 강하고, 새 문제를 만났을 때 빠르게 기준선 모델을 세우는 용도로도 널리 쓰인다. 결측치를 그대로 받아들이고 변수의 단위 차이에 둔감하다는 점도 전처리 부담을 줄여 준다.
반대로 이미지·음성·자연어처럼 원자료에서 특징을 스스로 길어 올려야 하는 비정형 데이터라면 합성곱 신경망이나 트랜스포머(transformer) 계열의 딥러닝이 더 적합하다. 픽셀이나 문자 자체에는 표 같은 열 구조가 없어 트리가 의지할 축이 마땅치 않기 때문이다.
모델이 내놓은 예측의 근거가 필요할 때는 변수 중요도(feature importance)로 어떤 열이 결정에 크게 기여했는지 가늠할 수 있고, 더 정밀하게는 협력 게임 이론에서 빌려 온 샤프(SHAP, SHapley Additive exPlanations · 샤플리 가법 설명) 값으로 개별 예측에 각 변수가 더한 몫을 분해해 볼 수 있다.
10 — 실습몇 줄로 돌려 보기
파이썬(Python)에서는 사이킷런(scikit-learn) 호환 인터페이스를 통해 익숙한 방식으로 곧장 쓸 수 있다. 아래는 분류 문제의 최소 골격으로, 검증 점수가 더 나아지지 않으면 학습을 일찍 멈추는 조기 종료까지 포함했다.
# 설치: pip install xgboost
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X, y, test_size=0.2)
model = XGBClassifier(
n_estimators=2000, # 트리 상한(조기 종료가 실제 개수 결정)
learning_rate=0.05, # 한 그루의 보폭
max_depth=6,
subsample=0.8,
colsample_bytree=0.8,
early_stopping_rounds=50,
eval_metric="logloss",
)
model.fit(X_tr, y_tr, eval_set=[(X_val, y_val)])
pred = model.predict(X_val)
위 코드의 early_stopping_rounds와 eval_metric을 생성자 인자로 넘기는 방식은 비교적 최신 판(1.6 이후)에서 권장된다. 검증 세트(eval_set)의 점수가 50번 동안 개선되지 않으면 학습을 멈추고 가장 좋았던 시점을 채택한다.
11 — 자취한 줄에서 표준으로
XGBoost는 2014년 3월 처음 공개되었다. 당시 워싱턴 대학교(University of Washington) 박사 과정이던 천톈치(陳天奇, Tianqi Chen)가 카를로스 게스트린(Carlos Guestrin) 교수의 지도 아래 내놓은 연구 결과물이다. 입자물리학의 힉스 보손(Higgs boson) 탐색을 다룬 기계학습 경진대회에서 두각을 나타내며 이름이 알려졌고, 이후 정형 데이터 대회에서 우승 해법의 단골로 자리 잡았다. 2016년에는 그 설계를 정리한 논문 〈XGBoost: A Scalable Tree Boosting System〉이 데이터 마이닝 분야 최고 학회인 지식 발견 및 데이터 마이닝 학회(KDD)에서 발표되며 학술적 토대를 굳혔다.
이후로도 발전은 멈추지 않았다. 2025년의 3.x 판에서는 그래픽 처리 장치(GPU) 가속과 분산 학습이 한층 다듬어져 테라바이트(terabyte)급 데이터까지 다룰 수 있게 되었고, 범주형 변수의 정식 지원도 안정 단계에 올랐다. 파이썬뿐 아니라 R, 줄리아(Julia) 등 여러 언어에서 같은 엔진을 부를 수 있다는 점은 이 도구가 특정 진영의 전유물이 아니라 데이터 분석의 공용 자산이 되었음을 보여 준다.
요약하자면 XGBoost의 힘은 화려한 신기술이 아니라, 잘 다듬어진 고전을 끝까지 밀어붙인 공학에서 나온다. 약한 트리를 차례로 쌓아 오차를 깎아 가는 부스팅이라는 오래된 발상에, 과적합을 누르는 정규화와 곡률까지 읽는 2차 근사, 그리고 결측치·대용량·병렬을 감당하는 시스템 설계를 더했다. 이미지와 언어의 자리는 딥러닝에 내주었을지언정, 우리 곁의 수많은 표 데이터 위에서 XGBoost는 여전히 가장 먼저 꺼내 드는 믿음직한 첫 수로 남아 있다.
· · ·