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
| 항목 | CatBoost | XGBoost | LightGBM |
|---|---|---|---|
| 범주형 처리 | 최고 (자동) | 인코딩 필요 | 지원 |
| 기본 성능 | 높음 | 보통 | 보통 |
| 튜닝 민감도 | 낮음 | 높음 | 중간 |
| 학습 속도 | 보통 | 빠름 | 가장 빠름 |
| 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