Custom MAP@K evaluation metric — scores top-K classification predictions with reciprocal rank weighting for HuggingFace Trainer
Scanned 9/12/2026
Install to Claude Code
npx -y skills add wenmin-wu/ds-skills --skill map-at-k-metric --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Map At K Metric?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/wenmin-wu-map-at-k-metric)More formats (shields.io, HTML) on the badges page.
---
name: nlp-map-at-k-metric
description: Custom MAP@K evaluation metric — scores top-K classification predictions with reciprocal rank weighting for HuggingFace Trainer
domain: nlp
---
# MAP@K Metric
## Overview
Mean Average Precision at K (MAP@K) scores multi-class predictions by checking if the true label appears in the top-K predictions. The score is 1/rank if found (1.0 for rank 1, 0.5 for rank 2, etc.), 0 if not in top-K. Averages across all samples. Standard metric for classification-as-ranking tasks.
## Quick Start
```python
import numpy as np
import torch
def compute_map_at_k(eval_pred, k=3):
"""MAP@K metric compatible with HuggingFace Trainer.
Args:
eval_pred: (logits, labels) tuple from Trainer
k: number of top predictions to consider
"""
logits, labels = eval_pred
probs = torch.nn.functional.softmax(
torch.tensor(logits, dtype=torch.float32), dim=-1
).numpy()
top_k = np.argsort(-probs, axis=1)[:, :k]
score = 0.0
for i in range(len(labels)):
matches = np.where(top_k[i] == labels[i])[0]
if len(matches) > 0:
score += 1.0 / (matches[0] + 1) # reciprocal rank
return {f"map@{k}": score / len(labels)}
# Usage with HuggingFace Trainer
trainer = Trainer(
model=model,
args=training_args,
compute_metrics=lambda ep: compute_map_at_k(ep, k=3),
)
```
## Key Decisions
- **K=3**: common in Kaggle; adjust to match competition metric
- **Softmax before argsort**: converts logits to probabilities for proper ranking
- **Single-label only**: each sample has one true label; for multi-label, use per-label AP
- **metric_for_best_model**: set to "map@3" with greater_is_better=True for checkpointing
## References
- Source: [gemma2-9b-it-cv-0-945](https://www.kaggle.com/code/cdeotte/gemma2-9b-it-cv-0-945)
- Competition: MAP - Charting Student Math Misunderstandings
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!