본문 바로가기
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

정확도가 거짓말하기 쉬운 조건

고객의 1%만 해지한다면 모두 ‘해지 안 함’으로 답하는 모델도 정확도 99%를 얻어. 숫자는 높지만 한 명도 찾아내지 못하니 쓸모는 없어. 범주 불균형의 첫 문제는 모델 구조보다 평가 질문이 틀렸다는 데 있어. 드문 양성을 얼마나 찾고 그 대가로 거짓 경보를 몇 개 내는지 봐야 해. 양성 비율이 달라지면 같은 정밀도와 정확도의 의미도 달라지므로 운영 환경의 실제 비율로 평가해야 하고.

혼동행렬에서 비용을 읽어

참양성, 거짓양성, 참음성, 거짓음성의 개수를 실제 업무 행동으로 번역해. 해지 고객을 놓치면 얼마가 들고, 남을 고객에게 쿠폰을 주면 얼마가 드는지 적어야 지표를 고를 수 있어. 양성을 놓치는 비용이 크면 재현율을 더 중시하고, 사람 검토 자리가 적다면 정밀도를 일정 수준 이상으로 유지해야 하지. F-beta, 고정 정밀도에서의 재현율, 기대 비용처럼 목표에 맞는 지표가 여기서 나와.

PR 곡선이 드문 양성에 더 솔직해

ROC-AUC는 양성과 음성의 순위를 폭넓게 보여주지만 음성이 압도적으로 많을 때 거짓양성의 실제 부담이 희석될 수 있어. 정밀도-재현율 곡선과 PR-AUC는 찾아낸 양성 가운데 진짜가 얼마나 되는지 더 직접 보여줘. 그래도 곡선 아래 넓이 하나로 끝내지 말고 팀이 실제로 운영할 문턱에서 건수와 비용을 확인해야 해.

세 가지 조절 손잡이

  • 평가 지표: 정확도 대신 PR-AUC, F-beta, 고정 정밀도의 재현율, 기대 비용을 써.
  • 판단 문턱: 모델은 그대로 두고 비용표와 처리 능력에 맞는 확률 기준을 골라.
  • 학습 표본: 범주 가중치, 다수 범주 축소, SMOTE 같은 소수 범주 합성을 비교해.

재표본은 학습 안에서만 해

자료를 나누기 전에 소수 범주를 복제하거나 합성하면 원본과 닮은 행이 검증 쪽으로 새어 점수가 부풀어. 교차검증의 각 학습 폴드 안에서만 재표본하고 검증 폴드는 원래 비율로 남겨야 해. scikit-learn과 imbalanced-learn 파이프라인으로 순서를 묶으면 실수를 줄일 수 있어.

50 대 50은 목표가 아니야

균형 잡힌 학습 표본이 언제나 최선인 건 아니야. 과도한 복제는 과적합을 만들고 확률 보정을 흐릴 수 있어. 먼저 비용이 거의 없는 class_weight="balanced"를 기준선으로 두고, 재표본 방식이 같은 운영 지표에서 실제로 나은지 비교해. 마지막 확률은 실제 범주 비율의 검증 자료에서 다시 보정해야 해.

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])
scikit-learn·imbalanced-learn 파이프라인 안의 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_weight="balanced"를 쓴 모델과 쓰지 않은 모델을 학습해. PR-AUC, 정밀도 0.7에서의 재현율, 선택한 문턱의 거짓양성 건수와 기대 비용을 비교하고 어느 모델을 배포할지 적어.

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에 들어가면 모델이 시험지를 미리 본 꼴이라 점수가 과하게 좋아져요.