랭킹 지표 (Ranking Metrics)
난이도: 중급
선수 지식: 정밀도-재현율
관련 문서: 정밀도-재현율 | ML 시스템 설계 패턴
핵심 요약: 검색과 추천 시스템에서는 “맞혔느냐”보다 “순서가 맞느냐”가 중요하다. 1위에 놓인 관련 결과는 10위보다 훨씬 가치가 높다. NDCG는 이 “위치에 따른 가치 감소”를 로그 함수로 반영한다. 신문 1면 헤드라인은 모든 독자가 보지만, 5면 기사는 소수만 읽는 것과 같은 원리다.
초보자를 위한 핵심 용어
섹션 제목: “초보자를 위한 핵심 용어”- 랭킹(Ranking) 문제: 맞다/아니다를 가르는 게 아니라 순서를 잘 매기는 문제. 검색 결과, 추천 목록이 대표적이다.
- 관련성(Relevance): 각 항목이 사용자 의도에 얼마나 맞는지. 0/1일 수도, 0~3점 같은 등급일 수도 있다.
- Precision@k: 상위 개 중 관련 항목의 비율. 사용자는 1페이지만 보므로 상위 몇 개만 보는 지표가 필요하다.
- MRR (Mean Reciprocal Rank): 첫 정답이 몇 번째에 나왔는지의 역수를 평균. “정답 하나만 빨리 찾으면 되는” 상황에 맞다.
- NDCG: 아래쪽 순위일수록 기여를 로그로 깎아서 더한 뒤, 이상적인 순서 대비 비율로 나눈 값. 등급형 관련성을 다룰 때 표준으로 쓰인다.
정보 검색(Information Retrieval, 대량의 문서에서 원하는 정보를 찾는 기술)과 추천 시스템(Recommendation System)에서는 단순한 분류보다 결과의 순서(ordering)가 중요하다. 사용자는 검색 결과의 첫 몇 개만 보기 때문에, 관련 있는 항목을 상위에 배치하는 것이 핵심이다.
이 문서에서는 Precision@k, Recall@k, MRR, MAP, NDCG 등 주요 랭킹 지표의 정의, 계산 방법, 그리고 적합한 사용 상황을 다룬다.
비유: 랭킹 지표는 검색 결과 1페이지를 평가하는 자다. 사용자는 1번 결과를 가장 많이 보고, 아래로 갈수록 눈길이 급격히 준다. 그러니 정답을 3번에 올려놓는 것과 30번에 처박아 두는 것은 같은 “맞힘”이 아니다. NDCG의 로그 감쇠는 이 “아래로 갈수록 덜 본다”를 수식으로 옮긴 것이다.
탄생 배경
섹션 제목: “탄생 배경”초기 정보 검색(IR) 연구에서는 문서의 관련성을 “관련(relevant)“과 “비관련(non-relevant)“의 이진(binary)으로만 판단했다. Precision과 Recall, 그리고 이들의 조합인 MAP(Mean Average Precision)는 이 이진 관련성 패러다임 위에 구축되었다.
그러나 2000년대 초, Kalervo Jarvelin과 Jaana Kekalainen은 핵심적인 관찰을 했다: 실제 검색 결과의 관련성은 이진이 아니라 등급(graded)이다. 어떤 문서는 “매우 관련”, 어떤 문서는 “약간 관련”, 어떤 문서는 “비관련”이다. 기존의 MAP는 “매우 관련”과 “약간 관련”을 같은 “관련”으로 취급하여 이 중요한 차이를 무시했다. 이 발견으로 2002년 NDCG(Normalized Discounted Cumulative Gain)가 탄생했다.
NDCG의 설계에는 사용자 행동에 대한 또 다른 중요한 통찰도 반영되어 있다: 사용자의 주목도는 상위 결과에 크게 쏠린다. 눈 추적(eye-tracking) 연구에 따르면, 검색 결과 1위는 100%의 사용자가 보지만, 2위는 약 80%, 3위는 60%, 10위는 20% 미만의 사용자만 본다. NDCG의 로그 감쇠(logarithmic discount) 함수 는 바로 이 위치에 따른 주목도 감소를 수학적으로 모델링한 것이다.
핵심 개념
섹션 제목: “핵심 개념”Precision@k와 Recall@k
섹션 제목: “Precision@k와 Recall@k”
- Precision@k: 상위 k개의 정확성
- Recall@k: 전체 관련 항목 중 상위 k개가 커버하는 비율
- 순위 내 위치는 고려하지 않음 — k개 안에 있기만 하면 됨
예시: 전체 관련 문서 5개, 상위 10개 결과 중 관련 문서가 3개 포함
- Precision@10 = 3/10 = 0.3
- Recall@10 = 3/5 = 0.6
Mean Reciprocal Rank (MRR, 평균 역순위)
섹션 제목: “Mean Reciprocal Rank (MRR, 평균 역순위)”
- : 쿼리 에 대해 첫 번째 관련 결과가 나타나는 순위
- 관련 결과가 없으면 해당 쿼리의 역순위(Reciprocal Rank, 순위의 역수) = 0
숫자로 이해하기
섹션 제목: “숫자로 이해하기”“머신러닝 입문”을 검색했을 때, 상위 5개 결과가 다음과 같다고 하자:
순위 문서 관련? Precision@k 누적 관련 수 1 ML 개요 O 1/1 = 1.0 1 2 요리 레시피 X 1/2 = 0.5 1 3 딥러닝 기초 O 2/3 = 0.67 2 4 날씨 뉴스 X 2/4 = 0.5 2 5 파이썬 튜토리얼 O 3/5 = 0.6 3
- Precision@5 = 3/5 = 0.6
- MRR = 1/1 = 1.0 (첫 관련 결과가 1위)
- AP = (1.0 + 0.67 + 0.6) / 3 = 0.756 (관련 문서가 나타난 위치에서만 Precision 계산)
예시:
| 쿼리 | 첫 관련 결과 순위 | 역순위 |
|---|---|---|
| Q1 | 1위 | 1/1 = 1.0 |
| Q2 | 3위 | 1/3 = 0.333 |
| Q3 | 5위 | 1/5 = 0.2 |
특징:
- 단순하고 해석이 쉬움
- 첫 번째 관련 결과만 고려 — 나머지 관련 결과의 순위는 무시
- 적합한 경우: 탐색 쿼리(navigational query) — 사용자가 하나의 정답을 찾을 때
Mean Average Precision (MAP)
섹션 제목: “Mean Average Precision (MAP)”쿼리별 Average Precision (AP):
- : 전체 관련 문서 수
- : 위치 에서의 Precision
- : 위치 의 항목이 관련 있으면 1, 아니면 0
- 관련 항목이 나타나는 위치에서만 Precision을 계산
상세 예시:
결과 순위: [관련, 비관련, 관련, 비관련, 관련], 전체 관련 항목 = 3
| 위치 k | 항목 | rel(k) | P(k) | P(k) x rel(k) |
|---|---|---|---|---|
| 1 | 관련 | 1 | 1/1 = 1.0 | 1.0 |
| 2 | 비관련 | 0 | 1/2 = 0.5 | 0 |
| 3 | 관련 | 1 | 2/3 = 0.667 | 0.667 |
| 4 | 비관련 | 0 | 2/4 = 0.5 | 0 |
| 5 | 관련 | 1 | 3/5 = 0.6 | 0.6 |
특징:
- 전체 순위를 고려하며, 관련 항목을 일찍 배치할수록 높은 점수
- 이진 관련성(binary relevance) 가정
- 정밀도-재현율 트레이드오프의 AP와 동일한 개념
Normalized Discounted Cumulative Gain (NDCG)
섹션 제목: “Normalized Discounted Cumulative Gain (NDCG)”등급화된 관련성(Graded Relevance, “매우 관련/약간 관련/비관련” 같은 다단계 평가)을 지원하는 지표. 현대 검색/추천에서 가장 널리 사용된다.
Discounted Cumulative Gain (DCG):
대안 공식: (관련성이 이진일 때 더 자주 사용)
Ideal DCG (IDCG): 관련성이 높은 순서대로 완벽하게 정렬했을 때의 DCG
- 범위:
- 로그 감쇠: 하위 위치의 항목은 기여가 적어짐 — 사용자의 실제 행동을 반영. 비유하자면, 신문의 1면 헤드라인은 모든 독자가 보지만, 5면 기사는 소수만 읽는 것과 같다. NDCG는 이 “주목도 감쇠”를 수학적으로 반영한다.
상세 예시:
| 위치 | 관련성 (0-3) | 기여 | ||
|---|---|---|---|---|
| 1 | 3 | 7 | 1.0 | 7.0 |
| 2 | 0 | 0 | 1.585 | 0 |
| 3 | 2 | 3 | 2.0 | 1.5 |
| 4 | 1 | 1 | 2.322 | 0.431 |
| 5 | 3 | 7 | 2.585 | 2.708 |
이상적 순서 (관련성: 3, 3, 2, 1, 0):
Hit Rate / Hit@k
섹션 제목: “Hit Rate / Hit@k”
- 전체 쿼리에 대해 평균하여 사용
- 매우 단순하지만, 추천 시스템 평가에서 자주 사용
- MRR보다 덜 세밀하지만 계산이 간단
랭킹 평가 파이프라인
섹션 제목: “랭킹 평가 파이프라인”랭킹 시스템의 평가는 쿼리부터 최종 지표 산출까지 일련의 파이프라인을 따른다. 아래 다이어그램은 이 전체 흐름과 각 단계에서 적용 가능한 지표를 보여준다.
랭킹 지표 선택 가이드
섹션 제목: “랭킹 지표 선택 가이드”어떤 랭킹 지표를 사용할지는 관련성 유형과 평가 목적에 따라 결정된다.
랭킹 지표 비교
섹션 제목: “랭킹 지표 비교”| 지표 | 관련성 유형 | 평가 범위 | 순위 위치 반영 | 주요 특징 |
|---|---|---|---|---|
| Precision@k | 이진 | 상위 k | X | 단순, 위치 무관 |
| Recall@k | 이진 | 상위 k | X | 커버리지 측정 |
| MRR | 이진 | 전체 | O (첫 항목만) | 첫 관련 결과만 평가 |
| MAP | 이진 | 전체 | O | 전체 순위 평가, 상위 보상 |
| NDCG@k | 등급화 | 상위 k | O (로그 감쇠) | 가장 범용적, 등급 관련성 |
| Hit@k | 이진 | 상위 k | X | 가장 단순 |
언제 사용하는가
섹션 제목: “언제 사용하는가”| 상황 | 추천 지표 | 이유 |
|---|---|---|
| 하나의 정답을 찾는 검색 | MRR | 첫 관련 결과의 위치가 핵심 |
| 여러 관련 문서를 찾는 검색 | MAP | 전체 관련 문서의 순위를 종합 평가 |
| 등급화된 관련성 (별점, 클릭 수 등) | NDCG | 등급 관련성 + 위치 감쇠 |
| 추천 시스템 기본 평가 | Hit@k + NDCG@k | 간단한 존재 여부 + 순위 품질 |
| 정보 검색 벤치마크 | MAP + NDCG | 표준 평가 지표 |
실전 사례
섹션 제목: “실전 사례”MAP@10 최적화의 함정: 사용자는 11-20위를 더 많이 클릭했다
섹션 제목: “MAP@10 최적화의 함정: 사용자는 11-20위를 더 많이 클릭했다”한 이커머스 추천 시스템 팀이 상품 추천 알고리즘을 개선하면서, 오프라인 평가 지표로 MAP@10을 채택했다. 논리는 간단했다: “사용자는 상위 10개 추천만 본다. 따라서 상위 10개의 품질을 최적화하면 된다.”
팀은 MAP@10을 15% 개선하는 새 알고리즘을 개발하고 A/B 테스트에 투입했다. 그러나 결과는 예상 밖이었다. 전체 클릭률(CTR)이 오히려 8% 하락한 것이다.
원인을 분석하니, 해당 플랫폼의 사용자 행동은 연구자들의 가정과 달랐다. 모바일 앱의 UI 특성상, 사용자는 상위 10개를 빠르게 스크롤한 후 “더 보기” 버튼을 눌러 11-20위 결과를 탐색하는 패턴이 두드러졌다. 새 알고리즘은 MAP@10 최적화 과정에서 상위 10개의 정확도를 높였지만, 그 과정에서 다양성(diversity)이 감소하여 비슷한 상품이 상위에 몰렸다. 사용자는 상위 10개에서 원하는 것을 찾지 못하면 “더 보기”를 눌렀는데, 11-20위의 품질도 함께 하락한 것이다.
해결책으로 팀은 평가 지표를 NDCG@20 + 다양성 지표(Intra-List Diversity)의 조합으로 변경했고, 오프라인 지표와 온라인 CTR의 상관관계가 크게 개선되었다.
교훈: 오프라인 랭킹 지표를 선택할 때, 실제 사용자의 탐색 패턴과 UI 구조를 고려해야 한다. @k의 k값 설정은 데이터 기반으로 결정해야 하며, 단일 지표 최적화는 의도치 않은 부작용을 낳을 수 있다.
직접 해보기
섹션 제목: “직접 해보기”import numpy as np
def dcg(rels): rels = np.asarray(rels, dtype=float) return np.sum((2**rels - 1) / np.log2(np.arange(2, len(rels) + 2)))
def ndcg(rels): return dcg(rels) / dcg(sorted(rels, reverse=True)) # IDCG로 정규화
good = [3, 2, 3, 0, 1] # 관련도 높은 항목이 위쪽에bad = [1, 0, 3, 2, 3] # 담긴 항목은 같고 순서만 나쁨
for name, r in [("좋은 순서", good), ("나쁜 순서", bad)]: print(f"{name}: {r} DCG={dcg(r):.3f} NDCG={ndcg(r):.3f}")
# 실행 결과:# 좋은 순서: [3, 2, 3, 0, 1] DCG=12.780 NDCG=0.957# 나쁜 순서: [1, 0, 3, 2, 3] DCG=8.500 NDCG=0.637두 목록에 담긴 항목은 완전히 같다. 순서만 바꿨을 뿐인데 NDCG가 0.957에서 0.637로 떨어진다 — 랭킹 지표가 “무엇을 담았는가”가 아니라 “어디에 놓았는가”를 본다는 뜻이다.
흔한 오해와 함정
섹션 제목: “흔한 오해와 함정”-
“오프라인 랭킹 지표가 높으면 실제 사용자 만족도도 높다” — 오프라인 지표와 온라인 지표(CTR, 체류 시간 등) 사이에는 약한 상관만 있을 수 있다. A/B 테스트로 확인해야 한다.
-
“Precision@k가 높으면 충분하다” — Precision@k는 순위 내 위치를 무시한다. 관련 항목이 k번째에 있든 1번째에 있든 같은 점수. NDCG나 MAP가 더 세밀하다.
-
“NDCG는 모든 랭킹 문제에 적합하다” — NDCG는 쿼리 독립적이므로, 쿼리 간 관련성 스케일이 다르면 해석이 어려울 수 있다. 정규화(IDCG)가 이를 완화하지만 완전하지 않다.
-
“MAP과 AP를 혼동한다” — AP는 단일 쿼리에 대한 지표, MAP는 여러 쿼리의 AP 평균이다.
-
“위치 편향(Position Bias)을 무시한다” — 훈련 데이터의 클릭은 위치 편향을 포함한다 (상위 결과가 더 많이 클릭됨). 이를 보정하지 않으면 평가가 편향된다.
-
“Cold-start 항목을 일반 항목과 같이 평가한다” — 신규 항목은 충분한 상호작용 데이터가 없으므로 별도로 평가해야 한다.
스스로 점검하기
섹션 제목: “스스로 점검하기”1. Precision@10이 같은 두 추천 목록이 실제로는 크게 다를 수 있는 이유는?
정답 보기
Precision@k는 상위 k개 안의 순서를 구분하지 않는다. 정답이 1위에 있든 10위에 있든 같은 점수다. 순서까지 반영하려면 NDCG나 MRR을 써야 한다.
2. NDCG에서 분모(IDCG)의 역할은?
정답 보기
가능한 최선의 순서일 때의 DCG로 나눠 0~1로 정규화한다. 이렇게 해야 관련 항목 수가 다른 질의들 사이의 점수를 비교할 수 있다.
3. MRR은 어떤 문제에 적합한가?
정답 보기
정답이 하나뿐이고 그것을 빨리 찾는 것이 중요한 문제다. 질의응답이나 “내가 찾던 그 문서” 검색이 그렇다. 반대로 관련 항목이 여럿인 추천에는 부적합하다.
다른 주제와의 연결
섹션 제목: “다른 주제와의 연결”- 정밀도-재현율 트레이드오프: AP는 PR 곡선 아래 면적; Precision@k, Recall@k는 분류 지표의 확장
- ROC와 AUC: AUC는 전체 순위 품질을 측정하는 또 다른 방법
- 혼동 행렬과 분류 지표: Precision, Recall의 기본 정의
- 통계적 검정: 랭킹 지표 차이의 통계적 유의성 검증