본문 바로가기
C.W.K.
Stream
Lesson 05 of 06 · published

클래스 불균형 다루기

~8 min · data

Level 0Keras 도제
0 XP0/97 lessons0/20 achievements
0/120 XP to next level120 XP to go0% complete

불균형한 자료에서 정확도가 속이는 이유

한 클래스가 압도적으로 많다고 해 보자. 음성이 95%, 양성이 5%라면 모델은 언제나 음성이라고 답하는 쓸모없는 전략으로도 정확도 95%를 얻어. 드문 클래스의 표본이 그래디언트에 거의 기여하지 못하므로 손실도 그 실수를 충분히 벌하지 않아. 사기, 질병, 결함 탐지에서 흔한 함정이야. 그래서 불균형 자료에서는 정확도만 믿을 수 없어. 소수 클래스의 정밀도와 재현율을 함께 봐야 실제 성능이 보여.

비용이 낮은 방법부터 적용해

(1) class_weight는 fit()에 딕셔너리로 전달해 클래스별 손실 기여도를 조절하고, 드문 클래스의 실수에 더 큰 비용을 줘. 한 줄로 적용할 수 있으니 먼저 시도해. (2) sample_weight는 클래스 단위보다 세밀한 조절이 필요할 때 표본별 가중치를 제공해. (3) 재표집은 소수 클래스를 복제하거나 SMOTE로 합성해 늘리고, 다수 클래스를 줄이는 방식이야. fit()이 자료를 보기 전에 파이프라인에서 수행해.

추론 단계에서는 판정 문턱도 조절할 수 있어

가중치를 적용한 뒤에도 판정 문턱을 조정할 수 있어. 이진 분류기는 보통 0.5를 넘으면 양성으로 판단하지만, 불균형 자료에서 문턱을 0.3으로 낮추면 정밀도를 일부 내주는 대신 재현율을 높일 수 있어. 질병을 놓치는 비용이 잘못된 경보보다 훨씬 클 때 유용하지. 문턱 조정은 학습 뒤에 적용할 수 있으므로 학습 단계의 방법과 함께 쓰기 좋아. 실제 문제는 한 가지 방법보다 둘 이상을 조합해 해결하는 경우가 많아.

Code

불균형에 대응하는 가중치와 재표집 세 방법·python
# 1. class_weight in model.fit()
model.fit(x, y, class_weight={0: 1.0, 1: 10.0})

# 2. sample_weight array (per-sample importance)
weights = np.where(y_train == 1, 10.0, 1.0)
model.fit(x, y, sample_weight=weights)

# 3. Oversample minority class in the pipeline
# (duplicate minority samples or use SMOTE)

External links

Exercise

MNIST를 한 클래스 90%, 나머지 10%가 되도록 인위적으로 불균형하게 만들어. class_weight를 적용하지 않은 모델과 적용한 모델을 학습하고, 소수 클래스의 정밀도와 재현율을 비교해 가중치가 두 값의 절충을 어떻게 바꾸는지 설명해.

Progress

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

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.