C.W.K.
Stream
Lesson 05 of 08 · published

Class Imbalance

~28 min · imbalance, metrics, sampling

Level 0Scout
0 XP0/48 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

accuracy 함정

1% user가 churn 하면, "아무도 churn 안 한다"고 예측하는 모델이 99% accurate에 0% 유용. class imbalance는 모델 문제가 아니야 — metric 문제야. PR-AUC나 cost-weighted score로 갈아타면 함정이 사라져.

정직한 세 응답

  • metric 바꾸기 — PR-AUC, F-beta, recall at fixed precision, expected cost.
  • threshold 바꾸기 — 모델은 그대로, cost matrix 존중하는 operating point 고르기.
  • sampling 바꾸기 — class weight, majority downsampling, tabular 소수 합성용 SMOTE.

하지 마

fold마다 resample 하는 CV pipeline 없이 naïve oversample 하지 마. train/val split 전에 SMOTE 쓰지 마. 교과서가 그랬다는 이유로 50/50 balance를 추구하지 마. 옳은 balance는 너가 진짜 신경 쓰는 metric을 최소화하는 그거야.

Code

SMOTE 가기 전에 class_weight='balanced' 부터·python
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import average_precision_score

model = LogisticRegression(class_weight="balanced", max_iter=1000).fit(X_tr, y_tr)
pr_auc = average_precision_score(y_val, model.predict_proba(X_val)[:, 1])
sklearn-imblearn pipeline 안의 SMOTE·python
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import Pipeline
from sklearn.ensemble import GradientBoostingClassifier

pipe = Pipeline([
    ("smote", SMOTE(random_state=7)),
    ("clf", GradientBoostingClassifier()),
])

External links

Exercise

class-imbalanced dataset에 모델 두 개 train: class_weight="balanced" 있는 거 하나, 없는 거 하나. PR-AUC, recall at precision 0.7, 선택한 operating point에서 false-positive count 비교. 어느 걸 ship 할지와 이유를 적어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 피파warm

댓글 4

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.
  1. young-hoon Kim
    young-hoon Kim

    "교과서가 그랬다는 이유로 50/50 balance를 추구하지 마. 옳은 balance는 너가 진짜 신경 쓰는 metric을 최소화하는 그거야." 클래스 불균형 공부하면서 배운 최고의 인사이트입니다. 무조건 소수 클래스를 샘플링 업하든가 ,smote, rose...사용하든가 아무 생각없이 자동으로 설정했어요.(자격증 공부때문에).

    💛 by 똘이warm💛 by 피파warm
    1. 피파
      피파· warmyoung-hoon Kimyoung-hoon Kim

      그 catch가 정확해요. 자격증 공부는 “불균형이면 자동으로 resampling” 쪽으로 손을 보내게 만들기 쉬운데, 실제 작업에선 먼저 metric과 비용표부터 정해야 해요. 특히 SMOTE류는 train/validation split 뒤, fold 안에서만 써야 해서 순서까지 같이 봐야 하고요.

    2. young-hoon Kim
      young-hoon Kim피파

      피파님이 " 특히 SMOTE류는 train/validation split 뒤, fold 안에서만 써야 해서 순서까지 같이 봐야 하고요." 이 부분이 data leakage 때문에 그런가요? 제 방식으로 얘기하면 샘플링업이나 smote는 데이터를 뻥튀기 한거잖아요.뻥튀기한 애들이 validation 에 들어가면 안되니깐 cross validation에서 이것을 순서를 정한다는 얘기인가요? 예를 들어서 음... cv=5이면 4개가 train, 1개가 valid 니깐 요놈의 valid 폴더에는 뻥튀기가 들어가서는 안된다. 대충 이런 뜻? 저도 다시 claude한테 물어볼께요.

      💛 by 피파warm💛 by 똘이warm
    3. 피파
      피파· warmyoung-hoon Kimyoung-hoon Kim

      네, 정확히 그 뜻이에요. CV=5라면 매 fold마다 먼저 4개 train fold 안에서만 SMOTE나 oversampling을 만들고, 남은 1개 validation fold는 원본 분포 그대로 평가해야 해요. 뻥튀기한 거의 쌍둥이 샘플이 validation에 들어가면 모델이 시험지를 미리 본 꼴이라 점수가 과하게 좋아져요.