← 모델 목록
수업 실습 2026-08-26 · tabular-classification
그래디언트 부스팅 계열 (CatBoost)

CatBoostClassifier (catboost)

CatBoost 고객 이탈 분류 (분류 모델 3종 과제 · 문제풀이)
모델
이전 트리의 오차를 다음 트리가 보정해 가는 부스팅 모델. 범주형 피처를 원-핫 없이 직접 다룰 수 있음
사용 목적
고객 이탈 분류 과제에서 부스팅 방식을 비교하고, 문제풀이에서 범주형 직접 입력과 임계값 조정으로 이탈 탐지가 얼마나 나아지는지 확인하려고 사용
코드
mnmms/mldl
가중치
없음
f144.0%
accuracy65.0%
recall50.0%
실험2회 · 대표 r2
학습 시간없음
추론 CPU / GPU측정 안 함

데이터

  • 수업 제공 1,200명 · 이탈 332 (27.7%)
  • train 960 · test 240 (stratify, seed 42)

학습

  • iterations 300 · lr 0.05 · depth 6
  • CPU · catboost 1.2.10
  • 학습 시간 [미확인]

결과

  • 원-핫 입력 F1 0.191 → 범주형 직접 + 임계값 0.3 F1 0.44
  • 이탈 재현율 0.14 → 0.50

배운 점

  • 원-핫으로 넣으면 CatBoost 장점이 사라짐
  • 임계값을 0.5에서 0.3으로 낮춰 재현율을 올림
개요용도 의도한 용도: 부스팅 모델을 결정 트리·배깅과 비교하고, 범주형 처리 방식과 임계값이 지표에 주는 영향 확인 대상 사용자…

용도

  • 의도한 용도: 부스팅 모델을 결정 트리·배깅과 비교하고, 범주형 처리 방식과 임계값이 지표에 주는 영향 확인
  • 대상 사용자: 해당 없음 (학습용)
  • 의도하지 않은 용도: 실제 고객 이탈 예측

모델 정보

항목 값
베이스 모델 직접 구현 (처음부터 학습)
크기 · 변형 CatBoostClassifier(iterations=300, learning_rate=0.05, depth=6, loss_function='Logloss', random_state=42)
리비전 catboost 1.2.10 (uv.lock 기준)
아키텍처 깊이 6 대칭(oblivious) 트리 300개를 순서대로 더하는 그래디언트 부스팅
학습 방식 처음부터 학습 (지도학습)
프롬프트 · 에이전트 구성 해당 없음
데이터확보 방식 공개 데이터셋 그대로 (수업 제공) 출처 수업 자료 data/customer_churn_classification_…
항목 값
확보 방식 공개 데이터셋 그대로 (수업 제공)
출처 수업 자료 data/customer_churn_classification_dataset.xlsx
직접 수집 내용 해당 없음
이용 조건 확인 해당 없음 (수업 자료)
규모 1,200명 × 15열
분할 train 960 / test 240 (8:2, stratify, 시드 42). r1·r2 같은 분할
레이블·클래스 분포 잔류(0) 868 (72.3%) / 이탈(1) 332 (27.7%). test는 잔류 174 / 이탈 66
전처리 r1: 범주형 7열(나이 포함) 원-핫 인코딩 → 82열. r2: CustomerID, Churn만 빼고 원본 그대로, 문자열 6열(Gender, Region, ContractType, PaymentMethod, AutoPay, PremiumPlan)을 cat_features로 지정
개인정보·민감정보 처리 해당 없음 (가상의 고객 데이터)
학습하이퍼파라미터 iterations=300 , learning_rate=0.05 , depth=6 , loss_function=…
항목 값
하이퍼파라미터 iterations=300, learning_rate=0.05, depth=6, loss_function='Logloss' (r1·r2 같음)
에폭 / 스텝 부스팅 300회
학습 시간 [미확인] (노트북에 시간 측정이 없음)
하드웨어 CPU (기본 설정). 장비 이름 [미확인]
프레임워크 catboost 1.2.10, scikit-learn 1.9.0, pandas 3.0.5
시드 · 재현 방법 train_test_split(test_size=0.2, random_state=42, stratify=y), 모델 random_state=42
결과임계값 0.3 혼동행렬 (문제풀이) test 240명 기준, 노트북 출력입니다. accuracy 0.683 0.65 test …
임계값 0.3 혼동행렬 (문제풀이)
임계값 0.3 혼동행렬 (문제풀이)

test 240명 기준, 노트북 출력입니다.

지표 r1 (원-핫, 임계값 0.5) r2 (범주형 직접, 임계값 0.3) 테스트셋
accuracy 0.683 0.65 test 240
precision (이탈) 0.321 0.393 test 240
recall (이탈) 0.136 0.50 test 240
F1 (이탈) 0.191 0.44 test 240
ROC-AUC 0.514 0.603 0/1 예측값으로 계산
  • 혼동행렬 r1: [[155, 19], [57, 9]] / r2: [[123, 51], [33, 33]]
  • r2에서 임계값을 바꾸기 전(0.5) accuracy는 0.721 (노트북 출력). 이때의 F1은 계산하지 않음 [미확인]
  • [🚩AI 설명] r2는 범주형 처리와 임계값 두 가지를 동시에 바꿔서, 둘 중 어느 쪽이 F1을 올렸는지는 이 기록만으로 나눌 수 없습니다.

추론 성능 (CPU / GPU)

측정 안 함.

장비 장비 이름 배치 크기 지연 시간 (샘플당, p50 / p95) 처리량 (샘플/초) 메모리 사용
CPU [미확인] - 측정 안 함 측정 안 함 측정 안 함
GPU 해당 없음 (GPU 설정 안 함) - - - -
실험 기록2회 측정 · 대표 r2

같은 모델을 설정·분류기를 바꿔 2번 측정한 기록입니다. ★ r2이(가) 대표 결과(맨 위 수치)입니다.

직전 실행에서 바뀐 설정지표 최고값
실행날짜바뀐 점inputcat_featuresthresholditerationslearning_ratedepthf1accuracyrecallroc_auc학습 시간
r1
과제 (원-핫 입력)
2026-08-26기준: 원-핫 인코딩한 82열 입력, 임계값 0.5 (predict 기본값)
wd_day2-분류 배깅과 부스팅_student.ipynb (과제 셀)
onehotnone0.53000.05619.1%68.3%13.6%51.4%-
★ r2
문제풀이 (범주형 직접 + 임계값 0.3)
2026-08-26원-핫 대신 원본 범주형 6열을 cat_features로 직접 입력 (나이는 숫자 그대로), 예측 확률 임계값 0.5 → 0.3
wd_day2_문제풀이.ipynb
raw60.33000.05644.0%65.0%50.0%60.3%-
f1 변화 실행 순서대로 · 높을수록 좋음
r1 · 과제 (원-핫 입력)
19.1%
r2 · 문제풀이 (범주형 직접 + 임계값 0.3)
44.0%

r2 · 문제풀이 (범주형 직접 + 임계값 0.3) 원-핫 대신 원본 범주형 6열을 cat_features로 직접 입력 (나이는 숫자 그대로), 예측 확률 임계값 0.5 → 0.3

r2 · confusion-matrix-threshold-0.3
r2 · confusion-matrix-threshold-0.3
한계 · 배운 점한계 알려진 실패 유형: 임계값을 낮춘 r2도 잔류 고객 51명을 이탈로 잘못 예측 (precision 0.39) 편향 / 공…

한계

  • 알려진 실패 유형: 임계값을 낮춘 r2도 잔류 고객 51명을 이탈로 잘못 예측 (precision 0.39)
  • 편향 / 공정성 이슈: 해당 없음 (가상 데이터)
  • 성능이 떨어지는 입력 조건: 원-핫으로 펼친 입력 (r1)

배운 점

  • 노트북 주석: "원핫 인코딩한 데이터를 캣부스트 모델에 넣었지만 이렇게 하면 캣부스트의 장점을 발휘하지 못함"
  • 노트북 주석: 임계값은 처음부터 정하지 못하고 결과를 보며 조금씩 조절함 ("⭐ 임계값 중요")
  • 같은 과제 3종 중 r2가 F1 최고 (결정 트리 0.194, 랜덤 포레스트 0.0)
사용 방법코드 셀 4개
In [1]데이터 불러오기·나누기
import pandas as pd
from sklearn.model_selection import train_test_split
from catboost import CatBoostClassifier

df = pd.read_excel('./data/customer_churn_classification_dataset.xlsx')
X = df.drop(columns=["CustomerID", "Churn"])
y = df["Churn"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)

categorical_cols = X.select_dtypes(include=['object', 'category']).columns.tolist()
categorical_cols
Out[1] 출력 보기
['Gender', 'Region', 'ContractType', 'PaymentMethod', 'AutoPay', 'PremiumPlan']
In [2]범주형을 직접 넣어 학습하기
cat_model = CatBoostClassifier(
    iterations=300,
    learning_rate=0.05,
    depth=6,
    loss_function='Logloss',
    random_state=42,
    verbose=0
)
cat_model.fit(X_train, y_train, cat_features=categorical_cols)
In [3]임계값 0.3으로 예측하기
pred_cat = cat_model.predict_proba(X_test)[:, 1]
threshold = 0.3
pred = (pred_cat >= threshold).astype(int)
In [4]지표 확인하기
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix

print(confusion_matrix(y_test, pred))
print('Accuracy : ', accuracy_score(y_test, pred))
print('Precision : ', precision_score(y_test, pred))
print('Recall : ', recall_score(y_test, pred))
print('F1 Score : ', f1_score(y_test, pred))
print('ROC-AUC : ', roc_auc_score(y_test, pred))
Out[4] 출력 보기
[[123  51]
 [ 33  33]]
Accuracy :  0.65
Precision :  0.39285714285714285
Recall :  0.5
F1 Score :  0.44
ROC-AUC :  0.603448275862069

같은 과제·데이터셋 비교 tabular-classification · 수업 자료: customer_churn_classification_dataset.xlsx · 3개

굵은 이름이 이 모델입니다. 주황 테두리가 그룹 안 최고값입니다.