🤖 AI/ML

F1 Score

F1 Score

정밀도와 재현율의 조화 평균. 분류 모델 평가에 사용.

📖 상세 설명

F1 Score는 정밀도(Precision)와 재현율(Recall)의 조화 평균으로, 분류 모델의 성능을 단일 숫자로 표현하는 평가 지표입니다. 수식으로는 F1 = 2 * (Precision * Recall) / (Precision + Recall)로 계산되며, 0과 1 사이의 값을 가집니다. 1에 가까울수록 모델의 성능이 우수함을 의미합니다.

F1 Score는 2003년 정보 검색 분야에서 처음 제안되어 현재까지 머신러닝의 표준 평가 지표로 자리 잡았습니다. 조화 평균을 사용하는 이유는 정밀도와 재현율 중 하나라도 낮으면 F1 Score가 크게 떨어지기 때문입니다. 이는 두 지표의 균형을 중시하는 상황에서 특히 유용합니다.

핵심 원리는 True Positive(TP), False Positive(FP), False Negative(FN)를 기반으로 합니다. 정밀도는 TP/(TP+FP)로 모델이 양성이라고 예측한 것 중 실제 양성의 비율이고, 재현율은 TP/(TP+FN)로 실제 양성 중 모델이 찾아낸 비율입니다. F1 Score는 이 둘의 균형점을 제시합니다.

실무에서 F1 Score는 특히 클래스 불균형이 심한 데이터셋에서 중요합니다. 예를 들어, 사기 탐지에서 사기 건수가 전체의 1%라면 단순 정확도는 99%가 나올 수 있지만, F1 Score는 실제 탐지 능력을 더 정확히 반영합니다. 스팸 필터, 의료 진단, 이상 탐지 등에서 핵심 지표로 활용됩니다.

💻 코드 예제

from sklearn.metrics import f1_score, precision_score, recall_score, classification_report
import numpy as np

# 실제 레이블과 예측 레이블
y_true = [1, 0, 1, 1, 0, 1, 0, 0, 1, 1]
y_pred = [1, 0, 1, 0, 0, 1, 1, 0, 0, 1]

# F1 Score 계산 (binary classification)
f1 = f1_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)

print(f"Precision: {precision:.4f}")  # 0.8000
print(f"Recall: {recall:.4f}")        # 0.6667
print(f"F1 Score: {f1:.4f}")          # 0.7273

# 수동 계산 검증
f1_manual = 2 * (precision * recall) / (precision + recall)
print(f"수동 계산 F1: {f1_manual:.4f}")

# 멀티클래스 F1 Score
y_true_multi = [0, 1, 2, 0, 1, 2, 0, 1, 2]
y_pred_multi = [0, 2, 1, 0, 0, 2, 0, 1, 2]

# 다양한 averaging 방식
print("\n멀티클래스 F1 Score:")
print(f"Macro F1: {f1_score(y_true_multi, y_pred_multi, average='macro'):.4f}")
print(f"Micro F1: {f1_score(y_true_multi, y_pred_multi, average='micro'):.4f}")
print(f"Weighted F1: {f1_score(y_true_multi, y_pred_multi, average='weighted'):.4f}")

# 상세 리포트
print("\n분류 리포트:")
print(classification_report(y_true_multi, y_pred_multi,
                          target_names=['Class 0', 'Class 1', 'Class 2']))

🗣️ 실무에서 이렇게 말하세요

ML 팀 주간 회의에서

"사기 탐지 모델 정확도가 99%인데 실제 사기 건 중 30%만 잡아내고 있습니다. F1 Score로 보면 0.45밖에 안 되는데, Recall을 높이는 방향으로 임계값을 조정해야 할 것 같습니다. Precision이 조금 떨어지더라도 F1 Score 0.6 이상을 목표로 튜닝하겠습니다."

ML 엔지니어 면접에서

"F1 Score를 사용하는 이유는 불균형 데이터에서 정확도만으로는 모델 성능을 제대로 평가할 수 없기 때문입니다. 조화 평균을 사용해서 정밀도와 재현율 중 하나라도 낮으면 점수가 확 떨어지기 때문에, 두 지표 모두 일정 수준 이상을 유지해야 합니다."

모델 리뷰 미팅에서

"의료 진단 모델은 Macro F1보다 Weighted F1을 쓰는 게 좋을 것 같습니다. 질병별 발생 빈도가 다르니까 가중치를 줘서 계산해야 실제 성능을 더 잘 반영할 수 있습니다. 현재 Weighted F1이 0.82인데, 희귀 질환 클래스의 Recall이 낮아서 데이터 증강을 고려하고 있습니다."

⚠️ 흔한 실수 & 주의사항

1
클래스 불균형이 심할 때 averaging 방식 선택

Macro F1은 모든 클래스를 동등하게 취급하고, Weighted F1은 샘플 수에 비례한 가중치를 적용합니다. 소수 클래스가 중요한 경우(암 진단 등) Macro F1을, 전체 성능이 중요한 경우 Weighted F1을 사용하세요.

2
Precision과 Recall의 트레이드오프 이해

F1 Score가 높더라도 비즈니스 목적에 따라 Precision이나 Recall 중 하나가 더 중요할 수 있습니다. 스팸 필터는 Precision이, 암 진단은 Recall이 더 중요합니다. F1 Score만 보지 말고 개별 지표도 확인하세요.

3
확률 임계값 튜닝 시 주의

기본 임계값 0.5에서의 F1 Score가 최적이 아닐 수 있습니다. Precision-Recall 곡선을 그려서 목표에 맞는 최적 임계값을 찾으세요. 임계값을 낮추면 Recall이 오르고 Precision이 떨어집니다.

🔗 관련 용어

📚 더 배우기