36차시. 평가 실습
퀴즈 1 — Hit Rate와 MRR 직접 계산하기
질문마다 검색된 페이지 순서(found)와 정답 페이지(gold)가 담긴 리스트를 받아 Hit Rate 와 MRR 을 계산하는 retrieval_metrics(rows) 를 만드세요. 정답 페이지가 하나도 없으면 그 질문의 역순위는 0 입니다.
빈칸 코드에서 시작합니다.
def retrieval_metrics(rows):
# 질문마다 정답 페이지가 처음 나온 순위를 찾아 Hit 과 1/순위를 모읍니다
pass
결과 보기 (예시 풀이)
def retrieval_metrics(rows):
"""검색 결과 rows 로 Hit Rate 와 MRR 을 계산합니다.
rows 의 각 항목: {"id", "found": 검색이 돌려준 페이지 순서, "gold": 정답 페이지}"""
hits = 0
rr_sum = 0.0
for r in rows:
# 정답 페이지가 처음 나온 순위를 찾습니다 (1위부터 셉니다)
rank = 0
for i, p in enumerate(r["found"], 1):
if p in r["gold"]:
rank = i
break
# 순위가 있으면 Hit, 역순위(1/순위)를 더합니다. 못 찾으면 0 입니다
if rank:
hits += 1
rr_sum += 1.0 / rank
print(f" {r['id']} 순위={rank} rr={1.0 / rank if rank else 0.0:.2f}")
n = len(rows)
return {"hit_rate": hits / n, "mrr": rr_sum / n}
# 예시 1: 다섯 질문 중 넷은 찾았고 하나(Q022)는 못 찾은 경우
rows = [
{"id": "Q001", "found": [4, 5, 2], "gold": [4]}, # 1위
{"id": "Q002", "found": [3, 5, 6], "gold": [5]}, # 2위
{"id": "Q014", "found": [4, 5, 7], "gold": [7]}, # 3위
{"id": "Q022", "found": [], "gold": [6]}, # 검색 결과 없음
{"id": "Q031", "found": [4, 2, 1], "gold": [5, 9]}, # 정답 근거를 못 찾음
]
m = retrieval_metrics(rows)
print(f"Hit Rate : {m['hit_rate'] * 100:.1f}%")
print(f"MRR : {m['mrr']:.3f}")
# 예시 2: 모두 찾긴 했지만 정답이 3~4위로 밀린 경우
late = [{"id": "A", "found": [1, 2, 9], "gold": [9]},
{"id": "B", "found": [1, 2, 3, 8], "gold": [8]}]
m2 = retrieval_metrics(late)
# Hit Rate 는 100% 인데 MRR 이 낮으면 Re-ranking 이 필요한 신호입니다
print(f"Hit Rate : {m2['hit_rate'] * 100:.1f}% MRR : {m2['mrr']:.3f}")
실행 결과
Q001 순위=1 rr=1.00
Q002 순위=2 rr=0.50
Q014 순위=3 rr=0.33
Q022 순위=0 rr=0.00
Q031 순위=0 rr=0.00
Hit Rate : 60.0%
MRR : 0.367
A 순위=3 rr=0.33
B 순위=4 rr=0.25
Hit Rate : 100.0% MRR : 0.292채점 기준: 정답이 처음 나온 순위로 역순위를 구하고, 못 찾은 질문을 0으로 넣어 평균을 내면 정답입니다.
관련 교안: 36차시 「2. 실습 ① — 검색 평가」