본문으로 건너뛰기

032 CatBoost 분류 상세

키워드: CatBoost, catboost

개요

CatBoost(Categorical Boosting)는 Yandex에서 개발한 Gradient Boosting 라이브러리입니다. 범주형 변수 처리에 특화되어 있으며, 튜닝 없이도 좋은 성능을 제공합니다.

실습 환경

  • Python 버전: 3.11 권장
  • 필요 패키지: pycaret[full]>=3.0

CatBoost 특징

  • 범주형 변수 자동 처리: Target Encoding 자동 적용
  • Ordered Boosting: 데이터 누수 방지
  • 기본값으로 좋은 성능: 튜닝 민감도 낮음
  • 빠른 GPU 학습: 최적화된 GPU 구현
  • 시각화 도구: 내장 시각화 기능

PyCaret에서 CatBoost

from pycaret.classification import *
from pycaret.datasets import get_data

# 032 데이터 로드
data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

# 032 CatBoost 모델 생성
cat = create_model('catboost')

주요 하이퍼파라미터

부스팅 파라미터

# 032 iterations (n_estimators): 부스팅 라운드 수
cat = create_model('catboost', iterations=1000)

# 032 learning_rate: 학습률
cat = create_model('catboost', learning_rate=0.03)

# 032 depth: 트리 깊이 (1-16, 기본 6)
cat = create_model('catboost', depth=6)

정규화 파라미터

# 032 l2_leaf_reg: L2 정규화
cat = create_model('catboost', l2_leaf_reg=3)

# 032 random_strength: 분할 점수에 무작위성 추가
cat = create_model('catboost', random_strength=1)

# 032 bagging_temperature: 부트스트랩 강도
cat = create_model('catboost', bagging_temperature=1)

범주형 처리

# 032 cat_features는 setup()에서 자동 인식
# 032 또는 직접 지정

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('titanic')

clf = setup(
data,
target='Survived',
ignore_features=['PassengerId', 'Name', 'Ticket', 'Cabin'],
categorical_features=['Pclass', 'Sex', 'Embarked'],
session_id=42,
verbose=False
)

cat = create_model('catboost', verbose=False)

Ordered Boosting

CatBoost의 핵심 기술로, 데이터 누수를 방지:

# 032 전통적 방식의 문제:
# 032 모든 데이터로 Target Encoding → 데이터 누수 발생

# 032 CatBoost Ordered Boosting:
# 032 각 샘플의 타겟 인코딩 시 해당 샘플 이전 데이터만 사용
# 032 → 데이터 누수 방지, 과적합 감소

기본값 성능 비교

from pycaret.classification import *
from pycaret.datasets import get_data
import pandas as pd

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

# 032 기본 파라미터로 비교
models = ['xgboost', 'lightgbm', 'catboost']
results = []

for model_name in models:
model = create_model(model_name, verbose=False)
metrics = pull()

results.append({
'model': model_name,
'accuracy': metrics['Accuracy'].mean(),
'auc': metrics['AUC'].mean()
})

df = pd.DataFrame(results)
print(df)

# 032 CatBoost는 기본값으로도 좋은 성능

Early Stopping

from catboost import CatBoostClassifier
from sklearn.model_selection import train_test_split
from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

X_train = get_config('X_train')
y_train = get_config('y_train')

X_tr, X_val, y_tr, y_val = train_test_split(
X_train, y_train, test_size=0.2, random_state=42
)

# 032 CatBoost 네이티브 API
model = CatBoostClassifier(
iterations=1000,
learning_rate=0.03,
depth=6,
early_stopping_rounds=50,
verbose=100
)

model.fit(
X_tr, y_tr,
eval_set=(X_val, y_val)
)

print(f"Best iteration: {model.best_iteration_}")

특성 중요도

from pycaret.classification import *
from pycaret.datasets import get_data
import pandas as pd

data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

cat = create_model('catboost', verbose=False)

# 032 시각화
plot_model(cat, plot='feature')

# 032 상세 중요도
feature_names = get_config('X_train').columns
importances = cat.feature_importances_

importance_df = pd.DataFrame({
'feature': feature_names,
'importance': importances
}).sort_values('importance', ascending=False)

print(importance_df)

튜닝

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

# 032 기본 모델
cat = create_model('catboost', verbose=False)

# 032 자동 튜닝
tuned_cat = tune_model(cat, optimize='AUC')

# 032 커스텀 그리드
custom_grid = {
'iterations': [500, 1000],
'depth': [4, 6, 8],
'learning_rate': [0.01, 0.03, 0.1],
'l2_leaf_reg': [1, 3, 5, 7],
'bagging_temperature': [0, 1]
}

tuned_cat = tune_model(cat, custom_grid=custom_grid, optimize='AUC')

GPU 학습

# 032 GPU 사용
cat_gpu = create_model(
'catboost',
task_type='GPU',
devices='0' # GPU ID
)

불균형 데이터

from pycaret.classification import *
from pycaret.datasets import get_data

data = get_data('credit')
clf = setup(data, target='default', session_id=42, verbose=False)

# 032 auto_class_weights
cat = create_model('catboost', auto_class_weights='Balanced', verbose=False)

# 032 또는 수동 설정
# 032 class_weights = {0: 1, 1: 3}
# 032 cat = create_model('catboost', class_weights=class_weights)

SHAP 해석

from pycaret.classification import *
from pycaret.datasets import get_data
import shap

data = get_data('diabetes')
clf = setup(data, target='Class variable', session_id=42, verbose=False)

cat = create_model('catboost', verbose=False)

# 032 CatBoost 내장 SHAP
X_test = get_config('X_test')
shap_values = cat.get_feature_importance(
type='ShapValues',
data=get_config('X_test')
)

# 032 Summary plot
import matplotlib.pyplot as plt
shap.summary_plot(shap_values[:, :-1], X_test)

CatBoost vs XGBoost vs LightGBM

항목CatBoostXGBoostLightGBM
범주형 처리최고 (자동)인코딩 필요지원
기본 성능높음보통보통
튜닝 민감도낮음높음중간
학습 속도보통빠름가장 빠름
GPU 최적화최적화됨좋음좋음
과적합 방지Ordered Boosting정규화정규화

장단점

장점:

  • 범주형 변수 자동 처리 (최고 수준)
  • 기본값으로 좋은 성능
  • Ordered Boosting으로 과적합 방지
  • 튜닝에 덜 민감
  • 안정적인 결과

단점:

  • 학습 속도가 LightGBM보다 느림
  • 메모리 사용량이 높을 수 있음
  • 파라미터 이름이 다름

언제 사용하나?

# 1. 범주형 변수가 많은 데이터
# 032 CatBoost가 인코딩 없이 최적 처리

# 2. 빠른 프로토타이핑
# 032 기본값으로도 좋은 성능

# 3. 튜닝 시간이 부족할 때
# 032 튜닝에 덜 민감

# 4. 과적합이 걱정될 때
# 032 Ordered Boosting으로 자연스러운 정규화

정리

  • CatBoost는 범주형 변수 처리에 특화
  • Ordered Boosting으로 데이터 누수 방지
  • 기본 파라미터로도 좋은 성능 (튜닝 민감도 낮음)
  • 범주형이 많으면 CatBoost 우선 고려
  • GPU 학습 최적화가 잘 되어 있음

다음 글 예고

다음 글에서는 SVM 분류 상세를 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #032