AI 모델 성능 평가 지표 완전 정복: Accuracy·F1부터 LLM·RAG 평가까지
모델의 정확도가 99%라면 좋은 모델일까요?
정상인이 990명이고 암 환자가 10명인 데이터에서 모든 사람을 정상이라고 예측해도 정확도는 99%입니다. 하지만 암 환자 10명은 단 한 명도 찾아내지 못합니다. 이 모델의 재현율(Recall)은 0%입니다.
이 예시는 AI 모델 평가에서 가장 중요한 사실을 보여줍니다.
평가 지표는 단순한 점수가 아니라, 모델이 어떤 실수를 더 중요하게 줄여야 하는지 정의하는 기준이다.
좋은 평가를 하려면 Accuracy나 F1 하나만 계산해서는 부족합니다. 문제의 목적, 클래스 비율, 오류 비용, 임계값, 확률의 신뢰도, 데이터 분할 방식, 운영 속도까지 함께 봐야 합니다.
이 글에서는 다음 내용을 다룹니다.
- 회귀: MAE, MSE, RMSE, R², MAPE, WAPE, MASE
- 분류: Accuracy, Balanced Accuracy, Precision, Recall, F1, Fβ, MCC, AUROC, AUPRC
- 확률 평가: Log Loss, Brier Score, Calibration Curve, ECE
- 컴퓨터 비전: IoU, Dice, AP, mAP, AR, HOTA
- NLP·LLM·RAG: Perplexity, BLEU, ROUGE, BERTScore, LLM-as-a-Judge, Retrieval Recall, Faithfulness, pass@k
- 추천·랭킹: Precision@K, Recall@K, MRR, MAP@K, nDCG@K
- 이상 탐지·강화학습·에이전트 평가
- 임계값 선택, 데이터 누수, 교차 검증, 신뢰구간, 운영 모니터링
1. 가장 먼저 구분해야 할 세 가지: 평가 지표, 손실 함수, 비즈니스 KPI
AI 프로젝트에서는 다음 세 가지가 자주 혼동됩니다.
| 구분 | 질문 | 예시 |
|---|---|---|
| 평가 지표(Metric) | 모델이 얼마나 잘했는가? | F1, AUROC, RMSE, mAP |
| 손실 함수(Loss) | 모델을 어느 방향으로 학습시킬 것인가? | Cross-Entropy, MSE, Focal Loss |
| 비즈니스 KPI | 실제 서비스에 어떤 가치가 생겼는가? | 불량 유출률, 매출, 전환율, 사고 감소율 |
예를 들어 고객 이탈 예측 모델을 만들었다고 가정해봅시다.
- 학습: Binary Cross-Entropy 최소화
- 오프라인 평가: AUPRC, Recall, Precision
- 운영 임계값: 상담팀이 하루에 처리할 수 있는 고객 수에 맞춰 결정
- 비즈니스 성과: 실제 이탈률 감소, 유지 매출 증가
F1이 높아도 실제 이탈 방지 효과가 없을 수 있습니다. 반대로 F1이 조금 낮더라도 고위험 고객을 적절한 시점에 찾아내 매출 손실을 줄였다면 실무적으로 더 좋은 모델입니다.
평가 지표를 손실 함수로 바로 쓸 수 없는 이유
Accuracy, F1, BLEU, mAP처럼 예측 결과를 잘라 세거나 순위를 계산하는 지표는 일반적으로 이산적입니다. 예측 확률이 0.49에서 0.499로 변해도 임계값이 0.5라면 최종 분류 결과는 바뀌지 않습니다. 따라서 경사하강법이 사용할 연속적인 학습 신호가 부족합니다.
다만 다음처럼 표현해야 정확합니다.
- 이산 Accuracy나 이산 F1을 그대로 최적화하기는 어렵다.
- 미분 가능한 근사값인 Soft F1, Soft Dice 등을 손실로 사용할 수 있다.
- 딥러닝 손실 함수가 반드시 볼록(Convex)해야 하는 것은 아니다.
- MAE나 ReLU처럼 일부 지점에서 미분되지 않아도 서브그래디언트나 자동미분 규칙으로 학습할 수 있다.
즉, 손실 함수의 절대 조건을 “연속·미분 가능·볼록”이라고 단정하기보다는, 최적화 알고리즘에 유용하고 안정적인 학습 신호를 제공하는가를 봐야 합니다.
손실 함수 자체는 별도 글인 AI 학습의 숨은 심판관, 손실함수 완전 정복에서 자세히 설명합니다.
2. 지표를 계산하기 전에 평가 설계부터 확인하자
평가 지표 공식이 정확해도 평가 데이터가 잘못되면 결과는 무의미합니다.
2.1 학습·검증·테스트 데이터를 분리한다
- 학습 세트(Train): 모델 파라미터 학습
- 검증 세트(Validation): 하이퍼파라미터와 임계값 선택
- 테스트 세트(Test): 최종 성능을 한 번 평가
테스트 세트를 반복해서 보며 모델이나 임계값을 수정하면 테스트 세트가 사실상 검증 세트가 됩니다. 이때 보고된 점수는 새로운 데이터에 대한 일반화 성능보다 낙관적으로 보일 수 있습니다.
2.2 임계값은 테스트 세트에서 고르지 않는다
분류 모델이 출력하는 0.8은 보통 클래스 자체가 아니라 양성일 확률 또는 점수입니다. 이 값을 0.5 이상이면 양성으로 자르는 것은 관습일 뿐 최적 기준이 아닙니다.
임계값은 검증 세트에서 다음 기준으로 선택할 수 있습니다.
- F1 또는 F2 최대화
- Recall 95% 이상을 만족하는 지점 중 Precision 최대화
- FP 비용과 FN 비용을 반영한 총비용 최소화
- 하루 처리 가능한 경보 수를 만족하는 지점
임계값을 검증 세트에서 고른 뒤, 테스트 세트에서는 그 값을 고정한 상태로 최종 성능을 측정해야 합니다.
2.3 데이터 특성에 맞는 분할을 사용한다
| 데이터 특성 | 권장 분할 |
|---|---|
| 일반 독립 표본 | 무작위 분할 또는 K-Fold |
| 클래스 불균형 | Stratified K-Fold |
| 동일 환자·사용자·장비의 반복 데이터 | Group K-Fold |
| 시간 순서가 있는 데이터 | 과거로 학습하고 미래로 평가하는 시계열 분할 |
| 공간 데이터 | 지역 단위 홀드아웃 또는 공간 블록 분할 |
센서 데이터나 주가 데이터를 무작위로 섞으면 미래 데이터가 학습에 들어가는 누수가 발생할 수 있습니다. 동일 환자의 이미지가 학습과 테스트에 함께 들어가는 것도 대표적인 누수입니다.
2.4 평균 점수만 말하지 않는다
테스트 표본이 작으면 점수 차이가 우연일 수 있습니다. 가능하면 다음을 함께 제시합니다.
- 교차 검증 평균과 표준편차
- 부트스트랩 95% 신뢰구간
- 기존 모델과의 쌍별 비교
- 클래스·지역·기기·시간대별 세부 점수
F1 = 0.82보다 F1 = 0.82, 95% CI [0.78, 0.85]가 훨씬 많은 정보를 제공합니다.
3. 회귀 평가 지표: 얼마나 가까운 숫자를 예측했는가
회귀는 가격, 온도, 수요, 수명처럼 연속적인 값을 예측합니다.
3.1 MAE: 평균적으로 얼마나 틀렸는가
MAE는 오차의 절댓값을 평균냅니다.
- 원래 데이터와 단위가 같아 해석이 쉽습니다.
- 큰 오차의 영향을 MSE보다 덜 받습니다.
- 모든 오차를 선형적으로 반영합니다.
예측 오차가 평균 3.2℃라면 MAE는 3.2℃입니다.
3.2 MSE와 RMSE: 큰 실수에 더 큰 벌점을 준다
오차를 제곱하기 때문에 큰 오차에 강한 페널티를 줍니다. RMSE는 다시 제곱근을 취해 원래 단위로 해석할 수 있습니다.
- 큰 오차가 특히 위험할 때 적합
- 이상치에 민감
- MAE와 함께 보면 오차 분포를 이해하기 좋음
RMSE가 MAE보다 훨씬 크다면 일부 샘플에서 매우 큰 오차가 발생하고 있을 가능성이 큽니다.
3.3 R²: 평균 예측보다 얼마나 나은가
- 1: 완벽한 예측
- 0: 항상 평균을 예측하는 모델과 비슷함
- 음수: 평균만 예측하는 것보다 나쁨
R²는 0과 1 사이로만 제한되지 않습니다. 테스트 데이터에서는 음수가 나올 수 있습니다. 또한 R²가 높다고 인과관계가 있다는 뜻은 아닙니다.
3.4 MAPE의 가장 큰 함정: 0과 작은 실제값
MAPE는 “평균적으로 몇 퍼센트 틀렸는가”를 설명하기 쉬워 많이 사용됩니다. 하지만 실제값이 0이면 정의되지 않고, 실제값이 0에 가까우면 오차가 폭발합니다.
예를 들어 실제 판매량이 1개인데 3개로 예측하면 오차는 200%입니다. 실제 판매량이 1,000개인데 1,002개로 예측하면 0.2%입니다. 두 경우 모두 절대 오차는 2개입니다.
따라서 0이 자주 등장하는 수요·전력·트래픽 데이터에서는 MAPE 하나만 사용하면 안 됩니다.
3.5 WAPE와 MASE
WAPE
전체 오차를 전체 실제값 규모로 나눕니다. 개별 값이 0인 경우에도 전체 합이 0이 아니라면 계산할 수 있습니다. 다만 큰 규모의 시계열이 결과를 지배할 수 있습니다.
MASE
MASE는 모델의 MAE를 단순한 나이브 예측의 MAE로 나눕니다.
- MASE
- MASE = 1: 나이브 기준과 비슷함
- MASE > 1: 나이브 기준보다 나쁨
단위가 서로 다른 여러 시계열을 비교할 때 유용합니다. Hyndman과 Koehler는 백분율 오차의 문제를 피하기 위한 대안으로 MASE를 제안했습니다.
3.6 회귀 지표 선택표
| 상황 | 1순위 | 함께 볼 지표 |
|---|---|---|
| 일반 회귀 | MAE 또는 RMSE | R² |
| 큰 오차가 특히 위험 | RMSE | 최대 오차, 상위 분위수 오차 |
| 이상치가 많음 | MAE | Median AE |
| 여러 단위·규모의 시계열 비교 | MASE | WAPE |
| 0이 없는 비율 중심 데이터 | MAPE | MAE |
| 예측 구간 제공 | Pinball Loss | Coverage, 구간 폭 |
3.7 점예측만 평가하지 말고 불확실성도 평가한다
전력 수요를 “내일 100MWh”라고 한 점으로만 예측하는 것보다 “90% 예측구간은 92~111MWh”라고 제시하는 것이 운영에 더 유용할 수 있습니다.
예측 구간은 다음을 함께 봅니다.
- Coverage: 실제값이 예측구간 안에 들어온 비율
- Interval Width: 예측구간의 평균 폭
- Pinball Loss: 특정 분위수 예측 오차
Coverage가 높아도 구간이 지나치게 넓으면 실용성이 없습니다. 정확성과 구간 폭을 함께 평가해야 합니다.
4. 분류 평가 지표: 어떤 오류를 더 중요하게 볼 것인가
4.1 혼동 행렬
| 예측 양성 | 예측 음성 | |
|---|---|---|
| 실제 양성 | TP | FN |
| 실제 음성 | FP | TN |
- TP: 양성을 양성으로 맞춤
- FN: 양성을 놓침
- FP: 음성을 양성으로 잘못 판단
- TN: 음성을 음성으로 맞춤
양성은 “좋다”는 뜻이 아니라 모델이 찾아야 하는 관심 대상입니다. 암, 사기 거래, 불량품, 스팸처럼 문제에 따라 달라집니다.
4.2 Accuracy
클래스 비율이 비슷하고 FP와 FN의 비용이 비슷할 때 직관적입니다. 불균형 데이터에서 Accuracy를 완전히 금지해야 하는 것은 아니지만, 단독으로 사용하면 위험합니다.
4.3 Balanced Accuracy
각 클래스의 Recall을 평균한 값입니다. 다수 클래스가 Accuracy를 지배하는 문제를 줄여줍니다.
4.4 Precision, Recall, Specificity
“양성이라고 경보한 것 중 실제 양성은 얼마나 되는가?”
“실제 양성 중 얼마나 찾아냈는가?”
“실제 음성 중 얼마나 음성으로 걸러냈는가?”
Precision이 중요한 사례
- 정상 메일을 스팸으로 보내면 안 되는 필터
- 조사 인력이 제한된 사기 탐지
- 불필요한 수술이나 검사 비용이 큰 의료 보조 시스템
Recall이 중요한 사례
- 암 선별 검사
- 화재·안전사고 조기 탐지
- 제조 불량 유출 방지
4.5 F1과 Fβ
F1은 Precision과 Recall의 조화평균입니다. 두 값 중 하나가 매우 낮으면 F1도 낮아집니다.
하지만 F1은 TN을 사용하지 않으며 임계값에 따라 크게 달라집니다. 따라서 F1 하나만 보고 모델 전체를 평가하면 안 됩니다.
Recall을 더 중요하게 보려면 F2처럼 β가 1보다 큰 Fβ를 사용할 수 있습니다.
4.6 MCC: 네 칸을 모두 반영하는 상관계수
Matthews Correlation Coefficient는 TP, TN, FP, FN을 모두 반영합니다.
- 1: 완벽한 예측
- 0: 무작위 수준
- -1: 완전히 반대 예측
클래스 불균형이 있고 양성과 음성 성능을 하나의 값으로 요약해야 할 때 유용합니다. 다만 비즈니스 비용을 직접 반영하지는 않으므로 Precision·Recall과 함께 보는 것이 좋습니다.
4.7 AUROC와 AUPRC
AUROC
ROC 곡선은 여러 임계값에서 TPR과 FPR의 관계를 보여줍니다. AUROC는 임의로 선택한 양성 샘플의 점수가 임의로 선택한 음성 샘플보다 높을 확률로 해석할 수 있습니다.
- 1.0: 완벽한 순위
- 0.5: 무작위 수준
AUPRC 또는 Average Precision
Precision-Recall 곡선은 여러 임계값에서 Precision과 Recall의 관계를 보여줍니다. 양성이 희소하고 실제 경보 품질이 중요한 문제에서 유용합니다.
AUPRC의 무작위 기준선은 일반적으로 양성 비율과 관련됩니다. 양성 비율이 1%라면 0.20의 AUPRC도 무작위보다 크게 나은 결과일 수 있습니다. 따라서 다른 데이터셋의 AUPRC 값을 단순 비교해서는 안 됩니다.
“불균형이면 무조건 AUPRC”도 과도한 단순화다
AUPRC는 희소 양성 성능을 잘 보여주지만, 양성 유병률에 영향을 받고 특정 하위집단의 양성 비율 차이에도 민감합니다. AUROC와 AUPRC 중 하나가 항상 우월한 것은 아닙니다.
실무에서는 보통 다음 조합이 안전합니다.
- 모델의 전반적 순위 능력: AUROC
- 희소 양성에 대한 실제 경보 품질: AUPRC
- 운영 지점: 선택한 임계값의 Precision, Recall, Fβ
- 양성과 음성을 함께 요약: MCC 또는 Balanced Accuracy
4.8 확률이 믿을 만한가: Log Loss, Brier Score, Calibration
두 모델이 모두 Accuracy 90%라도 확률의 신뢰도는 다를 수 있습니다.
- 모델 A: 틀린 예측에도 0.51 정도의 낮은 확신
- 모델 B: 틀린 예측에 0.999의 과도한 확신
의료·금융·안전 시스템에서는 두 모델을 같다고 볼 수 없습니다.
Log Loss
정답 클래스에 낮은 확률을 부여할수록 큰 벌점을 줍니다. 자신 있게 틀린 예측을 강하게 처벌합니다.
Brier Score
예측 확률과 실제 결과의 제곱 오차입니다. 낮을수록 좋습니다. 다만 Brier Score는 확률 보정뿐 아니라 분류의 변별력도 함께 반영하므로, 보정 상태만 판단하려면 Reliability Diagram을 함께 봐야 합니다.
Calibration Curve 또는 Reliability Diagram
“0.8이라고 예측한 사례 100개 중 실제로 약 80개가 양성인가?”를 확인합니다.
완벽히 보정된 모델은 예측 확률과 실제 빈도가 대각선에 가깝습니다.
ECE
Expected Calibration Error는 확률 구간별 예측 확률과 실제 빈도의 차이를 가중 평균합니다. 계산이 간단하지만 구간 수와 구간 방식에 민감하므로 ECE 하나만으로 보정 품질을 단정하지 않는 것이 좋습니다.
4.9 다중 클래스 평균: Macro, Micro, Weighted
- Macro: 클래스별 점수를 단순 평균. 소수 클래스를 동등하게 봄
- Micro: 전체 TP·FP·FN을 합쳐 계산. 빈도가 높은 클래스 영향이 큼
- Weighted: 클래스별 표본 수로 가중 평균
중증 환자처럼 소수 클래스가 중요하면 Macro F1과 클래스별 Recall을 확인해야 합니다. Weighted F1만 보면 다수 클래스 성능이 소수 클래스 실패를 가릴 수 있습니다.
4.10 멀티라벨 분류
한 이미지에 사람, 자동차, 도로처럼 여러 정답이 동시에 존재하는 경우입니다.
- Hamming Loss: 전체 레이블 중 잘못 예측한 비율
- Jaccard Score: 예측 레이블과 실제 레이블의 교집합/합집합
- Subset Accuracy: 모든 레이블을 정확히 맞춘 샘플의 비율
- Label Ranking Average Precision: 정답 레이블 순위 품질
Subset Accuracy는 매우 엄격하므로 다른 지표와 함께 봐야 합니다.
5. 컴퓨터 비전 평가 지표
5.1 이미지 분류
- Top-1 Accuracy: 1순위 예측이 정답인가
- Top-K Accuracy: 상위 K개에 정답이 포함되는가
- Macro F1: 클래스 불균형이 있는 다중 클래스
- Calibration: 예측 확률을 의사결정에 사용할 때
5.2 객체 탐지: IoU, AP, mAP, AR
IoU
예측 박스나 마스크와 정답이 얼마나 겹치는지 나타냅니다.
AP와 mAP
객체 탐지에서는 분류 점수 임계값을 바꾸며 Precision-Recall 곡선을 만들고 AP를 계산합니다. 여러 클래스의 AP를 평균한 값이 mAP입니다.
COCO 방식에서는 IoU 0.50부터 0.95까지 0.05 간격의 AP를 평균한 AP@[0.50:0.95]를 핵심 지표로 사용합니다.
반드시 다음을 구분해야 합니다.
- AP@0.50: 위치 기준이 비교적 느슨함
- AP@0.75: 더 엄격한 위치 정확도
- AP@[0.50:0.95]: 여러 IoU 기준의 평균
- AP_small, AP_medium, AP_large: 객체 크기별 성능
- AR: 제한된 탐지 수에서의 평균 재현율
mAP 0.62라고만 쓰면 어떤 기준인지 알 수 없습니다.
5.3 세그멘테이션: IoU와 Dice
이진 세그멘테이션에서 Dice는 픽셀 단위 F1과 같은 형태입니다.
- IoU: 겹침을 엄격하게 평가
- Dice: 의료 영상에서 널리 사용
- mIoU: 클래스별 IoU 평균
- Boundary F-score: 경계 정확도가 중요한 경우
배경이 99%인 종양 세그멘테이션에서 전체 픽셀 Accuracy는 높게 나올 수 있습니다. 이때 종양 클래스 Dice·IoU와 병변 단위 Recall을 함께 봐야 합니다.
5.4 객체 추적: MOTA, IDF1, HOTA
- MOTA: FN, FP, ID 전환을 종합
- IDF1: 객체의 신원 유지 품질
- HOTA: 탐지 정확도와 연결 정확도를 균형 있게 평가
추적 시스템은 탐지를 잘해도 객체 ID가 계속 바뀔 수 있습니다. 따라서 MOTA 하나만 보지 말고 IDF1 또는 HOTA를 함께 보고, 실시간 시스템이라면 FPS와 지연시간도 포함해야 합니다.
5.5 이미지 생성: FID 하나로 끝내지 않는다
FID
실제 이미지와 생성 이미지의 특징 분포 차이를 측정합니다. 낮을수록 두 분포가 가깝습니다.
한계도 분명합니다.
- 샘플 수에 민감
- 특징 추출 모델과 전처리에 민감
- 이미지 다양성과 품질을 하나의 값에 섞음
- 조건이나 텍스트와의 일치 여부를 직접 보장하지 않음
KID
Kernel Inception Distance는 MMD 기반 지표로, 유한 표본에서 불편 추정량을 사용할 수 있다는 장점이 있습니다.
함께 볼 지표
- FID 또는 KID: 분포 유사성
- CLIPScore: 텍스트-이미지 정렬
- 생성 다양성 지표
- 사람 평가: 사실성, 심미성, 프롬프트 충실도
- 안전성 검사: 금지 콘텐츠, 편향, 개인정보 노출
6. 자연어 처리·LLM·RAG 평가
6.1 Perplexity
Perplexity는 토큰 예측의 평균 음의 로그우도에 지수를 취한 값입니다. 낮을수록 다음 토큰에 더 높은 확률을 부여했다는 뜻입니다.
주의할 점:
- 토크나이저가 다르면 모델 간 직접 비교가 어렵습니다.
- 낮은 Perplexity가 사실성·안전성·유용성을 보장하지 않습니다.
- BERT 같은 마스크드 언어 모델은 일반적인 자기회귀 Perplexity를 그대로 계산하기 어렵고 별도의 pseudo-perplexity 방식이 필요합니다.
6.2 BLEU, ROUGE, BERTScore
BLEU
기계 번역 후보 문장과 참조 번역 사이의 n-gram 정밀도를 중심으로 계산하고, 지나치게 짧은 문장에 brevity penalty를 적용합니다.
- 빠르고 재현하기 쉬움
- 데이터셋·토큰화·언어에 따라 점수가 달라짐
- 의미는 같지만 표현이 다른 문장을 낮게 평가할 수 있음
ROUGE
요약 평가에서 참조 요약과의 단어 또는 구문 중복을 측정합니다.
- ROUGE-1: unigram 중복
- ROUGE-2: bigram 중복
- ROUGE-L: 최장 공통 부분수열
ROUGE가 높아도 원문과 모순되는 요약을 만들 수 있습니다. 요약은 사실성 평가가 반드시 필요합니다.
BERTScore
문맥 임베딩을 이용해 후보와 참조 토큰의 의미적 유사도를 계산합니다. 표현이 달라도 의미가 비슷한 문장을 BLEU나 ROUGE보다 잘 포착할 수 있습니다.
그러나 숫자, 부정 표현, 세부 사실의 차이를 충분히 벌점 주지 못할 수 있으므로 사실 검증 지표를 대체하지는 못합니다.
6.3 LLM-as-a-Judge
강한 LLM에 평가 기준과 답변을 제공하고 정확성·유용성·문체 등을 채점하게 할 수 있습니다. 대규모 평가 비용을 줄일 수 있지만 다음 편향이 알려져 있습니다.
- 위치 편향: 먼저 제시된 답변 선호
- 장황함 편향: 긴 답변 선호
- 자기 선호: 같은 계열 모델의 답변 선호
- 프롬프트와 채점표에 따른 민감도
- 판단 모델 자체의 오류와 지식 한계
안전한 운영 방법은 다음과 같습니다.
- 평가 기준을 구체적인 루브릭으로 작성
- 점수만 받지 말고 근거와 오류 유형도 기록
- A/B 순서를 바꿔 반복 평가
- 일부 샘플은 사람 평가와 비교해 상관관계 확인
- 평가 모델 버전과 프롬프트를 고정
- 중요한 결과는 복수 평가자 또는 사람 검토로 교차 확인
6.4 코드 생성: pass@k
코드 생성에서는 자연어 유사도보다 실제 실행 결과가 중요합니다.
- pass@1: 첫 번째 생성 코드가 테스트를 통과하는 비율
- pass@k: k개 후보 중 하나 이상이 테스트를 통과할 확률
pass@k는 테스트 케이스가 충분하다는 가정에 의존합니다. 숨겨진 예외 상황, 보안 취약점, 시간·메모리 복잡도는 별도로 평가해야 합니다.
6.5 RAG 평가는 검색과 생성을 분리한다
RAG 시스템은 검색기가 틀렸는지, 생성기가 틀렸는지 분리하지 않으면 개선 방향을 찾기 어렵습니다.
검색 평가
- Recall@K: 관련 문서가 상위 K개에 얼마나 포함되는가
- Precision@K: 상위 K개 중 관련 문서 비율
- MRR: 첫 관련 문서의 순위
- nDCG@K: 관련도 등급과 순위를 함께 반영
생성 평가
- Faithfulness 또는 Groundedness: 답변이 검색 문맥으로 뒷받침되는가
- Answer Correctness: 질문에 맞는 정답인가
- Answer Relevance: 질문에 직접 답했는가
- Citation Correctness: 인용한 문서가 실제 주장을 뒷받침하는가
전체 시스템 평가
- 업무 성공률
- 무응답 또는 보류 정확도
- 검색·생성 지연시간
- 요청당 비용
- 최신 문서 반영 속도
- 사람의 수정률과 재질문율
Ragas 같은 프레임워크는 RAG 자동 평가를 도와주지만, 자동 평가 점수 자체도 표본 사람 평가로 검증해야 합니다.
7. 추천·검색·랭킹 평가 지표
추천 시스템은 정답을 맞히는 것보다 관련 항목을 위쪽에 배치하는 것이 중요합니다.
7.1 Precision@K와 Recall@K
- Precision@K: 상위 K개 추천 중 관련 항목의 비율
- Recall@K: 사용자가 실제로 선호한 항목 중 상위 K개에서 찾은 비율
추천 슬롯이 제한되고 잘못된 추천 비용이 크면 Precision@K가 중요합니다. 가능한 관련 항목을 최대한 넓게 찾고 싶으면 Recall@K가 중요합니다.
7.2 MRR
첫 번째 관련 결과의 순위 역수를 평균합니다.
- 1위면 1
- 2위면 0.5
- 5위면 0.2
질문에 하나의 정답이 있거나 첫 정답 위치가 중요한 검색·QA에 적합합니다.
7.3 MAP@K
관련 결과가 여러 개일 때 각 관련 결과가 등장한 지점의 Precision을 평균합니다. 관련 문서를 빠짐없이 위쪽에 배치하는 능력을 봅니다.
7.4 nDCG@K
관련도가 높은 항목을 상단에 배치할수록 높은 점수를 줍니다. 관련도가 0/1이 아니라 0~3점처럼 등급형일 때 특히 유용합니다.
7.5 정확도 외의 추천 품질
- Coverage: 얼마나 다양한 상품·콘텐츠가 노출되는가
- Diversity: 추천 목록 내부가 얼마나 다양한가
- Novelty: 사용자가 이미 아는 인기 항목만 추천하지 않는가
- Serendipity: 예상 밖이지만 유용한 항목을 제공하는가
- Calibration: 사용자 취향 분포와 추천 목록 구성이 맞는가
- Fairness: 특정 공급자나 그룹에 노출이 과도하게 집중되지 않는가
오프라인 nDCG가 좋아도 실제 클릭률이나 장기 만족도가 나빠질 수 있습니다. 최종적으로는 A/B 테스트에서 CTR, 전환율, 매출, 재방문, 이탈률과 함께 확인해야 합니다.
8. 이상 탐지 평가: 경보 정확도와 탐지 지연을 함께 본다
이상 탐지는 정상 99.9%, 이상 0.1%처럼 불균형이 극심한 경우가 많습니다.
핵심 지표
- AUPRC 또는 Average Precision
- Precision, Recall, Fβ
- False Positives per Hour/Day
- Event-level Recall
- Mean Time to Detect
- 탐지 지연 분포
센서 데이터에서 하나의 화재 이벤트가 100개의 연속 시점으로 기록되었다면 시점 단위 Recall만 계산하면 점수가 부풀려질 수 있습니다. 실제 운영에서는 다음 질문이 더 중요합니다.
- 화재 이벤트 10건 중 몇 건을 탐지했는가?
- 이벤트 시작 후 몇 초 만에 탐지했는가?
- 하루에 오경보가 몇 번 발생하는가?
- 경보를 끄거나 무시하게 만들 정도로 오경보가 많지 않은가?
Best F1 임계값은 검증 데이터에서 선택해야 하며, 테스트 데이터에서 F1이 가장 높은 지점을 찾아 보고하면 성능이 과대평가됩니다.
또한 AUROC 0.9 이상, AUPRC 0.7 이상 같은 보편적 합격 기준은 존재하지 않습니다. 양성 비율, 오류 비용, 현장 처리 능력, 기존 시스템 성능을 기준으로 목표를 정해야 합니다.
9. 강화학습과 AI 에이전트 평가
9.1 강화학습
가장 기본적인 지표는 에피소드 누적 보상입니다.
하지만 평균 보상 하나만 보고 정책을 평가하면 위험합니다.
함께 볼 항목:
- 평균·중앙값 누적 보상
- 성공률과 실패 유형
- 여러 랜덤 시드의 표준편차와 신뢰구간
- 학습 샘플 효율
- 최악 성능 또는 하위 분위수 성능
- 안전 위반 횟수
- 제약조건 위반률
- 환경 변화에 대한 강건성
강화학습에서는 보상이 곧 현실의 목표와 같지 않을 수 있습니다. 잘못 설계된 보상은 모델이 의도하지 않은 지름길을 찾는 Reward Hacking을 유발할 수 있습니다.
9.2 AI 에이전트
도구를 사용하는 LLM 에이전트는 답변 품질 외에도 실행 과정 전체를 평가해야 합니다.
- Task Success Rate
- Tool Call Success Rate
- 불필요한 도구 호출 수
- 평균 단계 수
- 오류 후 복구율
- 사용자의 개입이 필요했던 비율
- 평균·p95 지연시간
- 요청당 토큰·API 비용
- 정책 위반률과 민감정보 노출률
단순한 최종 답변 점수보다 “업무를 정확히 끝냈는가”가 핵심입니다.
10. 모델 성능에는 속도·비용·안전도 포함된다
프로덕션에서 최고 점수 모델이 최선의 모델이라는 보장은 없습니다.
| 영역 | 대표 지표 |
|---|---|
| 지연시간 | p50, p95, p99 Latency |
| 처리량 | Requests/sec, Images/sec, Tokens/sec |
| 자원 | GPU 메모리, CPU, 전력 사용량 |
| 비용 | 요청당 비용, 1,000건당 비용 |
| 안정성 | 오류율, 타임아웃률, 가용성 |
| 강건성 | 노이즈·분포 변화·공격 상황 성능 |
| 공정성 | 그룹별 Recall, FPR, Calibration |
| 보류 능력 | Coverage-Risk, Abstention Accuracy |
평균 지연시간보다 p95와 p99가 중요한 이유
평균 응답시간이 200ms여도 일부 요청이 5초 이상 걸릴 수 있습니다. 사용자가 체감하는 품질과 시스템 용량 설계에는 p95와 p99가 중요합니다.
모델이 모를 때 보류할 수 있는가
고위험 시스템은 무조건 답하는 것보다 낮은 확신에서 사람에게 넘기는 것이 안전할 수 있습니다.
- Coverage: 모델이 직접 처리한 비율
- Risk: 처리한 샘플에서의 오류율
임계값을 높이면 오류율은 줄지만 사람이 처리해야 하는 비율이 늘어납니다. 이 관계를 Coverage-Risk Curve로 평가할 수 있습니다.
전체 점수와 그룹별 점수를 함께 본다
전체 AUROC가 0.92여도 특정 연령대, 기기, 지역, 조명 조건에서는 0.65일 수 있습니다. 다음 슬라이스를 점검해야 합니다.
- 성별·연령대 등 합법적으로 평가 가능한 사용자 그룹
- 지역과 언어
- 장비·카메라·센서 종류
- 낮과 밤, 계절, 날씨
- 신규 사용자와 기존 사용자
- 데이터 품질 구간
NIST AI RMF도 AI 시스템의 타당성·신뢰성·안전성·공정성을 목적과 위험에 맞는 지표로 측정하고 배포 후 지속적으로 모니터링할 것을 강조합니다.
11. 문제별 추천 지표 빠른 선택표
| 문제 | 핵심 지표 | 보조 지표 | 반드시 확인할 것 |
|---|---|---|---|
| 일반 회귀 | MAE, RMSE | R² | 오차 분포, 이상치 |
| 수요·시계열 | MASE, WAPE | RMSE | 시간 순서 분할, 나이브 기준 |
| 균형 분류 | Accuracy | F1, Log Loss | 클래스별 성능 |
| 불균형 분류 | AUPRC, Fβ | AUROC, MCC | 양성 비율, 임계값 |
| 의료 선별 | Recall 또는 Sensitivity | Specificity, PPV, NPV | 유병률, 보정, 안전 기준 |
| 사기 탐지 | Precision, Recall, AUPRC | 탐지 금액, 오경보/일 | 조사 인력과 비용 |
| 이미지 분류 | Top-1 | Macro F1, Calibration | 클래스별 오류 |
| 객체 탐지 | AP@[.50:.95] | AP50, AP75, AR | 크기별 AP, 지연시간 |
| 세그멘테이션 | Dice, IoU | Boundary F-score | 작은 병변·객체별 성능 |
| 객체 추적 | HOTA, IDF1 | MOTA | FPS, ID 전환 |
| 번역 | BLEU | chrF/BERTScore, 사람 평가 | 토큰화와 언어 특성 |
| 요약 | ROUGE | BERTScore, 사실성 | 원문 근거와 누락 |
| LLM 챗봇 | Task Success | 사람 평가, Judge 점수 | 환각, 안전, 비용 |
| 코드 생성 | pass@1, pass@k | 실행시간, 보안 검사 | 테스트 커버리지 |
| RAG | Recall@K, Faithfulness | nDCG, Answer Correctness | 인용 정확성, 최신성 |
| 추천 | nDCG@K, Recall@K | Coverage, Diversity | 온라인 A/B 성과 |
| 이상 탐지 | AUPRC, Event Recall | 오경보/일, 탐지 지연 | 이벤트 단위 평가 |
| 강화학습 | 누적 보상, 성공률 | 분산, 안전 위반 | 여러 시드와 환경 |
12. 실전 예제 1: 암 선별 모델
전체 10,000명 중 암 환자가 100명이라고 가정합니다.
모델 A:
- Recall 99%
- Precision 10%
- 검사 대상 약 990명
모델 B:
- Recall 90%
- Precision 45%
- 검사 대상 약 200명
어떤 모델이 더 좋은지는 목적에 따라 달라집니다.
- 1차 선별에서 암을 거의 놓치지 않는 것이 목적: 모델 A
- 정밀 검사가 비싸고 처리 능력이 제한됨: 모델 B 또는 임계값 재조정
추가로 확인할 항목:
- 연령대별 Recall
- 병기별 Recall
- 확률 Calibration
- 특정 Recall에서의 Specificity
- NPV와 PPV
- 실제 유병률에서의 성능
PPV와 NPV는 유병률에 영향을 받으므로 연구 데이터와 실제 병원 환경의 환자 비율이 다르면 값도 달라질 수 있습니다.
13. 실전 예제 2: 신용카드 사기 탐지
하루 거래 100만 건 중 사기가 1,000건이라면 양성 비율은 0.1%입니다.
오프라인 평가:
- AUROC
- AUPRC
- Precision@Top-N
- 사기 금액 기준 Recall
운영 평가:
- 조사팀이 하루 처리할 수 있는 경보 수
- 경보 1건당 실제 사기 비율
- 차단한 사기 금액
- 정상 거래 오차단 금액
- 고객 불편과 이탈
건수 Recall보다 금액 Recall이 중요할 수도 있습니다. 1만 원짜리 사기 100건과 1억 원짜리 사기 1건을 같은 무게로 평가하면 비즈니스 리스크를 제대로 반영하지 못합니다.
14. 실전 예제 3: 전력 수요 예측
전력 수요는 시간 순서가 있으므로 무작위 K-Fold를 사용하면 미래 정보가 과거 학습에 섞일 수 있습니다.
권장 평가:
- 과거 구간으로 학습
- 다음 주 또는 다음 달을 예측
- 평가 시점을 앞으로 이동하는 Rolling Backtest
- 나이브 예측과 비교
지표:
- MAE 또는 RMSE
- MASE
- 피크 시간대 MAE
- 과소 예측과 과대 예측을 분리한 비용
- 예측구간 Coverage
전력 부족 비용이 과잉 확보 비용보다 크다면 대칭적인 RMSE만으로는 충분하지 않습니다. 비대칭 비용 함수나 분위수 예측을 함께 사용할 수 있습니다.
15. 실전 예제 4: 사내 문서 RAG 챗봇
RAG 챗봇이 틀린 답을 냈을 때 먼저 검색과 생성을 분리해 확인합니다.
검색 실패
정답 문서가 상위 5개에 없음
- Recall@5 개선
- 청크 크기·중첩 조정
- 검색 질의 재작성
- 임베딩·재랭커 개선
생성 실패
정답 문서는 검색됐지만 답변이 틀림
- Faithfulness
- Answer Correctness
- 지시문과 인용 형식
- 컨텍스트 길이와 노이즈
운영 실패
답변은 맞지만 너무 느리거나 비쌈
- p95 Latency
- 요청당 토큰
- 캐시 적중률
- 재질문율
- 사람 상담 전환율
RAG 품질은 단일 점수보다 검색·생성·운영의 계층형 대시보드로 관리하는 것이 좋습니다.
16. 흔한 평가 실수 12가지
실수 1. Accuracy 하나만 본다
불균형 데이터에서는 다수 클래스만 예측해도 높게 나올 수 있습니다.
실수 2. “불균형이면 무조건 AUPRC”라고 단정한다
AUROC와 AUPRC는 서로 다른 관점을 제공합니다. 양성 비율과 목적을 고려해 함께 봅니다.
실수 3. 테스트 세트에서 임계값을 최적화한다
검증 세트에서 임계값을 선택하고 테스트 세트에서는 고정합니다.
실수 4. Best F1만 보고 운영 지점을 결정한다
F1은 Precision과 Recall의 균형을 같은 비중으로 요약하지만, 실제 FP·FN 비용을 직접 반영하지는 않습니다. 실제 비용과 처리 용량을 반영해야 합니다.
실수 5. 데이터셋마다 AUPRC 숫자를 직접 비교한다
양성 비율이 다르면 기준선도 달라집니다.
실수 6. 확률 보정을 확인하지 않는다
분류는 잘해도 확률이 과신될 수 있습니다. Log Loss, Brier, Calibration Curve를 확인합니다.
실수 7. 평균만 보고 최악 구간을 숨긴다
클래스·지역·장비·시간대별 슬라이스 성능을 함께 봅니다.
실수 8. 시계열 데이터를 무작위로 나눈다
미래 데이터 누수를 막기 위해 시간 순서 분할을 사용합니다.
실수 9. 생성형 AI를 BLEU·ROUGE·FID 하나로 평가한다
자동 지표, 사실성, 사람 평가, 안전성, 비용을 조합합니다.
실수 10. 지표 목표값을 근거 없이 정한다
“AUROC 0.9 이상” 같은 보편 기준은 없습니다. 기존 시스템, 위험 허용치, 사람 성능, 비즈니스 비용으로 목표를 정합니다.
실수 11. 점수 차이의 불확실성을 무시한다
표본이 작으면 0.01 차이는 우연일 수 있습니다. 신뢰구간과 반복 평가를 사용합니다.
실수 12. 오프라인 점수가 온라인 성공을 보장한다고 믿는다
추천·검색·광고·LLM 서비스는 온라인 A/B 테스트와 실제 업무 성공률로 최종 확인합니다.
17. Python으로 주요 지표 계산하기
17.1 분류 평가
from __future__ import annotations
import numpy as np
from sklearn.metrics import (
accuracy_score,
average_precision_score,
balanced_accuracy_score,
brier_score_loss,
classification_report,
log_loss,
matthews_corrcoef,
roc_auc_score,
)
# y_true: 실제 정답(0/1)
# y_prob: 모델이 출력한 양성 확률
y_true = np.array([0, 0, 0, 1, 0, 1, 0, 0, 1, 0])
y_prob = np.array([0.02, 0.10, 0.30, 0.91, 0.20, 0.62, 0.45, 0.08, 0.72, 0.12])
threshold = 0.40
y_pred = (y_prob >= threshold).astype(int)
print("Accuracy:", accuracy_score(y_true, y_pred))
print("Balanced Accuracy:", balanced_accuracy_score(y_true, y_pred))
print("MCC:", matthews_corrcoef(y_true, y_pred))
print("AUROC:", roc_auc_score(y_true, y_prob))
print("Average Precision:", average_precision_score(y_true, y_prob))
print("Log Loss:", log_loss(y_true, y_prob))
print("Brier Score:", brier_score_loss(y_true, y_prob))
print(classification_report(y_true, y_pred, digits=3, zero_division=0))AUROC와 Average Precision은 확률 또는 점수로 계산하고, Precision·Recall·F1은 선택한 임계값의 이산 예측으로 계산합니다.
17.2 검증 세트에서 F2 임계값 선택
from __future__ import annotations
import numpy as np
from sklearn.metrics import precision_recall_curve
def choose_fbeta_threshold(
y_true: np.ndarray,
y_prob: np.ndarray,
beta: float = 2.0,
) -> tuple[float, float]:
"""검증 데이터에서 F-beta가 최대가 되는 임계값을 반환한다."""
precision, recall, thresholds = precision_recall_curve(y_true, y_prob)
# precision과 recall은 thresholds보다 원소가 하나 더 많다.
precision = precision[:-1]
recall = recall[:-1]
beta2 = beta**2
denominator = beta2 * precision + recall
fbeta = np.divide(
(1 + beta2) * precision * recall,
denominator,
out=np.zeros_like(denominator),
where=denominator > 0,
)
best_index = int(np.argmax(fbeta))
return float(thresholds[best_index]), float(fbeta[best_index])
# 이 함수에는 테스트 데이터가 아니라 검증 데이터를 넣어야 한다.
# threshold, val_f2 = choose_fbeta_threshold(y_val, p_val, beta=2.0)선택한 임계값은 테스트 세트와 운영 환경에서 그대로 적용합니다.
17.3 회귀 평가
from __future__ import annotations
import numpy as np
from sklearn.metrics import (
mean_absolute_error,
mean_absolute_percentage_error,
mean_squared_error,
r2_score,
)
y_true = np.array([100.0, 120.0, 80.0, 150.0])
y_pred = np.array([110.0, 118.0, 90.0, 130.0])
mae = mean_absolute_error(y_true, y_pred)
rmse = mean_squared_error(y_true, y_pred) ** 0.5
mape = mean_absolute_percentage_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print(f"MAE: {mae:.3f}")
print(f"RMSE: {rmse:.3f}")
print(f"MAPE: {mape * 100:.2f}%")
print(f"R²: {r2:.3f}")MAPE는 실제값이 0 또는 0에 가까운 데이터에서 사용하지 않도록 주의합니다.
18. 평가 보고서에 반드시 포함할 항목
모델 성능을 공유할 때는 점수만 붙여 넣지 말고 다음을 기록합니다.
- 모델과 데이터 버전
- 평가 데이터 기간과 표본 수
- 양성 비율 또는 클래스 분포
- 데이터 분할 방식
- 전처리와 누수 방지 방법
- 주요 지표와 보조 지표
- 임계값과 임계값 선택 기준
- 신뢰구간 또는 교차 검증 분산
- 클래스·그룹·환경별 세부 성능
- 지연시간·처리량·비용
- 알려진 실패 사례와 제한사항
- 배포 후 모니터링 기준과 재학습 조건
이 정보가 있어야 다른 사람이 결과를 재현하고, 모델이 실제 환경에 적합한지 판단할 수 있습니다.
결론: 좋은 평가 지표는 모델의 목적과 실패 비용에서 시작한다
평가 지표에는 만능 정답이 없습니다.
- Accuracy가 높아도 중요한 소수 클래스를 놓칠 수 있습니다.
- F1이 높아도 확률이 과신돼 있을 수 있습니다.
- AUROC가 높아도 실제 운영 임계값에서 오경보가 많을 수 있습니다.
- RMSE가 낮아도 피크 시간대 예측은 실패할 수 있습니다.
- BLEU·ROUGE·FID가 좋아도 사람이 보기에 틀리거나 위험한 결과일 수 있습니다.
- 오프라인 점수가 좋아도 느리고 비싸면 서비스에 배포할 수 없습니다.
실전에서 안전한 평가 순서는 다음과 같습니다.
- 해결할 업무와 실패 비용을 정의한다.
- 데이터 분할과 누수를 먼저 점검한다.
- 문제 유형에 맞는 주 지표와 보조 지표를 정한다.
- 검증 데이터에서 임계값을 선택한다.
- 테스트 데이터에서 한 번 최종 평가한다.
- 신뢰구간과 슬라이스 성능을 확인한다.
- 속도·비용·안전·공정성을 포함한다.
- 배포 후 실제 KPI와 드리프트를 지속적으로 모니터링한다.
모델의 성능은 숫자 하나가 아닙니다. 정확도, 확률의 신뢰도, 실패 비용, 운영 성능을 함께 설명할 수 있을 때 비로소 제대로 평가된 모델이라고 할 수 있습니다.
참고 자료
- scikit-learn, Model evaluation: quantifying the quality of predictions
- scikit-learn, Probability calibration
- scikit-learn, Cross-validation: evaluating estimator performance
- scikit-learn, Common pitfalls and recommended practices
- Hyndman & Athanasopoulos, Forecasting: Principles and Practice — Evaluating forecast accuracy
- Saito & Rehmsmeier, The Precision-Recall Plot Is More Informative than the ROC Plot When Evaluating Binary Classifiers on Imbalanced Datasets
https://doi.org/10.1371/journal.pone.0118432 - McDermott et al., A Closer Look at AUROC and AUPRC under Class Imbalance
- Lin et al., Microsoft COCO: Common Objects in Context
- Luiten et al., HOTA: A Higher Order Metric for Evaluating Multi-Object Tracking
- Papineni et al., BLEU: a Method for Automatic Evaluation of Machine Translation
- Lin, ROUGE: A Package for Automatic Evaluation of Summaries
- Zhang et al., BERTScore: Evaluating Text Generation with BERT
- Zheng et al., Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena
- Liu et al., G-Eval: NLG Evaluation using GPT-4 with Better Human Alignment
- Es et al., Ragas: Automated Evaluation of Retrieval Augmented Generation
- Chen et al., Evaluating Large Language Models Trained on Code
- Hessel et al., CLIPScore: A Reference-free Evaluation Metric for Image Captioning
- Bińkowski et al., Demystifying MMD GANs
- NIST, Artificial Intelligence Risk Management Framework 1.0
