이진 분류(Binary Classification) 모델은 머신러닝 분류 모델 중에서도 가장 기본이면서 실무에서도 자주 쓰이는 모델이다.
결과가 두 가지 중 하나인 문제.
예:
👉 이런 문제에서, 예측이 얼마나 잘 되었는지 평가하는 게 중요함
전체 데이터를 나누는 법 용어 정리 먼저..
| 용어 | 설명 |
|---|---|
| TP True Positive | 실제 Positive를 Positive라고 맞춘 경우 |
| FN False Negative | 실제 Positive를 Negative라고 틀리게 예측한 경우 |
| TN True Negative | 실제 Negative를 Negative라고 맞춘 경우 |
| FP False Positive | 실제 Negative를 Positive라고 틀리게 예측한 경우 |
| 실제 Positive | 실제 Negative | |
|---|---|---|
| 예측 Positive | TP (True Positive) | FP (False Positive) |
| 예측 Negative | FN (False Negative) | TN (True Negative) |
전체 중 맞춘 비율
accuracy = (TP + TN) / (TP + TN + FP + FN)
양성이라고 예측한 것 중 진짜 양성인 비율
precision = TP / (TP + FP)
실제 양성 중에 모델이 맞춘 비율 (TPR. True Positive Ratio)
recall = TP / (TP + FN)
실제 양성이 아닌데, 양성이라고 잘못 예측한 경우 (FPR. False Positive Ratio)
fallout = FP / (FP + TN)
정밀도와 재현율의 조화 평균
F1 = 2 * (precision * recall) / (precision + recall)
| 상황 | 중요한 지표 |
|---|---|
| 불균형 데이터 (암 환자 1%) | Precision, Recall, F1 |
| 실수하면 큰일남 (의료, 보안) | Recall |
| 틀리면 손해남 (광고 클릭 예측 등) | Precision |
| 전체 맞춘 비율만 필요 | Accuracy |
➡️ 이진 분류의 평가는 Accuracy만 보면 함정일 수 있다.
Precision, Recall, F1까지 같이 봐야 모델이 진짜 잘하고 있는지 알 수 있음
Threshold(임계값)란, 모델이 확률로 예측한 결과를 '클래스(0 or 1)'로 바꾸는 기준점
model.predict_proba(X)
predict_proba (probability)는 확률을 예측해서 알려줌 (1일 확률)
| 데이터 | 1일 확률 (Positive) | 최종 예측 |
|---|---|---|
| A | 0.9 | ✅ 1 |
| B | 0.4 | ❌ 0 |
| C | 0.6 | ✅ 1 ← 기본 기준이 0.5 |
👉 여기서 0.5가 바로 Threshold임
예: 암 진단을 한다고 할 때
| 확률 | 기본 Threshold (0.5) | 낮은 Threshold (0.3) |
|---|---|---|
| 0.4 | ❌ 0 (암 아님) | ✅ 1 (암 의심!) |
암인데도 0.4가 나오면 기본 Threshold 0.5에선 놓쳐버리는 일이 생김
→ 그럴 땐 Threshold를 0.3처럼 낮추면 더 민감하게 반응함
→ 즉, Recall을 높일 수 있다.
| 지표 | Threshold 낮출수록 | Threshold 높일수록 |
|---|---|---|
| Precision | 🔽 낮아짐 (헛짚는 경우 많아짐) | 🔼 높아짐 |
| Recall | 🔼 올라감 (많이 잡으려 함) | 🔽 줄어듦 |
| F1 Score | 균형에 따라 왔다갔다 |
👉 그래서 상황에 따라 "정확하게 골라야 하냐" vs "놓치면 안 되냐"를 고민하고 Threshold 조정하는 것
y_probs = model.predict_proba(X_test)[:, 1]
y_pred = (y_probs >= 0.3).astype(int) # Threshold 0.3로 변경
| 용어 | 뜻 |
|---|---|
| ROC | Receiver Operating Characteristic curve |
| AUC | Area Under the Curve (ROC 곡선 아래 면적) |
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))
➡️ 그래서
AUC는 ROC 곡선 아래 면적을 의미 (Area Under the Curve)
시각적으로 보면 (예시):

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_probs는 predict_proba()로 얻은 확률값
다음엔 실제 데이터로 실습해본걸 정리해보아야겠다. ㅎ