🤖 AI/ML

정확도

Accuracy

올바른 예측의 비율. 분류 문제의 기본 평가 지표. 불균형 데이터에서는 주의 필요.

📖 상세 설명

정확도(Accuracy)는 전체 예측 중 올바르게 예측한 비율을 나타내는 분류 모델의 가장 기본적인 평가 지표입니다. 수학적으로 (TP + TN) / (TP + TN + FP + FN)으로 계산되며, 여기서 TP는 True Positive, TN은 True Negative, FP는 False Positive, FN은 False Negative를 의미합니다.

정확도는 머신러닝 역사에서 가장 오래되고 직관적인 지표로, 분류 문제의 기본 평가 방법으로 사용되어 왔습니다. 그러나 1990년대 의료 진단, 사기 탐지 등 불균형 데이터셋 문제가 부각되면서, 정확도만으로는 모델 성능을 제대로 평가할 수 없다는 인식이 퍼졌습니다. 이후 Precision, Recall, F1-Score, AUC-ROC 등 보완 지표들이 발전했습니다.

정확도의 핵심 한계는 클래스 불균형 상황에서 발생합니다. 예를 들어 암 환자가 1%인 데이터셋에서 "모두 정상"이라고 예측하면 정확도는 99%지만, 이 모델은 실제로 쓸모없습니다. 반대로 균형 잡힌 데이터셋(예: MNIST, CIFAR-10)에서는 정확도가 여전히 유용한 지표입니다. 따라서 데이터 분포를 먼저 확인하고 적절한 지표를 선택해야 합니다.

2025년 현재 실무에서는 정확도를 단독으로 사용하는 경우가 드뭅니다. Kaggle, AI 경진대회에서는 AUC-ROC, Log Loss, F1-Score가 주요 평가 지표로 사용되며, LLM 평가에서는 BLEU, ROUGE, 인간 평가 등 도메인 특화 지표가 중심입니다. 그러나 정확도는 여전히 빠른 sanity check와 모델 간 비교에 유용하게 활용됩니다.

💻 코드 예제

정확도와 함께 다양한 분류 지표 계산 예제:

# 정확도 및 분류 평가 지표 계산
from sklearn.metrics import (
    accuracy_score, precision_score, recall_score,
    f1_score, classification_report, confusion_matrix
)
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, 1, 0]  # 예측 레이블

# 1. 정확도 (Accuracy)
accuracy = accuracy_score(y_true, y_pred)
print(f"정확도: {accuracy:.2%}")  # 70.00%

# 2. 정밀도 (Precision) - 예측 양성 중 실제 양성 비율
precision = precision_score(y_true, y_pred)
print(f"정밀도: {precision:.2%}")  # 80.00%

# 3. 재현율 (Recall) - 실제 양성 중 예측 양성 비율
recall = recall_score(y_true, y_pred)
print(f"재현율: {recall:.2%}")  # 66.67%

# 4. F1-Score - 정밀도와 재현율의 조화평균
f1 = f1_score(y_true, y_pred)
print(f"F1-Score: {f1:.2%}")  # 72.73%

# 5. 혼동 행렬 (Confusion Matrix)
cm = confusion_matrix(y_true, y_pred)
print("\n혼동 행렬:")
print(f"  TN={cm[0,0]}, FP={cm[0,1]}")
print(f"  FN={cm[1,0]}, TP={cm[1,1]}")

# 6. 전체 분류 리포트
print("\n상세 리포트:")
print(classification_report(y_true, y_pred, target_names=['음성', '양성']))

불균형 데이터에서의 정확도 문제 시뮬레이션:

# 불균형 데이터에서 정확도의 함정
import numpy as np
from sklearn.metrics import accuracy_score, f1_score, balanced_accuracy_score

# 극단적 불균형: 양성 2%, 음성 98%
np.random.seed(42)
n_samples = 1000
n_positive = 20  # 2%

y_true = np.array([1] * n_positive + [0] * (n_samples - n_positive))

# 모델 A: 모든 것을 음성으로 예측 (단순 모델)
y_pred_naive = np.zeros(n_samples)

# 모델 B: 실제로 양성을 어느 정도 탐지하는 모델
y_pred_better = np.zeros(n_samples)
y_pred_better[:15] = 1  # 양성 15개 올바르게 예측
y_pred_better[25:30] = 1  # 오탐 5개

print("=== 불균형 데이터 (양성 2%) ===")
print(f"\n[모델 A: 전부 음성 예측]")
print(f"  정확도: {accuracy_score(y_true, y_pred_naive):.2%}")  # 98%!
print(f"  F1-Score: {f1_score(y_true, y_pred_naive):.2%}")  # 0%
print(f"  Balanced Accuracy: {balanced_accuracy_score(y_true, y_pred_naive):.2%}")

print(f"\n[모델 B: 양성 탐지 시도]")
print(f"  정확도: {accuracy_score(y_true, y_pred_better):.2%}")  # 99%
print(f"  F1-Score: {f1_score(y_true, y_pred_better):.2%}")  # 75%
print(f"  Balanced Accuracy: {balanced_accuracy_score(y_true, y_pred_better):.2%}")

print("\n=> 정확도만 보면 두 모델이 비슷해 보이지만, F1은 완전히 다름!")

📊 성능 지표 비교

상황별 적합한 평가 지표 선택 가이드:

상황 권장 지표 정확도 적합성 이유
균형 데이터 (50:50) Accuracy, F1 적합 클래스 분포가 균형
불균형 데이터 (95:5) F1, AUC-ROC 부적합 다수 클래스 편향
의료 진단 (놓치면 안됨) Recall, Sensitivity 부적합 FN 최소화 중요
스팸 필터 (오탐 최소화) Precision 보조적 FP 최소화 중요
다중 클래스 분류 Macro F1, Weighted F1 참고용 클래스별 균형 평가

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

💬 회의에서
"정확도 98%라고 하셨는데, 양성 클래스가 전체의 몇 퍼센트인가요? 불균형 데이터면 F1-Score나 AUC-ROC를 같이 봐야 할 것 같습니다."
💬 면접에서
"사기 탐지처럼 양성 클래스가 희귀한 경우, 정확도보다 Precision-Recall 커브나 F1-Score가 더 적합합니다. 비즈니스 요구사항에 따라 Precision과 Recall 중 어디에 가중치를 둘지 결정해야 합니다."
💬 기술 토론에서
"MNIST 같은 균형 데이터셋에서는 정확도가 괜찮지만, 실제 배포 환경의 데이터 분포가 다르면 성능이 급락할 수 있어요. 배포 전에 반드시 실제 분포 데이터로 재평가해야 합니다."

⚠️ 흔한 실수 & 주의사항

정확도만 보고 모델 선택

불균형 데이터에서 정확도 99%인 모델이 실제로는 소수 클래스를 전혀 탐지하지 못할 수 있습니다. 반드시 혼동 행렬과 클래스별 지표를 함께 확인하세요.

테스트 데이터 분포 확인 안 함

학습 데이터와 테스트 데이터의 클래스 분포가 다르면 정확도가 왜곡됩니다. 특히 시계열 데이터에서 시간에 따른 분포 변화(Data Drift)를 주의해야 합니다.

올바른 접근법

먼저 데이터 분포를 확인하고, 비즈니스 목표에 맞는 지표를 선택하세요. Balanced Accuracy, F1-Score, AUC-ROC 등 상황에 맞는 지표를 주 지표로 사용하고, 정확도는 보조 지표로 활용합니다.

🔗 관련 용어

📚 더 배우기