03. Logistic Regression & 평가지표 완전정복
Sigmoid, Cross-Entropy, Confusion Matrix, ROC/PR Curve
학습 목표
이 튜토리얼을 완료하면 다음을 할 수 있습니다:
- Sigmoid 함수와 Log-Loss (Binary Cross-Entropy) 수식 이해
- 로지스틱 회귀의 원리와 Gradient Descent 학습 과정 이해
- Confusion Matrix의 TP, FP, TN, FN 완벽 이해
- Precision, Recall, F1-Score 계산 및 Trade-off 분석
- ROC Curve, AUC, PR Curve 해석 능력
- Decision Threshold 최적화를 통한 비즈니스 요구사항 충족
- 불균형 데이터 문제와
class_weight대응 방법 이해
핵심 개념
1. 로지스틱 회귀란?
이진 분류(Binary Classification) 문제를 해결하는 알고리즘입니다.
선형 조합을 Sigmoid 함수에 통과시켜 확률로 변환:
P(y=1|x) = σ(z) = 1 / (1 + e^(-z))여기서 z = wᵀx + b (선형 조합)
Sigmoid 함수 특성
| 특성 | 설명 |
|---|---|
| 출력 범위 | (0, 1) → 확률로 해석 가능 |
| 중심값 | σ(0) = 0.5 |
| 미분 | σ'(z) = σ(z)(1 - σ(z)) |
| 점근선 | z → ∞ 이면 σ(z) → 1, z → -∞ 이면 σ(z) → 0 |
Sigmoid 함수는 출력값이 항상 0과 1 사이이므로, 이를 확률로 해석할 수 있습니다. Threshold(기본값 0.5)를 기준으로 클래스를 결정합니다.
2. Log-Loss (Binary Cross-Entropy)
L(w) = -(1/n) Σ[yᵢlog(p̂ᵢ) + (1-yᵢ)log(1-p̂ᵢ)]손실 함수의 직관적 이해
| 실제 값 | 예측 확률 | 손실 | 해석 |
|---|---|---|---|
| y=1 | p=0.9 | 낮음 | 잘 예측 (좋음) |
| y=1 | p=0.1 | 높음 | 확신 있게 틀림 (큰 페널티) |
| y=0 | p=0.1 | 낮음 | 잘 예측 (좋음) |
| y=0 | p=0.9 | 높음 | 확신 있게 틀림 (큰 페널티) |
Log-Loss는 확신을 가지고 틀릴수록 손실이 기하급수적으로 증가합니다. 따라서 모델이 잘못된 예측에 높은 확률을 부여하지 않도록 학습됩니다.
3. Confusion Matrix 완전 이해
Predicted
Neg Pos
Actual Neg TN FP
Pos FN TP| 항목 | 의미 | 설명 |
|---|---|---|
| TN | True Negative | 실제 음성을 음성으로 정확히 예측 |
| FP | False Positive | 실제 음성을 양성으로 잘못 예측 (Type I Error) |
| FN | False Negative | 실제 양성을 음성으로 잘못 예측 (Type II Error) |
| TP | True Positive | 실제 양성을 양성으로 정확히 예측 |
의료 진단 예시 (유방암 데이터):
- FN (False Negative): 악성 종양을 양성으로 오진 → 치명적! 치료 기회를 놓침
- FP (False Positive): 양성 종양을 악성으로 오진 → 불필요한 추가 검사 필요
따라서 암 진단에서는 **Recall(민감도)**이 매우 중요합니다.
4. 평가 지표 정리
| 지표 | 공식 | 의미 |
|---|---|---|
| Accuracy | (TP+TN) / All | 전체 정확도 |
| Precision | TP / (TP+FP) | 양성 예측 중 실제 양성 비율 ("양성이라고 예측했을 때 맞을 확률") |
| Recall | TP / (TP+FN) | 실제 양성 중 양성 예측 비율 ("실제 양성을 놓치지 않을 확률") |
| F1-Score | 2PR / (P+R) | Precision과 Recall의 조화평균 |
| Specificity | TN / (TN+FP) | 실제 음성 중 음성 예측 비율 |
5. ROC Curve & AUC
- ROC Curve: TPR(True Positive Rate) vs FPR(False Positive Rate)를 모든 threshold에서 플롯
- AUC: ROC 곡선 아래 면적
| AUC 값 | 해석 |
|---|---|
| 1.0 | 완벽한 분류기 |
| 0.9-1.0 | 우수 |
| 0.8-0.9 | 양호 |
| 0.7-0.8 | 보통 |
| 0.5 | 랜덤 추측 수준 |
from sklearn.metrics import roc_curve, auc, roc_auc_score
fpr, tpr, thresholds = roc_curve(y_test, y_proba)
roc_auc = auc(fpr, tpr)ROC-AUC는 threshold에 독립적이므로 서로 다른 모델을 비교하는 데 적합합니다.
6. Precision-Recall Curve
- 불균형 데이터에서 ROC보다 유용
- AP (Average Precision): PR 곡선 아래 면적
from sklearn.metrics import precision_recall_curve, average_precision_score
precision, recall, thresholds = precision_recall_curve(y_test, y_proba)
ap = average_precision_score(y_test, y_proba)7. Precision-Recall Trade-off
Threshold를 조정하면 Precision과 Recall이 반비례 관계로 변화합니다:
| Threshold 변화 | 양성 예측 | Precision | Recall |
|---|---|---|---|
| ↑ (예: 0.5→0.7) | 조건 까다로움 | ↑ (FP 감소) | ↓ (FN 증가) |
| ↓ (예: 0.5→0.3) | 조건 느슨함 | ↓ (FP 증가) | ↑ (FN 감소) |
비즈니스 상황별 Threshold 선택
| 상황 | 중요 지표 | Threshold | 이유 |
|---|---|---|---|
| 암 진단 | Recall | 낮게 | FN 최소화 (암을 놓치면 안 됨) |
| 스팸 필터 | Precision | 높게 | FP 최소화 (정상 메일 보호) |
| 균형 | F1-Score | 최적점 | Precision/Recall 조화 |
# F1 최대화 threshold 찾기
f1_scores = 2 * (precision * recall) / (precision + recall + 1e-10)
best_idx = np.argmax(f1_scores)
best_threshold = thresholds[best_idx]코드 요약
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import (
accuracy_score, precision_score, recall_score, f1_score,
confusion_matrix, classification_report,
roc_auc_score, average_precision_score
)
# 학습
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
y_proba = model.predict_proba(X_test)[:, 1]
# 평가
print(f"Accuracy: {accuracy_score(y_test, y_pred):.4f}")
print(f"Precision: {precision_score(y_test, y_pred):.4f}")
print(f"Recall: {recall_score(y_test, y_pred):.4f}")
print(f"F1: {f1_score(y_test, y_pred):.4f}")
print(f"ROC-AUC: {roc_auc_score(y_test, y_proba):.4f}")
# 상세 리포트
print(classification_report(y_test, y_pred))불균형 데이터 처리
# class_weight 사용 (소수 클래스에 높은 가중치)
model = LogisticRegression(class_weight='balanced')
# 또는 직접 지정
model = LogisticRegression(class_weight={0: 1, 1: 10})class_weight='balanced'는 클래스 빈도의 역수로 가중치를 자동 계산합니다. 소수 클래스의 샘플에 더 큰 가중치를 부여하여 모델이 소수 클래스를 더 잘 학습하도록 합니다.
평가 지표 선택 가이드
| 상황 | 권장 지표 | 이유 |
|---|---|---|
| 균형 데이터 | Accuracy, F1 | 전반적 성능 평가 가능 |
| 불균형 데이터 | Precision, Recall, AUC | Accuracy는 오해 유발 |
| 모델 비교 | ROC-AUC | Threshold 독립적 |
| 불균형 + 양성 중요 | PR-AUC | 양성 클래스에 집중 |
면접 질문 맛보기
- Precision과 Recall의 트레이드오프를 설명하세요
- ROC-AUC와 PR-AUC는 언제 사용하나요?
- class_weight='balanced'는 어떻게 동작하나요?
- Log-Loss가 MSE보다 분류 문제에 적합한 이유는?
더 많은 면접 질문은 Premium Interviews (opens in a new tab)에서 확인하세요.
실습 노트북
Breast Cancer 데이터셋으로 위 개념들을 직접 실습해보세요:
노트북에서는 추가로 다음 내용을 다룹니다:
- Sigmoid 함수와 Log-Loss의 시각화
- 로지스틱 회귀 from Scratch 구현 (Gradient Descent)
- 다양한 Threshold에서의 성능 비교 실험
- PCA를 활용한 Decision Boundary 시각화
- 불균형 데이터 생성 및
class_weight효과 비교 - 연습문제 (Cost-Sensitive Learning, 다른 알고리즘 비교 등)
이전: 02. Linear Regression | 다음: 04. Decision Tree