[Machine Learning] 이진 분류에서의 모델 평가

Yeong·2025년 4월 11일

이진 분류(Binary Classification) 모델의 평가

이진 분류(Binary Classification) 모델은 머신러닝 분류 모델 중에서도 가장 기본이면서 실무에서도 자주 쓰이는 모델이다.

이진 분류란?

결과가 두 가지 중 하나인 문제.

예:

  • 메일인가 스팸인가?
  • 이 환자가 암인가 아닌가?
  • 고객이 이탈할까 안 할까?

👉 이런 문제에서, 예측이 얼마나 잘 되었는지 평가하는 게 중요함


이진 분류의 평가 지표들

전체 데이터를 나누는 법 용어 정리 먼저..

용어설명
TP True Positive실제 Positive를 Positive라고 맞춘 경우
FN False Negative실제 Positive를 Negative라고 틀리게 예측한 경우
TN True Negative실제 Negative를 Negative라고 맞춘 경우
FP False Positive실제 Negative를 Positive라고 틀리게 예측한 경우

Confusion Matrix

실제 Positive실제 Negative
예측 PositiveTP (True Positive)FP (False Positive)
예측 NegativeFN (False Negative)TN (True Negative)

1. Accuracy (정확도)

전체 중 맞춘 비율

accuracy = (TP + TN) / (TP + TN + FP + FN)
  • 모든 클래스가 비슷한 비율일 때는 괜찮음
  • 하지만 불균형 데이터에서는 함정이 될 수 있음 (ex: 99% 정상, 1% 암)

2. Precision (정밀도)

양성이라고 예측한 것 중 진짜 양성인 비율

precision = TP / (TP + FP)
  • 예측이 얼마나 정확했냐
  • 예: 암이라 했는데 진짜 암이 맞았는지?

3. Recall (재현율 / 민감도)

실제 양성 중에 모델이 맞춘 비율 (TPR. True Positive Ratio)

recall = TP / (TP + FN)
  • 예: 암 환자 중 몇 명을 진짜로 잡아냈냐?
  • 놓치면 안 되는 경우에 중요! (의료, 보안 등)

4. Fall-Out

실제 양성이 아닌데, 양성이라고 잘못 예측한 경우 (FPR. False Positive Ratio)

fallout = FP / (FP + TN)

4. F1 Score

정밀도와 재현율의 조화 평균

F1 = 2 * (precision * recall) / (precision + recall)
  • Precision vs Recall 둘 중 하나만 높을 때 생기는 문제 보완
  • 어느 한쪽으로 치우치지 않고 둘다 높은 값을 가질 수록 높음
  • 둘 다 균형 있게 중요할 때 사용

언제 어떤 지표를 써야 할까?

상황중요한 지표
불균형 데이터 (암 환자 1%)Precision, Recall, F1
실수하면 큰일남 (의료, 보안)Recall
틀리면 손해남 (광고 클릭 예측 등)Precision
전체 맞춘 비율만 필요Accuracy

➡️ 이진 분류의 평가는 Accuracy만 보면 함정일 수 있다.
Precision, Recall, F1까지 같이 봐야 모델이 진짜 잘하고 있는지 알 수 있음


Threshold(임계값)

Threshold(임계값)란, 모델이 확률로 예측한 결과를 '클래스(0 or 1)'로 바꾸는 기준점

예시

model.predict_proba(X)

predict_proba (probability)는 확률을 예측해서 알려줌 (1일 확률)

데이터1일 확률 (Positive)최종 예측
A0.9✅ 1
B0.4❌ 0
C0.6✅ 1 ← 기본 기준이 0.5

👉 여기서 0.5가 바로 Threshold임

Threshold를 바꾸는 이유

예: 암 진단을 한다고 할 때

확률기본 Threshold (0.5)낮은 Threshold (0.3)
0.4❌ 0 (암 아님)✅ 1 (암 의심!)

암인데도 0.4가 나오면 기본 Threshold 0.5에선 놓쳐버리는 일이 생김
→ 그럴 땐 Threshold를 0.3처럼 낮추면 더 민감하게 반응함
→ 즉, Recall을 높일 수 있다.

Threshold 바꾸면 생기는 변화

지표Threshold 낮출수록Threshold 높일수록
Precision🔽 낮아짐 (헛짚는 경우 많아짐)🔼 높아짐
Recall🔼 올라감 (많이 잡으려 함)🔽 줄어듦
F1 Score균형에 따라 왔다갔다

👉 그래서 상황에 따라 "정확하게 골라야 하냐" vs "놓치면 안 되냐"를 고민하고 Threshold 조정하는 것

Scikit-learn에서 Threshold 바꾸는 법

y_probs = model.predict_proba(X_test)[:, 1]
y_pred = (y_probs >= 0.3).astype(int)  # Threshold 0.3로 변경

Threshold 요약

  • Threshold는 확률 예측을 0/1 같은 실제 분류로 바꿔주는 "기준선"
  • 낮추면 더 많이 잡고, 높이면 더 정확하게 고름

ROC(곡선) & AUC(면적)

ROC랑 AUC란?

용어
ROCReceiver Operating Characteristic curve
AUCArea Under the Curve (ROC 곡선 아래 면적)

ROC Curve란?

ROC Curve는, Threshold(임계값)를 바꿔가며 그때의 성능(FPR vs TPR)을 그린 그래프

축 설명:

  • x축 = FPR (False Positive Rate, = Fall-out)
    → 실제 양성이 아닌데, 양성이라고 잘못 예측한 경우 (FP / (FP + TN))

  • y축 = TPR (True Positive Rate, = Recall)
    → 실제 양성 중에 모델이 맞춘 비율 (TP / (TP + FN))

➡️ 그래서

  • 모델이 완벽하면: ROC 곡선이 좌상단으로 팍! 꺾임
  • 그냥 운빨이면: ROC 곡선이 대각선 직선 (랜덤 추측)

AUC란?

AUC는 ROC 곡선 아래 면적을 의미 (Area Under the Curve)

  • AUC = 1.0 → 완벽한 모델 😎
  • AUC = 0.5 → 그냥 동전 던지기랑 똑같음
  • AUC < 0.5 → 이건 모델이 일부러 반대로 예측하고 있다고 볼 수 있음..ㅋ

시각적으로 보면 (예시):

scikit-learn 실제 코드 예시

from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt

fpr, tpr, thresholds = roc_curve(y_true, y_probs)
auc_score = roc_auc_score(y_true, y_probs)

plt.plot(fpr, tpr, label=f'AUC = {auc_score:.2f}')
plt.plot([0, 1], [0, 1], 'k--')  # 랜덤 추측선
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate (Recall)')
plt.title('ROC Curve')
plt.legend()
plt.show()

*y_probspredict_proba()로 얻은 확률값

언제 ROC-AUC를 쓰는지?

  • 데이터 불균형이 있어도 꽤 안정적
  • 모델이 전체적으로 얼마나 잘 분류하냐를 한눈에 보기 좋음
  • 다양한 Threshold에 따른 성능을 전반적으로 보고 싶을 때

ROC & AUC 요약

  • ROC는 Threshold를 바꿔가며 그리는 성능 그래프,
  • AUC는 그 ROC 곡선 아래 넓이로 "모델 전체 실력"을 보여주는 수치





다음엔 실제 데이터로 실습해본걸 정리해보아야겠다. ㅎ

profile
데이터 엔지니어 도전기 / 스터디 노트

0개의 댓글