콘텐츠로 이동

랭킹 지표 (Ranking Metrics)

난이도: 중급
선수 지식: 정밀도-재현율
관련 문서: 정밀도-재현율 | ML 시스템 설계 패턴

핵심 요약: 검색과 추천 시스템에서는 “맞혔느냐”보다 “순서가 맞느냐”가 중요하다. 1위에 놓인 관련 결과는 10위보다 훨씬 가치가 높다. NDCG는 이 “위치에 따른 가치 감소”를 로그 함수로 반영한다. 신문 1면 헤드라인은 모든 독자가 보지만, 5면 기사는 소수만 읽는 것과 같은 원리다.

  • 랭킹(Ranking) 문제: 맞다/아니다를 가르는 게 아니라 순서를 잘 매기는 문제. 검색 결과, 추천 목록이 대표적이다.
  • 관련성(Relevance): 각 항목이 사용자 의도에 얼마나 맞는지. 0/1일 수도, 0~3점 같은 등급일 수도 있다.
  • Precision@k: 상위 kk개 중 관련 항목의 비율. 사용자는 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) 함수 1log2(i+1)\frac{1}{\log_2(i+1)}는 바로 이 위치에 따른 주목도 감소를 수학적으로 모델링한 것이다.


Precision@k=상위 k개 중 관련 항목 수k\text{Precision@k} = \frac{\text{상위 k개 중 관련 항목 수}}{k}

Recall@k=상위 k개 중 관련 항목 수전체 관련 항목 수\text{Recall@k} = \frac{\text{상위 k개 중 관련 항목 수}}{\text{전체 관련 항목 수}}

  • 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, 평균 역순위)”

MRR=1Qq=1Q1rankq\text{MRR} = \frac{1}{|Q|}\sum_{q=1}^{|Q|}\frac{1}{\text{rank}_q}

  • rankq\text{rank}_q: 쿼리 qq에 대해 첫 번째 관련 결과가 나타나는 순위
  • 관련 결과가 없으면 해당 쿼리의 역순위(Reciprocal Rank, 순위의 역수) = 0

“머신러닝 입문”을 검색했을 때, 상위 5개 결과가 다음과 같다고 하자:

순위문서관련?Precision@k누적 관련 수
1ML 개요O1/1 = 1.01
2요리 레시피X1/2 = 0.51
3딥러닝 기초O2/3 = 0.672
4날씨 뉴스X2/4 = 0.52
5파이썬 튜토리얼O3/5 = 0.63
  • Precision@5 = 3/5 = 0.6
  • MRR = 1/1 = 1.0 (첫 관련 결과가 1위)
  • AP = (1.0 + 0.67 + 0.6) / 3 = 0.756 (관련 문서가 나타난 위치에서만 Precision 계산)

예시:

쿼리첫 관련 결과 순위역순위
Q11위1/1 = 1.0
Q23위1/3 = 0.333
Q35위1/5 = 0.2

MRR=1.0+0.333+0.23=0.511\text{MRR} = \frac{1.0 + 0.333 + 0.2}{3} = 0.511

특징:

  • 단순하고 해석이 쉬움
  • 첫 번째 관련 결과만 고려 — 나머지 관련 결과의 순위는 무시
  • 적합한 경우: 탐색 쿼리(navigational query) — 사용자가 하나의 정답을 찾을 때

쿼리별 Average Precision (AP):

AP=1Rk=1nP(k)rel(k)\text{AP} = \frac{1}{R}\sum_{k=1}^{n} P(k) \cdot \text{rel}(k)

  • RR: 전체 관련 문서 수
  • P(k)P(k): 위치 kk에서의 Precision
  • rel(k)\text{rel}(k): 위치 kk의 항목이 관련 있으면 1, 아니면 0
  • 관련 항목이 나타나는 위치에서만 Precision을 계산

MAP=1Qq=1QAPq\text{MAP} = \frac{1}{|Q|}\sum_{q=1}^{|Q|} \text{AP}_q

상세 예시:

결과 순위: [관련, 비관련, 관련, 비관련, 관련], 전체 관련 항목 = 3

위치 k항목rel(k)P(k)P(k) x rel(k)
1관련11/1 = 1.01.0
2비관련01/2 = 0.50
3관련12/3 = 0.6670.667
4비관련02/4 = 0.50
5관련13/5 = 0.60.6

AP=1.0+0.667+0.63=0.756\text{AP} = \frac{1.0 + 0.667 + 0.6}{3} = 0.756

특징:

  • 전체 순위를 고려하며, 관련 항목을 일찍 배치할수록 높은 점수
  • 이진 관련성(binary relevance) 가정
  • 정밀도-재현율 트레이드오프의 AP와 동일한 개념

Normalized Discounted Cumulative Gain (NDCG)

섹션 제목: “Normalized Discounted Cumulative Gain (NDCG)”

등급화된 관련성(Graded Relevance, “매우 관련/약간 관련/비관련” 같은 다단계 평가)을 지원하는 지표. 현대 검색/추천에서 가장 널리 사용된다.

Discounted Cumulative Gain (DCG):

DCG@k=i=1k2reli1log2(i+1)\text{DCG@k} = \sum_{i=1}^{k}\frac{2^{rel_i} - 1}{\log_2(i + 1)}

대안 공식: DCG@k=i=1krelilog2(i+1)\text{DCG@k} = \sum_{i=1}^{k}\frac{rel_i}{\log_2(i + 1)} (관련성이 이진일 때 더 자주 사용)

Ideal DCG (IDCG): 관련성이 높은 순서대로 완벽하게 정렬했을 때의 DCG

NDCG@k=DCG@kIDCG@k\text{NDCG@k} = \frac{\text{DCG@k}}{\text{IDCG@k}}

  • 범위: [0,1][0, 1]
  • 로그 감쇠: 하위 위치의 항목은 기여가 적어짐 — 사용자의 실제 행동을 반영. 비유하자면, 신문의 1면 헤드라인은 모든 독자가 보지만, 5면 기사는 소수만 읽는 것과 같다. NDCG는 이 “주목도 감쇠”를 수학적으로 반영한다.

상세 예시:

위치관련성 (0-3)2rel12^{rel} - 1log2(i+1)\log_2(i+1)기여
1371.07.0
2001.5850
3232.01.5
4112.3220.431
5372.5852.708

DCG@5=7.0+0+1.5+0.431+2.708=11.639\text{DCG@5} = 7.0 + 0 + 1.5 + 0.431 + 2.708 = 11.639

이상적 순서 (관련성: 3, 3, 2, 1, 0):

IDCG@5=7.0+4.416+1.5+0.431+0=13.347\text{IDCG@5} = 7.0 + 4.416 + 1.5 + 0.431 + 0 = 13.347

NDCG@5=11.63913.347=0.872\text{NDCG@5} = \frac{11.639}{13.347} = 0.872


Hit@k={1if 상위 k에 관련 항목이 하나라도 있으면0otherwise\text{Hit@k} = \begin{cases} 1 & \text{if 상위 k에 관련 항목이 하나라도 있으면} \\ 0 & \text{otherwise} \end{cases}

  • 전체 쿼리에 대해 평균하여 사용
  • 매우 단순하지만, 추천 시스템 평가에서 자주 사용
  • MRR보다 덜 세밀하지만 계산이 간단

랭킹 시스템의 평가는 쿼리부터 최종 지표 산출까지 일련의 파이프라인을 따른다. 아래 다이어그램은 이 전체 흐름과 각 단계에서 적용 가능한 지표를 보여준다.

랭킹 평가 파이프라인 다이어그램

어떤 랭킹 지표를 사용할지는 관련성 유형과 평가 목적에 따라 결정된다.

랭킹 지표 선택 가이드 다이어그램

지표관련성 유형평가 범위순위 위치 반영주요 특징
Precision@k이진상위 kX단순, 위치 무관
Recall@k이진상위 kX커버리지 측정
MRR이진전체O (첫 항목만)첫 관련 결과만 평가
MAP이진전체O전체 순위 평가, 상위 보상
NDCG@k등급화상위 kO (로그 감쇠)가장 범용적, 등급 관련성
Hit@k이진상위 kX가장 단순

상황추천 지표이유
하나의 정답을 찾는 검색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로 떨어진다 — 랭킹 지표가 “무엇을 담았는가”가 아니라 “어디에 놓았는가”를 본다는 뜻이다.


  1. “오프라인 랭킹 지표가 높으면 실제 사용자 만족도도 높다” — 오프라인 지표와 온라인 지표(CTR, 체류 시간 등) 사이에는 약한 상관만 있을 수 있다. A/B 테스트로 확인해야 한다.

  2. “Precision@k가 높으면 충분하다” — Precision@k는 순위 내 위치를 무시한다. 관련 항목이 k번째에 있든 1번째에 있든 같은 점수. NDCG나 MAP가 더 세밀하다.

  3. “NDCG는 모든 랭킹 문제에 적합하다” — NDCG는 쿼리 독립적이므로, 쿼리 간 관련성 스케일이 다르면 해석이 어려울 수 있다. 정규화(IDCG)가 이를 완화하지만 완전하지 않다.

  4. “MAP과 AP를 혼동한다” — AP는 단일 쿼리에 대한 지표, MAP는 여러 쿼리의 AP 평균이다.

  5. “위치 편향(Position Bias)을 무시한다” — 훈련 데이터의 클릭은 위치 편향을 포함한다 (상위 결과가 더 많이 클릭됨). 이를 보정하지 않으면 평가가 편향된다.

  6. “Cold-start 항목을 일반 항목과 같이 평가한다” — 신규 항목은 충분한 상호작용 데이터가 없으므로 별도로 평가해야 한다.


1. Precision@10이 같은 두 추천 목록이 실제로는 크게 다를 수 있는 이유는?

정답 보기

Precision@k는 상위 k개 안의 순서를 구분하지 않는다. 정답이 1위에 있든 10위에 있든 같은 점수다. 순서까지 반영하려면 NDCG나 MRR을 써야 한다.

2. NDCG에서 분모(IDCG)의 역할은?

정답 보기

가능한 최선의 순서일 때의 DCG로 나눠 0~1로 정규화한다. 이렇게 해야 관련 항목 수가 다른 질의들 사이의 점수를 비교할 수 있다.

3. MRR은 어떤 문제에 적합한가?

정답 보기

정답이 하나뿐이고 그것을 빨리 찾는 것이 중요한 문제다. 질의응답이나 “내가 찾던 그 문서” 검색이 그렇다. 반대로 관련 항목이 여럿인 추천에는 부적합하다.