본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 모델 성능 지표 Accuracy와 F1-score의 3가지 결정적 차이와 선택 방법

by Papa Martino V 2026. 4. 8.
728x90

모델 성능 지표 Accuracy와 F1-score
모델 성능 지표 Accuracy와 F1-score

 

머신러닝 프로젝트를 진행하다 보면 "내 모델의 정확도가 99%인데 왜 실무에서는 아무런 쓸모가 없을까?"라는 깊은 고민에 빠지게 됩니다. 이는 단순히 모델의 학습이 잘못된 것이 아니라, 데이터의 성격에 맞지 않는 성능 지표를 선택했기 때문인 경우가 대부분입니다. 오늘날 데이터 사이언티스트에게 요구되는 역량은 단순히 높은 숫자를 뽑아내는 것이 아니라, 비즈니스 상황에 맞는 '지표의 가치'를 판단하는 능력입니다.


1. 정확도(Accuracy)의 함정과 불균형 데이터의 역설

정확도는 가장 직관적인 지표입니다. 전체 데이터 중 모델이 맞춘 비율을 의미합니다. 하지만 금융 사기 탐지(Fraud Detection)나 희귀 질병 진단과 같은 분야에서는 독약이 될 수 있습니다. 예를 들어, 10,000건의 거래 중 사기 거래가 10건뿐이라면, 무조건 "정상"이라고 예측하는 바보 같은 모델도 99.9%의 정확도를 기록하게 됩니다. 이것이 바로 정확도의 역설(Accuracy Paradox)입니다. 반면, F1-score는 정밀도(Precision)와 재현율(Recall)의 조화 평균을 사용하여, 데이터가 불균형할 때 모델의 진짜 실력을 보여줍니다. 클래스 0과 1의 균형이 깨진 실무 환경에서는 정확도보다 F1-score를 신뢰하는 것이 데이터 과학의 정석으로 통합니다.


2. 핵심 지표 비교: Accuracy vs F1-score

모델의 목적에 따라 어떤 지표를 우선순위에 두어야 하는지 아래 표를 통해 한눈에 비교해 보겠습니다.

비교 항목 정확도 (Accuracy) F1-score
주요 공식 (TP + TN) / Total 2 * (Precision * Recall) / (Precision + Recall)
데이터 분포 클래스 비율이 균등할 때 적합 클래스 비율이 불균형할 때 필수
비즈니스 관점 전반적인 예측 성능 확인 오탐(FP)과 미탐(FN)의 비용 고려
신뢰도 다수 클래스 편향 발생 시 낮음 소수 클래스 예측 실패 시 급격히 하락
주요 활용처 일반적인 이미지 분류, 감성 분석 결함 탐지, 보안 침입 탐지, 질병 진단

3. 개발자를 위한 실무 파이썬(Python) 적용 Example 7가지

단순히 이론을 아는 것을 넘어, 실무 코드에서 지표를 산출하고 분석하는 7가지 핵심 방법을 소개합니다.

Example 1: Scikit-learn을 이용한 기본 지표 산출 방법

from sklearn.metrics import accuracy_score, f1_score, classification_report

# 실제값과 모델 예측값
y_true = [0, 1, 0, 0, 1, 0, 1, 0, 0, 1]
y_pred = [0, 0, 0, 0, 1, 1, 1, 0, 0, 1]

print(f"Accuracy: {accuracy_score(y_true, y_pred)}")
print(f"F1-score: {f1_score(y_true, y_pred)}")
# 전체적인 리포트 확인 (실무 권장)
print(classification_report(y_true, y_pred))
    

Example 2: Confusion Matrix(혼동 행렬) 시각화로 오차 원인 해결

import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay

cm = confusion_matrix(y_true, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot(cmap=plt.cm.Blues)
plt.title("Model Confusion Matrix")
plt.show()
    

Example 3: 데이터 불균형 해결을 위한 Macro vs Weighted F1-score 차이 확인

# 다중 클래스 분류 시 F1 계산 방식 선택
# macro: 각 클래스에 동일한 가중치 (소수 클래스 중시)
# weighted: 클래스 샘플 수에 비례한 가중치
f1_macro = f1_score(y_true, y_pred, average='macro')
f1_weighted = f1_score(y_true, y_pred, average='weighted')

print(f"Macro F1: {f1_macro}, Weighted F1: {f1_weighted}")
    

Example 4: Cross-Validation에서 F1-score를 기준으로 모델 선택하는 방법

from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier()
# scoring 파라미터에 'f1'을 지정하여 검증
scores = cross_val_score(clf, X_data, y_label, cv=5, scoring='f1')
print(f"Cross-validated F1 scores: {scores.mean()}")
    

Example 5: 임계값(Threshold) 변경을 통한 F1-score 최적화 방법

import numpy as np

# 모델의 예측 확률값 (0.5 기본 임계값 대신 사용)
y_probs = model.predict_proba(X_test)[:, 1]

# 0.1부터 0.9까지 임계값을 변경하며 최적의 F1 찾기
for threshold in np.arange(0.1, 1.0, 0.1):
    temp_pred = (y_probs >= threshold).astype(int)
    score = f1_score(y_test, temp_pred)
    print(f"Threshold: {threshold:.1f} -> F1-score: {score:.4f}")

Example 6: Precision-Recall Curve를 통한 모델 성능 한계 해결

from sklearn.metrics import precision_recall_curve

precisions, recalls, thresholds = precision_recall_curve(y_test, y_probs)

plt.plot(thresholds, precisions[:-1], label="Precision")
plt.plot(thresholds, recalls[:-1], label="Recall")
plt.xlabel("Threshold")
plt.legend()
plt.show()

Example 7: Pandas와 연동하여 클래스별 성능 요약 표 만들기

import pandas as pd

report_dict = classification_report(y_true, y_pred, output_dict=True)
df_report = pd.DataFrame(report_dict).transpose()

# 정확도와 F1-score가 포함된 리포트 출력
print(df_report[['precision', 'recall', 'f1-score']])

4. 전문적인 통찰: 실무 데이터 전략의 핵심

지표를 선택할 때는 항상 '틀렸을 때의 비용'을 계산해야 합니다. 암 진단 모델에서 암 환자를 정상으로 오판하는 비용(False Negative)은 엄청납니다. 이때는 재현율(Recall)을 높이는 방향으로 모델을 튜닝하고, F1-score를 통해 정밀도와의 균형을 잡아야 합니다. 반면 스팸 메일 분류는 정상 메일을 스팸으로 분류하는 비용(False Positive)이 더 큽니다. 이때는 정밀도(Precision)가 우선입니다. 결론적으로, 데이터가 편향되어 있다면 정확도는 거짓말을 합니다. 데이터의 분포를 먼저 확인하고, 불균형이 감지되는 즉시 F1-score나 AUC-ROC로 시선을 옮기십시오. 이것이 시니어 데이터 엔지니어가 주니어와 차별화되는 포인트입니다.


5. 출처 및 기술 참조

  • Pedregosa, F. et al. (2011). Scikit-learn: Machine Learning in Python. JMLR.
  • Fawcett, T. (2006). An introduction to ROC analysis. Pattern Recognition Letters.
  • Google Developers Machine Learning Crash Course: Classification: Precision and Recall.
  • James, G. et al. (2013). An Introduction to Statistical Learning. Springer.
728x90