본문으로 건너뛰기

037 분류 알고리즘 선택 가이드

키워드: 알고리즘 선택, 가이드

개요

분류 문제에서 어떤 알고리즘을 선택해야 할까요? 이 글에서는 데이터 특성, 비즈니스 요구사항에 따른 알고리즘 선택 가이드를 제공합니다.

실습 환경

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

알고리즘 선택 의사결정 트리

데이터 크기?
├── 작음 (< 1만)
│ ├── 해석 필요? → 로지스틱, 결정 트리
│ └── 성능 중시? → SVM (RBF), KNN

└── 큼 (> 1만)
├── 범주형 많음? → CatBoost
├── 빠른 학습? → LightGBM
├── 안정성? → 랜덤 포레스트
└── 최고 성능? → XGBoost, LightGBM

알고리즘 특성 비교표

알고리즘속도해석력비선형대용량튜닝기본 성능
Logistic⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Decision Tree⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Random Forest⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
XGBoost⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
LightGBM⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
CatBoost⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
SVM⭐⭐⭐⭐⭐⭐⭐⭐
KNN⭐⭐⭐⭐⭐⭐⭐⭐
Naive Bayes⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
MLP⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

상황별 추천

1. 빠른 프로토타이핑

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

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

# 037 추천: compare_models()로 시작
best = compare_models(n_select=3)

# 037 상위 3개를 기준으로 추가 실험

2. 해석이 필수인 경우 (의료, 금융, 법률)

# 1순위: 로지스틱 회귀
lr = create_model('lr')
# 037 계수와 오즈비로 해석 가능

# 2순위: 결정 트리
dt = create_model('dt', max_depth=5)
# 037 규칙으로 설명 가능

# 3순위: 랜덤 포레스트 + SHAP
rf = create_model('rf')
interpret_model(rf)
# 037 특성 중요도와 SHAP으로 해석

3. 대용량 데이터 (100만+ 행)

# 1순위: LightGBM (가장 빠름)
lgb = create_model('lightgbm')

# 2순위: XGBoost
xgb = create_model('xgboost')

# 037 피해야 할 것: SVM, KNN (너무 느림)

4. 범주형 변수가 많은 경우

# 1순위: CatBoost (자동 처리)
cat = create_model('catboost')

# 2순위: LightGBM (범주형 지원)
lgb = create_model('lightgbm')

# 037 로지스틱, SVM 등은 인코딩 필요

5. 고차원 데이터 (특성 >> 샘플)

# 1순위: SVM (Linear)
svm = create_model('svm')

# 2순위: Naive Bayes
nb = create_model('nb')

# 3순위: 로지스틱 (L1 정규화)
lr = create_model('lr', penalty='l1', solver='saga')

6. 불균형 데이터

# 1순위: XGBoost/LightGBM + scale_pos_weight
xgb = create_model('xgboost', scale_pos_weight=3)

# 2순위: 랜덤 포레스트 + class_weight
rf = create_model('rf', class_weight='balanced')

# 037 반드시: AUC 또는 F1 기준으로 평가
best = compare_models(sort='AUC')

7. 실시간 예측 (낮은 지연)

# 1순위: 로지스틱 (가장 빠른 예측)
lr = create_model('lr')

# 2순위: Naive Bayes
nb = create_model('nb')

# 037 피해야 할 것: KNN (예측 시 전체 데이터 탐색)

실전 알고리즘 선택 워크플로우

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

# 1단계: 데이터 이해
data = get_data('credit')
print(f"샘플 수: {len(data)}")
print(f"특성 수: {data.shape[1] - 1}")
print(f"클래스 분포:\n{data['default'].value_counts(normalize=True)}")

# 2단계: 환경 설정
clf = setup(data, target='default', session_id=42, verbose=False)

# 3단계: 빠른 스크리닝 (느린 알고리즘 제외)
print("=== 빠른 스크리닝 ===")
fast_models = compare_models(
include=['lr', 'rf', 'xgboost', 'lightgbm', 'catboost'],
sort='AUC',
n_select=3
)

# 4단계: 상위 모델 상세 비교
print("\n=== 상위 모델 상세 ===")
for model in fast_models:
print(f"\n{type(model).__name__}:")
tuned = tune_model(model, optimize='AUC', verbose=False)
plot_model(tuned, plot='auc', save=True)

# 5단계: 앙상블 시도
print("\n=== 앙상블 ===")
blended = blend_models(fast_models)

기억해야 할 원칙

1. 항상 compare_models()로 시작

# 037 선입견 없이 모든 알고리즘 테스트
best = compare_models()

2. 단순한 모델부터

# 037 로지스틱 → 랜덤 포레스트 → XGBoost/LightGBM
# 037 복잡한 모델이 항상 좋은 건 아님

3. 비즈니스 맥락 고려

# 037 해석 필요? → 로지스틱, 결정 트리
# 037 속도 중요? → LightGBM
# 037 안정성? → 랜덤 포레스트
# 037 최고 성능? → XGBoost + 튜닝

4. 데이터에 맞는 전처리

# 037 SVM, KNN, MLP → 스케일링 필수
# 037 트리 기반 → 스케일링 불필요

정리

  • compare_models()로 빠르게 후보 선정
  • 데이터 크기, 특성 유형에 따라 알고리즘 선택
  • 해석력 vs 성능 트레이드오프 고려
  • 대용량에서는 LightGBM/XGBoost 우선
  • 범주형이 많으면 CatBoost 고려
  • 단순한 모델이 종종 충분함

다음 글 예고

다음 글에서는 분류 실전 - 고객 이탈 예측을 다룹니다.


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