← 모델 목록
수업 실습 2026-08-26 · tabular-classification
트리 계열 (결정 트리)

DecisionTreeClassifier (scikit-learn)

결정 트리 고객 이탈 분류 (분류 모델 3종 과제)
모델
피처 조건으로 데이터를 나눠 가며 분류하는 단일 트리 모델. 여기서는 max_depth 4로 깊이를 제한
사용 목적
같은 고객 이탈 데이터에 결정 트리·랜덤 포레스트·CatBoost를 각각 학습해 지표를 비교하는 과제의 첫 번째 모델로 사용
코드
mnmms/mldl
가중치
없음
f119.4%
accuracy68.8%
recall13.6%
학습 시간없음
추론 CPU / GPU측정 안 함

데이터

  • 수업 제공 1,200명 · 이탈 332 (27.7%)
  • 원-핫 인코딩 후 82개 피처
  • train 960 · test 240 (stratify, seed 42)

학습

  • max_depth 4 · seed 42
  • CPU · scikit-learn 1.9.0
  • 학습 시간 [미확인]

결과

  • accuracy 0.6875 · F1 0.194
  • 이탈 재현율 0.14 (66명 중 9명)
  • ROC-AUC 0.516 (0/1 예측값 기준)

배운 점

  • accuracy만 보면 괜찮아 보여도 이탈 고객을 거의 못 찾음
  • 불균형 데이터는 혼동행렬부터 확인
개요용도 의도한 용도: 분류 모델 3종(결정 트리 / 배깅 / 부스팅)을 같은 데이터로 비교하고 accuracy·precision…

용도

  • 의도한 용도: 분류 모델 3종(결정 트리 / 배깅 / 부스팅)을 같은 데이터로 비교하고 accuracy·precision·recall·F1·ROC-AUC를 해석하는 과제
  • 대상 사용자: 해당 없음 (학습용)
  • 의도하지 않은 용도: 실제 고객 이탈 예측 (이탈 재현율 0.14)

모델 정보

항목 값
베이스 모델 직접 구현 (처음부터 학습)
크기 · 변형 DecisionTreeClassifier(max_depth=4, random_state=42)
리비전 scikit-learn 1.9.0 (uv.lock 기준)
아키텍처 깊이 4 이하의 이진 결정 트리 (지니 불순도, 기본값)
학습 방식 처음부터 학습 (지도학습)
프롬프트 · 에이전트 구성 해당 없음
데이터확보 방식 공개 데이터셋 그대로 (수업 제공) 출처 수업 자료 data/customer_churn_classification_…
항목 값
확보 방식 공개 데이터셋 그대로 (수업 제공)
출처 수업 자료 data/customer_churn_classification_dataset.xlsx (같은 폴더에 customer_churn_model_report.docx 보고서)
직접 수집 내용 해당 없음
이용 조건 확인 해당 없음 (수업 자료)
규모 1,200명 × 15열 (ID, 나이, 성별, 지역, 가입 기간, 월 요금, 계약 유형, 결제 수단, 상담 횟수, 연체 횟수, 월 사용 시간, 만족도, 자동이체, 프리미엄 요금제, 이탈 여부)
분할 train 960 / test 240 (8:2, stratify, 시드 42)
레이블·클래스 분포 잔류(0) 868 (72.3%) / 이탈(1) 332 (27.7%). test는 잔류 174 / 이탈 66
전처리 Age, Gender, Region, ContractType, PaymentMethod, AutoPay, PremiumPlan을 OneHotEncoder로 변환(76열) 후 나머지 숫자 열과 합쳐 82열. CustomerID 제거. 스케일링 없음
개인정보·민감정보 처리 해당 없음 (가상의 고객 데이터)
  • [🚩AI 설명] 숫자인 Age까지 원-핫 인코딩되어 나이 하나가 수십 개 열로 나뉘었습니다(Age_20, Age_21 …). 같은 과제의 다른 두 모델도 같은 입력을 씁니다.
학습하이퍼파라미터 max_depth=4 , 그 외 기본값 에폭 / 스텝 해당 없음 학습 시간 [미확인] (노트북에 시간 측정이 없…
항목 값
하이퍼파라미터 max_depth=4, 그 외 기본값
에폭 / 스텝 해당 없음
학습 시간 [미확인] (노트북에 시간 측정이 없음)
하드웨어 CPU (scikit-learn). 장비 이름 [미확인]
프레임워크 scikit-learn 1.9.0, pandas 3.0.5
시드 · 재현 방법 train_test_split(test_size=0.2, stratify=y, random_state=42), 모델 random_state=42
결과test 240명 기준, 노트북 출력입니다. accuracy 0.6875 test 240 랜덤 포레스트 0.725, CatBo…

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

지표 값 테스트셋 비교 대상 (baseline 등)
accuracy 0.6875 test 240 랜덤 포레스트 0.725, CatBoost 0.683
precision (이탈) 0.333 test 240
recall (이탈) 0.136 test 240
F1 (이탈) 0.194 test 240 랜덤 포레스트 0.0, CatBoost 0.191
ROC-AUC 0.516 test 240 predict()의 0/1 값으로 계산

혼동행렬 (행: 실제, 열: 예측): [[156, 18], [57, 9]]

  • [🚩AI 설명] ROC-AUC를 확률(predict_proba)이 아니라 0/1 예측값으로 계산해서, 원래 의미의 AUC보다 낮게 나옵니다.

추론 성능 (CPU / GPU)

측정 안 함.

장비 장비 이름 배치 크기 지연 시간 (샘플당, p50 / p95) 처리량 (샘플/초) 메모리 사용
CPU [미확인] - 측정 안 함 측정 안 함 측정 안 함
GPU 해당 없음 (scikit-learn은 CPU 전용) - - - -
한계 · 배운 점한계 알려진 실패 유형: 이탈 고객 66명 중 9명만 찾음 (recall 0.14) 편향 / 공정성 이슈: 해당 없음 (가상 …

한계

  • 알려진 실패 유형: 이탈 고객 66명 중 9명만 찾음 (recall 0.14)
  • 편향 / 공정성 이슈: 해당 없음 (가상 데이터)
  • 성능이 떨어지는 입력 조건: 소수 클래스(이탈). class_weight를 쓰지 않음

배운 점

  • 이 데이터의 support는 174 / 66으로 불균형이라 accuracy만으로 판단하면 안 됨 (노트북 주석)
  • F1을 "성능 측정 ⭐"으로 표시하고 지표마다 의미를 주석으로 정리함
  • [🚩AI 설명] 같은 이탈 문제를 다룬 미니대회(2026-08-30)에서는 이 경험을 바탕으로 class_weight='balanced'를 먼저 넣고 시작함 → 미니대회 결정 트리
사용 방법코드 셀 4개
In [1]데이터 불러오기·원-핫 인코딩
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder

data_df = pd.read_excel('./data/customer_churn_classification_dataset.xlsx')

encoder = OneHotEncoder(handle_unknown='ignore', sparse_output=False)
X_encoded = encoder.fit_transform(data_df[["Age", "Gender", "Region", "ContractType", "PaymentMethod", "AutoPay", "PremiumPlan"]])
y = data_df["Churn"]

X_encoded_cols = encoder.get_feature_names_out(["Age", "Gender", "Region", "ContractType", "PaymentMethod", "AutoPay", "PremiumPlan"])
encoded_df = pd.DataFrame(data=X_encoded, columns=X_encoded_cols)

data_df = data_df.drop(columns=["CustomerID", "Age", "Gender", "Region", "ContractType", "PaymentMethod", "AutoPay", "PremiumPlan", "Churn"])
df = pd.concat([data_df, encoded_df], axis=1)
In [2]학습·평가 데이터 나누기
X_train, X_test, y_train, y_test = train_test_split(df, y, test_size=0.2, stratify=y, random_state=42)
print(X_train.shape, X_test.shape)
Out[2] 출력 보기
(960, 82) (240, 82)
In [3]모델 학습하기
from sklearn.tree import DecisionTreeClassifier

data_dt = DecisionTreeClassifier(max_depth=4, random_state=42)
data_dt.fit(X_train, y_train)
In [4]지표 확인하기
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix

dt_pred = data_dt.predict(X_test)
print(confusion_matrix(y_test, dt_pred))
print('Accuracy : ', accuracy_score(y_test, dt_pred))
print('Precision : ', precision_score(y_test, dt_pred))
print('Recall : ', recall_score(y_test, dt_pred))
print('F1 Score : ', f1_score(y_test, dt_pred))
print('ROC-AUC : ', roc_auc_score(y_test, dt_pred))
Out[4] 출력 보기
[[156  18]
 [ 57   9]]
Accuracy :  0.6875
Precision :  0.3333333333333333
Recall :  0.13636363636363635
F1 Score :  0.1935483870967742
ROC-AUC :  0.5164576802507836

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

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