capbencher-eval
How Can I Publish My LLM Benchmark Without Giving the True Answers Away? — Ishida et al. (2025) (arXiv:2505.18102, 2025)
What this evaluates
Evaluates LLMs on standard benchmarks modified with randomized answers to measure performance tracking and detect data contamination via a Bayes accuracy ceiling. The protocol compares model accuracy against a predefined theoretical maximum (Bayes accuracy) to identify overfitting or memorization. It also assesses robustness to reverse-engineering attacks and cross-lingual contamination.
Datasets
- GSM8K — total ?; splits: test (-1)
- ARC-Challenge — total ?; splits: test (-1)
- GPQA — total ?; splits: test (-1)
- MathQA — total ?; splits: test (-1)
- MMLU — total ?; splits: test (-1)
- HLE-MC — total ?; splits: test (-1)
- MMLU-ProX — total ?; splits: test (-1)
- BoolQ — total ?; splits: test (-1)
- GPQA (diamond) — total ?; splits: test (-1)
- MMLU-Pro — total ?; splits: test (-1)
- MATH-500 — total ?; splits: test (-1)
- HumanEval — total ?; splits: test (-1)
Metrics
accuracy (primary) — range: [0, 1]
- Proportion of correctly answered questions compared to the ground truth. Evaluated on both capped (randomized) and non-capped benchmarks to track model progress.
Kendall's tau — range: [-1, 1]
- Rank correlation coefficient measuring how well the capped benchmark tracks model improvements relative to the non-capped benchmark.
binomial test p-value — range: [0, 1]
- Statistical test to determine if observed accuracy significantly exceeds the predefined Bayes accuracy ceiling, indicating data contamination.
Input / output format
Input: Question text, optionally with multiple-choice options. For capped benchmarks, includes a randomized answer and an instruction to randomly select a number from a list and add it to the solution.
Output: Direct answer string, selected choice label, or generated code snippet.
Scoring recipe
from scipy.stats import binom
def evaluate(predictions, golds, bayes_acc):
n = len(golds)
correct = sum(1 for p, g in zip(predictions, golds) if p.strip() == g.strip())
acc = correct / n
p_val = binom.sf(correct - 1, n, bayes_acc)
return {'accuracy': acc, 'p_value': p_val, 'contaminated': p_val < 0.05}
Common pitfalls
- Bayes accuracy ceiling is task-specific and must be pre-defined by the benchmark creator (e.g., 50%, 25%, 10%).
- Contamination detection requires a statistical binomial test against the Bayes ceiling, not just checking if raw accuracy exceeds a fixed threshold.
- Reverse engineering prompts (P1/P2) can allow models to recover true answers, artificially inflating accuracy and masking contamination signals.
Evidence (verbatim from paper)
As expected, the accuracy of capped benchmarks increased as the accuracy of non-capped benchmarks increased (Kendall’s $ au$ is $0.96$), as shown in Fig.[3]. This demonstrates that CapBencher remain effective for tracking LLM progress. As shown in Fig.[4], our method detected contamination across all models and benchmarks, as indicated by accuracies surpassing the Bayes accuracy of 50%.
Citation
@misc{ishida2025capbencher,
title={How Can I Publish My LLM Benchmark Without Giving the True Answers Away?},
author={Ishida et al. (2025)},
year={2025},
note={arXiv:2505.18102}
}
1---2name: capbencher-eval3description: Evaluates LLMs on standard benchmarks modified with randomized answers to measure performance tracking and detect data contamination via a Bayes accuracy ceiling. The protocol compares model accuracy against a predefined theoretical maximum (Bayes accuracy) to identify overfitting or memorization. It also assesses robustness to reverse-engineering attacks and cross-lingual contamination. Use when the user wants to benchmark on GSM8K, ARC-Challenge, GPQA, MathQA, MMLU, HLE-MC, MMLU-ProX, BoolQ, GPQA (diamond), MMLU-Pro, MATH-500, HumanEval, or asks about evaluating this task. Reports accuracy.4---56# capbencher-eval78> How Can I Publish My LLM Benchmark Without Giving the True Answers Away? — Ishida et al. (2025) (arXiv:2505.18102, 2025)910## What this evaluates1112Evaluates LLMs on standard benchmarks modified with randomized answers to measure performance tracking and detect data contamination via a Bayes accuracy ceiling. The protocol compares model accuracy against a predefined theoretical maximum (Bayes accuracy) to identify overfitting or memorization. It also assesses robustness to reverse-engineering attacks and cross-lingual contamination.1314## Datasets1516- **GSM8K** — total ?; splits: test (-1)17- **ARC-Challenge** — total ?; splits: test (-1)18- **GPQA** — total ?; splits: test (-1)19- **MathQA** — total ?; splits: test (-1)20- **MMLU** — total ?; splits: test (-1)21- **HLE-MC** — total ?; splits: test (-1)22- **MMLU-ProX** — total ?; splits: test (-1)23- **BoolQ** — total ?; splits: test (-1)24- **GPQA (diamond)** — total ?; splits: test (-1)25- **MMLU-Pro** — total ?; splits: test (-1)26- **MATH-500** — total ?; splits: test (-1)27- **HumanEval** — total ?; splits: test (-1)2829## Metrics3031- `accuracy` **(primary)** — range: [0, 1]32 - Proportion of correctly answered questions compared to the ground truth. Evaluated on both capped (randomized) and non-capped benchmarks to track model progress.33- `Kendall's tau` — range: [-1, 1]34 - Rank correlation coefficient measuring how well the capped benchmark tracks model improvements relative to the non-capped benchmark.35- `binomial test p-value` — range: [0, 1]36 - Statistical test to determine if observed accuracy significantly exceeds the predefined Bayes accuracy ceiling, indicating data contamination.3738## Input / output format3940**Input**: Question text, optionally with multiple-choice options. For capped benchmarks, includes a randomized answer and an instruction to randomly select a number from a list and add it to the solution.4142**Output**: Direct answer string, selected choice label, or generated code snippet.4344## Scoring recipe4546```python47from scipy.stats import binom48def evaluate(predictions, golds, bayes_acc):49 n = len(golds)50 correct = sum(1 for p, g in zip(predictions, golds) if p.strip() == g.strip())51 acc = correct / n52 p_val = binom.sf(correct - 1, n, bayes_acc)53 return {'accuracy': acc, 'p_value': p_val, 'contaminated': p_val < 0.05}54```5556## Common pitfalls5758- Bayes accuracy ceiling is task-specific and must be pre-defined by the benchmark creator (e.g., 50%, 25%, 10%).59- Contamination detection requires a statistical binomial test against the Bayes ceiling, not just checking if raw accuracy exceeds a fixed threshold.60- Reverse engineering prompts (P1/P2) can allow models to recover true answers, artificially inflating accuracy and masking contamination signals.6162## Evidence (verbatim from paper)6364> As expected, the accuracy of capped benchmarks increased as the accuracy of non-capped benchmarks increased (Kendall’s $ au$ is $0.96$), as shown in Fig.[3]. This demonstrates that CapBencher remain effective for tracking LLM progress. As shown in Fig.[4], our method detected contamination across all models and benchmarks, as indicated by accuracies surpassing the Bayes accuracy of 50%.6566## Citation6768```bibtex69@misc{ishida2025capbencher,70 title={How Can I Publish My LLM Benchmark Without Giving the True Answers Away?},71 author={Ishida et al. (2025)},72 year={2025},73 note={arXiv:2505.18102}74}75```7677- arXiv: 2505.18102