CatBoost
CatBoost는 Yandex의 오픈 소스 그래디언트 부스팅 라이브러리로, 순서가 반영된 타깃 통계로 범주형 특성을 인코딩하고 대칭 트리를 성장시킵니다.
CatBoost는 Yandex가 개발해 2017년에 공개한 결정 트리용 오픈 소스 그래디언트 부스팅 라이브러리입니다. 이름은 "범주형 부스팅"에서 유래했습니다. 도시, 제품 ID, 기기 유형과 같은 범주형 열을 원시 문자열로 받아 내부적으로 숫자로 변환하므로, 학습 전에 테이블형 데이터에 수동 원-핫 인코딩이나 타깃 인코딩을 적용할 필요가 없습니다. NeurIPS 2018 논문의 두 가지 아이디어인 순서형 타깃 통계와 순서형 부스팅은 각 학습 행의 레이블이 해당 행을 학습하는 데 사용되는 숫자에 포함되지 않도록 합니다. 이러한 누출은 일반 타깃 인코딩과 표준 부스팅 모두에 편향을 일으킵니다. CatBoost는 CPU와 GPU에서 학습할 수 있고 Python, R, 명령줄 인터페이스를 제공하며 분류, 회귀, 랭킹을 지원합니다.
CatBoost의 범주형 특징 인코딩 방식#
원-핫 인코딩은 범주마다 열 하나를 만듭니다. 따라서 판매자 ID나 사용자 ID처럼 값이 수천 개에 이르는 특징에서는 관리하기 어려워집니다. 타깃 인코딩은 각 범주를 해당 범주 행의 평균 레이블로 대체합니다. 간결하지만 행 자체의 레이블이 그 행을 설명하는 숫자에 포함되어 정답이 누출되므로, 새 데이터에서 성능이 떨어지는 지름길을 모델이 학습합니다. 이는 데이터 누출의 한 형태이며 과적합으로 나타나고, 희귀 범주에서 가장 심각합니다.
CatBoost의 순서형 타깃 통계는 학습 행을 무작위로 순열해 이 문제를 해결합니다. 각 행의 범주는 순열에서 해당 행보다 앞선 행의 레이블만을 사용해 인코딩하고 사전 확률 쪽으로 평활화하므로 어떤 행도 자체 레이블을 볼 수 없습니다. CatBoost는 여러 순열에 걸쳐 이 작업을 반복하고, 고유 값이 매우 적은 특징은 원-핫 인코딩하며, 학습 중에 도시와 기기 유형의 교차와 같은 범주형 특징 조합을 새로운 특징으로 탐욕적으로 구성합니다.
CatBoost Python 패키지에서는 cat_features을 통해 범주형 열을 이름으로 전달합니다. 다음 예제는 구독 요금제 50개 각각에 숨겨진 이탈률을 부여하고, 원시 요금제 이름만으로 모델이 해당 비율을 알아내는지 확인합니다.
import numpy as np
import pandas as pd
from catboost import CatBoostClassifier
# Synthetic churn data: each of 50 plans has its own hidden churn rate
rng = np.random.default_rng(0)
rates = rng.uniform(0.05, 0.6, size=50)
plan_ids = rng.integers(0, 50, size=5000)
X = pd.DataFrame({"plan": [f"plan_{i}" for i in plan_ids], "tenure_months": rng.integers(1, 60, size=5000)})
y = rng.random(5000) < rates[plan_ids]
# Raw strings go in directly; CatBoost encodes them with ordered target statistics
model = CatBoostClassifier(iterations=200, depth=4, verbose=0, random_seed=0)
model.fit(X, y, cat_features=["plan"])
# Compare true and predicted churn for the safest and riskiest plans
lo, hi = rates.argmin(), rates.argmax()
probe = pd.DataFrame({"plan": [f"plan_{lo}", f"plan_{hi}"], "tenure_months": [30, 30]})
print("True churn rates: ", rates[[lo, hi]].round(2))
print("Predicted churn rates:", model.predict_proba(probe)[:, 1].round(2))스크립트는 실제 비율 0.05와 0.60, 예측 비율 0.06과 0.59를 출력합니다. 요금제당 학습 행이 약 100개뿐인데도 모델은 원시 문자열 열에서 각 요금제의 이탈률을 찾아냈습니다.
순서형 부스팅과 대칭 트리#
표준 그래디언트 부스팅은 새로운 트리의 타깃인 손실의 그래디언트를 이전 트리를 학습한 것과 동일한 행에서 계산하므로 그래디언트에 편향이 생깁니다. CatBoost 저자는 이러한 현상을 예측 시프트라고 부릅니다. 순서형 부스팅은 순열 기법을 다시 적용합니다. 각 행의 그래디언트는 순열에서 해당 행보다 앞선 행만으로 학습한 모델에서 가져옵니다. 이는 학습 옵션인 boosting_type="Ordered"이며, 속도가 느려지는 대신 작은 데이터셋의 품질을 대체로 높여 줍니다. CPU의 기본값은 기존 "Plain" 방식이며, GPU 학습에서는 다중 클래스 모드를 제외하고 행이 50,000개 이하인 데이터셋에 "Ordered"이 기본으로 적용됩니다.
CatBoost는 기본적으로 대칭 트리 또는 망각 트리를 생성하며, 이 트리에서는 같은 깊이의 모든 노드가 동일한 분할 조건을 사용합니다. 따라서 기본 깊이인 6의 트리는 예/아니요 테스트 여섯 개에 불과하며, 그 결과는 64개 리프 중 하나를 가리키는 6비트 인덱스를 구성합니다. 이 구조는 예측을 빠르게 하고 각 트리의 복잡도를 제한하는 정규화 방식입니다. 데이터셋에 제약이 더 적은 트리가 필요하면 grow_policy 파라미터를 사용해 깊이별 또는 리프별 성장을 적용할 수 있습니다.
실제 적용 사례#
- 신용 위험: 대출 기관은 수백 개의 직업 코드를 원-핫 인코딩하지 않고도 직업, 지역, 대출 목적과 같은 신청자 범주형 필드와 소득 및 부채 금액 같은 수치형 데이터를 결합해 채무 불이행을 예측합니다.
- 랭킹 및 추천: CatBoost는 YetiRank와 같은 랭킹 손실 함수를 제공하며, 이는 사용자, 항목, 컨텍스트 특징을 바탕으로 예측 관련성에 따라 검색 결과나 제품 순서를 정하는 추천 시스템에 사용됩니다.
- 부동산 가치 평가: 맞춤 학습한 YOLO26 탐지기는 매물 사진에서 수영장이나 태양광 패널 같은 편의 시설을 셀 수 있으며, 이 수치는 지역이나 부동산 유형 같은 범주형 열과 함께 CatBoost 가격 모델의 수치형 열로 입력됩니다.
CatBoost와 XGBoost 및 LightGBM 비교#
세 라이브러리는 모두 트리의 앙상블을 순차적으로 구성하고, 각 트리가 이전 트리의 오류를 보정합니다. 이 점에서 각 트리를 독립적으로 학습하는 랜덤 포레스트와 다릅니다.
- XGBoost: 기본적으로 트리를 레벨별로 성장시키며 목적 함수에 L1 및 L2 정규화를 추가합니다. 네이티브 범주형 지원은 이후 버전에 도입되었으며, 여전히 많은 파이프라인이 학습 전에 범주를 인코딩합니다.
- LightGBM: 손실을 가장 많이 줄이는 리프를 분할하는 리프별 방식으로 트리를 성장시키고, 특징을 히스토그램으로 구간화해 대규모 데이터셋에서 빠르게 작동합니다. 정수로 인코딩된 범주형 열도 네이티브 방식으로 처리합니다.
- CatBoost: 대칭 트리를 구성하고 순서형 타깃 통계로 범주를 인코딩하며, 하이퍼파라미터 튜닝 전에 설정을 조정하지 않아도 우수한 결과를 제공합니다. 기본값은 깊이 6의 트리 1,000개이며, 로그 손실, 다중 클래스, RMSE 목적 함수에서는 반복 횟수에 따라 학습률을 자동으로 선택합니다.










