← 모델 목록
수업 실습 2026-08-26 · tabular-classification
트리 앙상블 계열 (랜덤 포레스트, 배깅)

RandomForestClassifier (scikit-learn)

랜덤 포레스트 고객 이탈 분류 (분류 모델 3종 과제)
모델
부트스트랩 샘플로 만든 결정 트리 여러 개의 투표로 분류하는 배깅 앙상블. 여기서는 트리 100개, max_depth 4
사용 목적
고객 이탈 분류 과제에서 배깅 방식이 단일 결정 트리보다 나은지 비교하려고 사용
코드
mnmms/mldl
가중치
없음
f10.0%
accuracy72.5%
recall0.0%
학습 시간없음
추론 CPU / GPU측정 안 함

데이터

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

학습

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

결과

  • accuracy 0.725 (3종 중 최고)
  • 이탈을 한 명도 예측 못 함 · F1 0.0
  • 혼동행렬 [[174, 0], [66, 0]]

배운 점

  • accuracy 최고 = 다수 클래스만 찍은 결과
  • support 174 / 66 불균형 확인
개요용도 의도한 용도: 배깅 앙상블을 결정 트리·부스팅과 같은 데이터로 비교하는 과제 대상 사용자: 해당 없음 (학습용) 의도하지…

용도

  • 의도한 용도: 배깅 앙상블을 결정 트리·부스팅과 같은 데이터로 비교하는 과제
  • 대상 사용자: 해당 없음 (학습용)
  • 의도하지 않은 용도: 실제 고객 이탈 예측 (이탈을 한 명도 찾지 못함)

모델 정보

항목 값
베이스 모델 직접 구현 (처음부터 학습)
크기 · 변형 RandomForestClassifier(n_estimators=100, max_depth=4, random_state=42)
리비전 scikit-learn 1.9.0 (uv.lock 기준)
아키텍처 깊이 4 이하 결정 트리 100개의 다수결
학습 방식 처음부터 학습 (지도학습)
프롬프트 · 에이전트 구성 해당 없음
데이터결정 트리 카드 와 같은 데이터·분할·전처리입니다. 확보 방식 공개 데이터셋 그대로 (수업 제공) 출처 수업 자료 data/c…

결정 트리 카드와 같은 데이터·분할·전처리입니다.

항목 값
확보 방식 공개 데이터셋 그대로 (수업 제공)
출처 수업 자료 data/customer_churn_classification_dataset.xlsx
직접 수집 내용 해당 없음
이용 조건 확인 해당 없음 (수업 자료)
규모 1,200명 × 15열
분할 train 960 / test 240 (8:2, stratify, 시드 42)
레이블·클래스 분포 잔류(0) 868 (72.3%) / 이탈(1) 332 (27.7%). test는 잔류 174 / 이탈 66
전처리 범주형 7열(나이 포함) 원-핫 인코딩 + 숫자 열 = 82열. 스케일링 없음
개인정보·민감정보 처리 해당 없음 (가상의 고객 데이터)
학습하이퍼파라미터 n_estimators=100 , max_depth=4 , 그 외 기본값 ( class_weight 없음) 에폭…
항목 값
하이퍼파라미터 n_estimators=100, max_depth=4, 그 외 기본값 (class_weight 없음)
에폭 / 스텝 해당 없음
학습 시간 [미확인] (노트북에 시간 측정이 없음)
하드웨어 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.725 test 240 결정 트리 0.6875, CatBoos…

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

지표 값 테스트셋 비교 대상 (baseline 등)
accuracy 0.725 test 240 결정 트리 0.6875, CatBoost 0.683
precision (이탈) 0.0 test 240 예측된 이탈이 없어 0으로 처리됨 (UndefinedMetricWarning)
recall (이탈) 0.0 test 240
F1 (이탈) 0.0 test 240 결정 트리 0.194, CatBoost 0.191
ROC-AUC 0.5 test 240 predict()의 0/1 값으로 계산

혼동행렬 (행: 실제, 열: 예측): [[174, 0], [66, 0]]

  • 노트북 주석: "support 값 차이로 알 수 있는 것 → 데이터의 불균형이 일어남 (각각 174, 66개임)"
  • [🚩AI 설명] accuracy 0.725는 test에서 잔류 고객 비율(174/240)과 같습니다. 모든 고객을 "잔류"로 예측한 결과입니다.

추론 성능 (CPU / GPU)

측정 안 함.

장비 장비 이름 배치 크기 지연 시간 (샘플당, p50 / p95) 처리량 (샘플/초) 메모리 사용
CPU [미확인] - 측정 안 함 측정 안 함 측정 안 함
GPU 해당 없음 (scikit-learn은 CPU 전용) - - - -
한계 · 배운 점한계 알려진 실패 유형: 소수 클래스(이탈)를 전혀 예측하지 못함 편향 / 공정성 이슈: 해당 없음 (가상 데이터) 성능이 떨…

한계

  • 알려진 실패 유형: 소수 클래스(이탈)를 전혀 예측하지 못함
  • 편향 / 공정성 이슈: 해당 없음 (가상 데이터)
  • 성능이 떨어지는 입력 조건: 불균형 데이터에서 class_weight 없이 학습할 때

배운 점

  • accuracy가 가장 높은 모델이 실제로는 가장 쓸모없을 수 있음 (F1 0.0)
  • 이 결과는 4일 뒤 미니대회 노트북 주석에 "예전에 RandomForest가 class_weight를 안 줘서 소수 클래스를 하나도 예측 안 했던 적"으로 다시 등장하고, 거기서는 class_weight='balanced'를 먼저 넣음 → 미니대회 랜덤 포레스트
사용 방법코드 셀 2개
In [1]모델 학습하기
from sklearn.ensemble import RandomForestClassifier

data_rf = RandomForestClassifier(
    n_estimators=100,
    max_depth=4,
    random_state=42
)
data_rf.fit(X_train, y_train)
In [2]지표 확인하기
rf_pred = data_rf.predict(X_test)
print(confusion_matrix(y_test, rf_pred))
print('Accuracy : ', accuracy_score(y_test, rf_pred))
print('F1 Score : ', f1_score(y_test, rf_pred))
print('ROC-AUC : ', roc_auc_score(y_test, rf_pred))
print(classification_report(y_test, rf_pred))
Out[2] 출력 보기
[[174   0]
 [ 66   0]]
Accuracy :  0.725
F1 Score :  0.0
ROC-AUC :  0.5
              precision    recall  f1-score   support

           0       0.72      1.00      0.84       174
           1       0.00      0.00      0.00        66

    accuracy                           0.72       240
   macro avg       0.36      0.50      0.42       240
weighted avg       0.53      0.72      0.61       240

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

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