Aller au contenu
English

Incertitude et sous-groupes

  • Leçon 15
  • 55 min
  • Module 5 : Comparer les systèmes de façon responsable

Ce que vous saurez faire

Indiquez votre degré de certitude. Un score obtenu sur 98 cas serait un peu différent sur 98 autres cas. Vous ajouterez un intervalle autour de chaque nombre et comparerez deux systèmes cas par cas. Vous lirez aussi les sous-groupes sans vous laisser tromper par les petits groupes.

Avant de commencerCe qu’il faut savoir et avoir sous la mainEnviron 55 minutes

Ce que vous devez savoir

Ce qu’il vous faut sur votre ordinateur

  • ~/projects/eval-harness après Expériences contrôlées, avec .venv actif et numpy installé : python -m harness repeats baseline fonctionne.

Aucun compte ni aucune clé. Testé avec Python 3.12.13 sur macOS (Apple silicon). Les commandes Windows ne sont pas testées.

Deux restaurants apparaissent dans une application de cartes. Le premier a 5 étoiles, selon 4 avis. Le deuxième a 4,6 étoiles, selon 2 000 avis. Lequel est meilleur? La plupart des gens font confiance au 4,6. Quatre amis satisfaits du propriétaire peuvent donner 5 étoiles; il est plus difficile de tromper 2 000 inconnus.

Le nombre seul ne vous dit pas cela. Vous devez aussi savoir combien d’avis le soutiennent. Avec 4 avis, un seul mauvais avis de plus changerait beaucoup le score. Avec 2 000, un avis le change à peine.

Le problème : le même système, deux nombres différents

Section intitulée « Le problème : le même système, deux nombres différents »

La référence de base est un seul système : requête v2, chat-small, une exécution enregistrée. Sur les 102 cas de développement, il prend les deux bonnes décisions dans une proportion de 0,882. Sur les 98 cas réservés, la même exécution obtient 0,959. Seuls les cas ont changé, et le nombre a varié de 0,077. Les cas de développement et les cas réservés viennent des mêmes sources, répartis au hasard. Éviter la contamination montre que cet écart vient du bruit d’échantillonnage.

Comparez maintenant le candidat à la référence de base. Sur les données de développement, le candidat fait moins bien de 0,059. Sur les données réservées, il fait moins bien de 0,112. Le candidat est-il un peu moins bon, ou beaucoup moins bon? Pourrait-il même être aussi bon, mais avoir joué de malchance sur les données de développement? Une différence de 0,059 ne signifie rien sans connaître la variation qu’entraîne le hasard sur 102 cas.

Un intervalle de confiance est une plage autour d’une valeur mesurée qui montre sa variation possible due au hasard. Un intervalle à 95 % vient d’une méthode qui couvre la vraie valeur 95 fois sur 100, sur de nombreux nouveaux échantillons. Un intervalle large indique une incertitude élevée; un intervalle étroit indique une faible incertitude. C’est le « nombre d’avis » d’un résultat d’évaluation, transformé en plage que vous pouvez lire.

La taille de l’échantillon détermine une grande partie de la largeur. Voici la proportion de décisions correctes de la référence de base sur les 25, 50, 100 et 200 premiers cas. Chaque valeur a son intervalle à 95 %, calculé par le banc d’évaluation :

Cas Deux décisions correctes Intervalle à 95 % Largeur
25 0.84 0.68 à 0.96 0.28
50 0.82 0.72 à 0.92 0.20
100 0.89 0.83 à 0.95 0.12
200 0.92 0.880 à 0.955 0.075

Huit fois plus de cas donnent un intervalle presque quatre fois plus étroit. Cela vient surtout de la taille : la largeur diminue selon la racine carrée du nombre de cas. Estimer l’incertitude l’explique. Le reste vient du score lui-même, plus proche de 1 sur 200 cas, où les résultats sont moins dispersés. Les premiers cas ajoutés aident donc beaucoup, et les suivants aident moins.

Le bootstrap : créer plusieurs échantillons à partir d’un seul

Section intitulée « Le bootstrap : créer plusieurs échantillons à partir d’un seul »

Vous avez un seul jeu d’évaluation, pas plusieurs. Le bootstrap en tire de nouveaux échantillons. Choisissez des cas au hasard dans votre jeu, avec remise, jusqu’à obtenir autant de cas que dans le jeu. Certains cas apparaissent deux fois, d’autres pas du tout. Calculez le score sur ce rééchantillon. Répétez l’opération 2 000 fois. Les 95 % centraux des 2 000 scores forment l’intervalle bootstrap. Le nom vient d’une expression anglaise qui signifie se soulever en tirant sur les languettes de ses propres bottes. Les données mesurent leur propre incertitude.

Voici la méthode complète sur cinq cas. Le cas C est incorrect, les autres sont corrects, donc le score est de 0,8. Les rééchantillons ci-dessous sont les quatre premiers que le banc d’évaluation tire lui-même.

Cinq cas, A à E, avec les valeurs 1, 1, 0, 1, 1 : moyenne de 0,8. Le rééchantillon 1 tire E, A, A, D, B : moyenne de 1,0, C exclu. Le rééchantillon 2 tire C, A, B, D, B : moyenne de 0,8, E exclu. Le rééchantillon 3 tire E, D, D, E, D : moyenne de 1,0, A, B et C exclus. Le rééchantillon 4 tire A, E, D, A, B : moyenne de 1,0, C exclu. Après 2 000 rééchantillons, les moyennes sont de 0,2 dix fois, 0,4 101 fois, 0,6 411 fois, 0,8 825 fois et 1,0 653 fois. Les 95 % centraux vont de 0,4 à 1,0.
Le bootstrap sur cinq cas, avec les quatre premiers rééchantillons du banc d'évaluation (numpy, graine 2026). Un rééchantillon peut exclure le seul échec et obtenir un meilleur score que les cas réels.
Description textuelle du diagramme

Cinq cas, A à E, avec les valeurs 1, 1, 0, 1 et 1 : la moyenne est de 0,8. Chaque rééchantillon tire cinq cas au hasard, avec remise. Le rééchantillon 1 tire E, A, A, D et B : la moyenne est de 1,0, et C est exclu. Le rééchantillon 2 tire C, A, B, D et B : la moyenne est de 0,8, et E est exclu. Le rééchantillon 3 tire E, D, D, E et D : la moyenne est de 1,0, et A, B et C sont exclus. Le rééchantillon 4 tire A, E, D, A et B : la moyenne est de 1,0, et C est exclu. Après 2 000 rééchantillons, les 95 % centraux des moyennes vont de 0,4 à 1,0.

Les moyennes des 2 000 rééchantillons des cinq cas, tirés par le banc d'évaluation. Les 2,5 % les plus bas se terminent à 0,4 et les plus hauts atteignent 1,0. L'intervalle à 95 % va donc de 0,4 à 1,0.
Description textuelle du graphique

Cinq barres, une par moyenne possible. 0,2 : 10 rééchantillons. 0,4 : 101. 0,6 : 411. 0,8 : 825. 1,0 : 653. La plupart des rééchantillons se situent près de la moyenne réelle de 0,8. Mais beaucoup atteignent 1,0, et certains descendent à 0,4.

L’intervalle va de 0,4 à 1,0. Cinq cas ne permettent pas de distinguer un système correct 4 fois sur 10 d’un système toujours correct. C’est le restaurant avec 4 avis. Le banc d’évaluation fait la même chose dans harness/compare.py, avec bootstrap_mean(). En Python :

>>> from harness.compare import bootstrap_mean
>>> print(bootstrap_mean([1, 1, 0, 1, 1]))
0.800 [0.400, 1.000] (n=5)
>>> print(bootstrap_mean([1, 1, 0, 1, 1] * 20))
0.800 [0.720, 0.880] (n=100)

La même proportion, 0,8, sur 100 cas : l’intervalle va maintenant de 0,72 à 0,88. Le banc d’évaluation fixe la graine (2026), donc il donne le même intervalle chaque fois. N’importe qui peut ainsi vérifier un rapport.

L’explorateur ci-dessous utilise les résultats réels par cas des deux exécutions enregistrées, sur les 200 cas de développement et réservés. Choisissez une taille d’échantillon, tirez des rééchantillons et regardez l’intervalle se former.

Explorer

Rééchantillonnez les résultats réels du banc d'évaluation : quelle est la largeur de l'intervalle?

Échantillon
les 25 premiers
Vrais cas
0,840 (21 sur 25)
Rééchantillons
2 000
95 % du milieu
0,680 à 0,960
Banc d’évaluation, 2 000
0,680 à 0,960

Vous avez atteint 2 000 rééchantillons, autant que le banc d’évaluation en tire. Choisissez une autre taille d’échantillon pour comparer la largeur.

  • Les deux décisions justes
  • Faux (ou aucune réponse)
Dernier rééchantillon : combien de fois chaque cas a été tiré (vide = laissé de côté)T-64707 (dev, difficult) : les deux décisions justes; tiré 1 foisT-64709 (dev, needs person) : les deux décisions justes; tiré 1 foisT-64720 (dev, unanswerable) : faux : fausse alerte; tiré 2 fois2T-64740 (dev, needs person) : les deux décisions justes; tiré 1 foisT-64746 (dev, unanswerable) : les deux décisions justes; tiré 0 foisT-64761 (dev, difficult) : les deux décisions justes; tiré 2 fois2T-64777 (dev, difficult) : les deux décisions justes; tiré 0 foisT-64800 (dev, difficult) : faux : fausse alerte; tiré 0 foisT-64832 (dev, normal) : les deux décisions justes; tiré 0 foisT-64839 (dev, difficult) : les deux décisions justes; tiré 1 foisT-64852 (dev, normal) : les deux décisions justes; tiré 0 foisT-64861 (dev, boundary) : les deux décisions justes; tiré 1 foisT-64864 (dev, difficult) : les deux décisions justes; tiré 0 foisT-64873 (dev, difficult) : les deux décisions justes; tiré 1 foisT-64876 (dev, unanswerable) : faux : fausse alerte; tiré 0 foisT-64877 (dev, difficult) : les deux décisions justes; tiré 0 foisT-64944 (dev, difficult) : les deux décisions justes; tiré 1 foisT-64949 (dev, normal) : les deux décisions justes; tiré 0 foisT-64972 (dev, normal) : les deux décisions justes; tiré 2 fois2T-65003 (dev, difficult) : faux : fausse alerte; tiré 3 fois3T-65016 (dev, difficult) : les deux décisions justes; tiré 2 fois2T-65034 (dev, normal) : les deux décisions justes; tiré 1 foisT-65054 (dev, difficult) : les deux décisions justes; tiré 2 fois2T-65090 (dev, difficult) : les deux décisions justes; tiré 2 fois2T-65093 (dev, unanswerable) : les deux décisions justes; tiré 2 fois2
Dernier rééchantillon : tirages de chaque casT-64707 (dev, difficult) : les deux décisions justes; tiré 1 foisT-64709 (dev, needs person) : les deux décisions justes; tiré 1 foisT-64720 (dev, unanswerable) : faux : fausse alerte; tiré 2 fois2T-64740 (dev, needs person) : les deux décisions justes; tiré 1 foisT-64746 (dev, unanswerable) : les deux décisions justes; tiré 0 foisT-64761 (dev, difficult) : les deux décisions justes; tiré 2 fois2T-64777 (dev, difficult) : les deux décisions justes; tiré 0 foisT-64800 (dev, difficult) : faux : fausse alerte; tiré 0 foisT-64832 (dev, normal) : les deux décisions justes; tiré 0 foisT-64839 (dev, difficult) : les deux décisions justes; tiré 1 foisT-64852 (dev, normal) : les deux décisions justes; tiré 0 foisT-64861 (dev, boundary) : les deux décisions justes; tiré 1 foisT-64864 (dev, difficult) : les deux décisions justes; tiré 0 foisT-64873 (dev, difficult) : les deux décisions justes; tiré 1 foisT-64876 (dev, unanswerable) : faux : fausse alerte; tiré 0 foisT-64877 (dev, difficult) : les deux décisions justes; tiré 0 foisT-64944 (dev, difficult) : les deux décisions justes; tiré 1 foisT-64949 (dev, normal) : les deux décisions justes; tiré 0 foisT-64972 (dev, normal) : les deux décisions justes; tiré 2 fois2T-65003 (dev, difficult) : faux : fausse alerte; tiré 3 fois3T-65016 (dev, difficult) : les deux décisions justes; tiré 2 fois2T-65034 (dev, normal) : les deux décisions justes; tiré 1 foisT-65054 (dev, difficult) : les deux décisions justes; tiré 2 fois2T-65090 (dev, difficult) : les deux décisions justes; tiré 2 fois2T-65093 (dev, unanswerable) : les deux décisions justes; tiré 2 fois2
0200400600Rééchantillons0,50,550,60,650,70,750,80,850,90,951Part des cas avec les deux décisions justes, par rééchantillon0,760 : 237 rééchantillons0,840 : 410 rééchantillons0,720 : 114 rééchantillons0,800 : 357 rééchantillons0,920 : 292 rééchantillons0,880 : 358 rééchantillons0,960 : 142 rééchantillons0,680 : 38 rééchantillons1,000 : 28 rééchantillons0,640 : 18 rééchantillons0,600 : 6 rééchantillonsVrais cas 0,84095 % du milieu
0200400600Rééchantillons0,50,60,70,80,9Part juste, par rééchantillon0,760 : 237 rééchantillons0,840 : 410 rééchantillons0,720 : 114 rééchantillons0,800 : 357 rééchantillons0,920 : 292 rééchantillons0,880 : 358 rééchantillons0,960 : 142 rééchantillons0,680 : 38 rééchantillons1,000 : 28 rééchantillons0,640 : 18 rééchantillons0,600 : 6 rééchantillonsVrais cas 0,84095 % du milieu
Vos intervalles : la référence de base
CasValeur95 % du milieuLargeur
250,8400,680 à 0,9600,280
500,8200,700 à 0,9200,220
1000,8900,820 à 0,9500,130
2000,9200,880 à 0,9550,075
La référence de base (requête v2) et le candidat (requête v3), chat-small, exécution enregistrée 1, sur les 25 à 200 premiers cas des 200 cas de développement et réservés. Chaque rééchantillon tire le même nombre de cas avec remise. Le tableau conserve l'intervalle de chaque taille.
Description textuelle de l’explorateur

Les commandes permettent de choisir la taille d’échantillon : les 25, 50, 100 ou 200 premiers cas. Elles permettent aussi de choisir quoi rééchantillonner : les résultats de la référence de base ou la différence candidat moins référence de base pour chaque cas. Les boutons tirent 1 rééchantillon, 100 rééchantillons ou jusqu’à 2 000.

Une grille montre un carré par cas. Pour la référence de base, les carrés bleus indiquent deux décisions correctes, contrairement aux carrés orange. Pour la différence, le bleu signifie que le candidat fait mieux sur ce cas, l’orange moins bien, le gris pareil. Après un rééchantillonnage, le nombre dans un carré indique combien de fois le rééchantillon l’a choisi. Un carré vide représente un cas exclu.

Un histogramme recueille la valeur de chaque rééchantillon. Une ligne pointillée indique la valeur sur les cas réels, et un crochet indique les 95 % centraux. Un tableau conserve l’intervalle de chaque taille. Avec 2 000 rééchantillons, les intervalles de l’explorateur sont proches de ceux du banc d’évaluation. La référence de base : 25 cas 0.68 à 0.96; 50 cas 0.72 à 0.92; 100 cas 0.83 à 0.95; 200 cas 0.88 à 0.955. La différence : 100 cas −0.130 à +0.010, qui contient 0; 200 cas −0.135 à −0.030, qui ne le contient pas.

Trois choses à observer :

  1. La largeur diminue avec la taille. De 25 à 200 cas, l’intervalle se rétrécit d’environ 0,28 à environ 0,075.
  2. La différence exige plus de cas qu’un score seul. Sur les 100 premiers cas, l’intervalle de la différence touche encore 0. Sur 200, il ne le touche plus.
  3. Le centre reste en place, les limites bougent. Tirez 100 rééchantillons deux fois : les limites changent un peu chaque fois. Avec 2 000 rééchantillons, elles se stabilisent. Le banc d’évaluation en utilise 2 000.

Comparer sur les mêmes cas : la différence appariée

Section intitulée « Comparer sur les mêmes cas : la différence appariée »

Les deux systèmes ont répondu aux mêmes cas. Comparez-les donc cas par cas : pour chaque cas, soustrayez le résultat de la référence de base de celui du candidat. Un cas que les deux réussissent donne 0. Un cas que seul le candidat réussit donne +1, et un cas que seule la référence de base réussit donne −1. La moyenne de ces valeurs est la différence, et leur bootstrap donne un intervalle apparié. Il est plus étroit que deux intervalles séparés, car les cas faciles et difficiles sont les mêmes pour les deux systèmes. Comparer des options, dans le cours de mathématiques, explique pourquoi.

Un petit exemple avec six cas :

>>> from harness.compare import paired_difference, wins_losses
>>> base = {"A": 1, "B": 1, "C": 1, "D": 0, "E": 1, "F": 1}
>>> cand = {"A": 1, "B": 0, "C": 1, "D": 1, "E": 1, "F": 0}
>>> wins_losses(base, cand)
{'better': ['D'], 'worse': ['B', 'F'], 'same': ['A', 'C', 'E']}
>>> print(paired_difference(base, cand))
-0.167 [-0.667, 0.333] (n=6)

Trois cas ne disent rien : les deux systèmes sont d’accord. Les preuves sont dans les cas où ils diffèrent : un meilleur, deux moins bons. La différence est donc (1 − 2) ÷ 6 = −0,167, et avec six cas, son intervalle est très large. wins_losses() indique les cas derrière le nombre, pour que vous puissiez les lire.

  1. Copiez les tests du code de comparaison depuis l’instantané end-of-m05 :

    Fenêtre de terminal
    cp ../nextia-learning-labs/C11/snapshots/end-of-m05/tests/test_compare.py tests/
  2. Ouvrez tests/test_compare.py et lisez ses trois tests. La même graine donne le même intervalle. Plus de cas donnent un intervalle plus étroit. La différence appariée indique ses cas. Exécutez ensuite les tests. La dernière ligne est 37 passed (37 tests réussis) :

    Fenêtre de terminal
    python -m pytest
  3. Comparez les deux systèmes sur les données de développement :

    Fenêtre de terminal
    python -m harness compare baseline candidate
    candidate-v3-chat-small-r1-31b45f (candidate) against baseline-v2-chat-small-r1-b6a2b9 (baseline), dev, 102 cases
    decisions baseline 90 | candidate 84 | difference -0.059 [-0.127, 0.010] (n=102) | better 4, worse 10
    criteria baseline 100 | candidate 85 | difference -0.147 [-0.225, -0.078] (n=102) | better 1, worse 16
  4. Comparez-les sur le jeu réservé. Ce jeu sert à décider de la mise en production, donc le banc d’évaluation vous rappelle qu’il est figé :

    Fenêtre de terminal
    python -m harness compare baseline candidate --split holdout
    Note: the holdout set is frozen. Use it once, for the release decision.
    candidate-v3-chat-small-r1-31b45f (candidate) against baseline-v2-chat-small-r1-b6a2b9 (baseline), holdout, 98 cases
    decisions baseline 94 | candidate 83 | difference -0.112 [-0.184, -0.041] (n=98) | better 1, worse 12
    criteria baseline 96 | candidate 87 | difference -0.092 [-0.163, -0.020] (n=98) | better 2, worse 11

Voici les décisions dans un graphique : chaque système seul, puis la différence appariée sur les données de développement, réservées et combinées.

Deux décisions correctes, avec intervalles bootstrap à 95 % (2 000 rééchantillons). En haut : chaque système seul sur le jeu réservé. En bas : la différence appariée, candidat − référence de base, avec une ligne à l'absence de différence. La limite de Larkfield est de −0,03.
Description textuelle du graphique

Le panneau du haut montre chaque système sur les 98 cas réservés. La référence de base : 0.959 (0.918 à 0.99). Le candidat : 0.847 (0.776 à 0.918). Les deux intervalles ne se chevauchent pas.

Le panneau du bas montre la différence appariée, candidat moins référence de base. Une ligne pointillée indique 0, soit aucune différence. La limite de Larkfield est de −0,03. Développement, 102 cas : −0.059 [−0.127, +0.010]; l’intervalle traverse 0. Données réservées, 98 cas : −0.112 [−0.184, −0.041]; tout l’intervalle est sous −0,03. Développement et données réservées combinés, 200 cas : −0.085 [−0.135, −0.030]; tout l’intervalle est sous 0, et sa borne supérieure atteint la limite.

Lisez d’abord la ligne des données de développement. La différence est de −0,059, mais l’intervalle va de −0,127 à +0,010 : il inclut 0. Sur les seules données de développement, vous ne pouvez pas dire que le candidat prend de moins bonnes décisions. Vous pouvez dire qu’il ne fait pas mieux de plus de 0,01.

Sur les données réservées, l’intervalle va de −0,184 à −0,041. Il est entièrement sous 0, et entièrement sous la limite de −0,03 fixée par Grace et Omar au module 1. Ensemble, les 200 cas donnent −0,085, avec un intervalle de −0,135 à −0,030. Deux jeux séparés pointent dans la même direction.

Lisez ensuite les cas. « better 1, worse 12 » (1 meilleur, 12 moins bons) sur les données réservées signifie que toute la différence repose sur 13 cas. Ce sont les cas à ouvrir avec show. Un des 12 est T-65663, un billet de soutien lié à la sécurité, sans réponse. Un intervalle indique votre certitude sur l’ampleur; il ne dit pas quel cas compte le plus. La prochaine leçon traite de cela.

Un sous-groupe réunit des cas du même type : billets en français, billets nécessitant une personne, questions sans réponse dans la politique. Métriques des sorties générées a montré qu’un sous-groupe peut cacher un échec. Ces mêmes sous-groupes reçoivent maintenant des intervalles. score en affiche un par sous-groupe :

Fenêtre de terminal
python -m harness score candidate --split holdout --by slice
Note: the holdout set is frozen. Use it once, for the release decision.
candidate-v3-chat-small-r1-31b45f on holdout (98 cases)
valid answers 90/98 | team 89/97 | needs a person: caught 23/24, false alarms 7 | reply criteria passed 87/98
boundary criteria 0.714 [0.500, 0.929] (n=14)
difficult criteria 0.862 [0.724, 0.966] (n=29)
french criteria 1.000 [1.000, 1.000] (n=10)
needs_person criteria 0.952 [0.857, 1.000] (n=21)
normal criteria 0.909 [0.727, 1.000] (n=11)
unanswerable criteria 0.923 [0.769, 1.000] (n=13)

La ligne globale couvre 98 cas; chaque sous-groupe en compte de 10 à 29. Avec 14 cas limites, l’intervalle va de 0,50 à 0,93. Avec 11 cas normaux, un cas fait varier le score de 0,09. Le graphique montre la différence appariée des décisions par sous-groupe, sur les données de développement et réservées combinées (200 cas).

Candidat − référence de base, deux décisions correctes, par sous-groupe, sur les 200 cas de développement et réservés, avec intervalles bootstrap appariés à 95 %. La plupart des intervalles sont larges, et plusieurs traversent 0.
Description textuelle du graphique

Une ligne par sous-groupe, avec une ligne pointillée à 0. normal (23 cases): −0.043 [−0.174, +0.087]. boundary (28 cases): −0.107 [−0.214, 0.000]. difficult (59 cases): −0.119 [−0.220, −0.034]. French (20 cases): 0.000 [0.000, 0.000]. needs a person (43 cases): −0.047 [−0.116, 0.000]. unanswerable (27 cases): −0.148 [−0.370, +0.074]. Seul le sous-groupe difficile a un intervalle entièrement sous 0. Le sous-groupe sans réponse possible présente la plus forte baisse et l’intervalle le plus large. L’intervalle du sous-groupe français est un seul point à 0.

Trois précautions pour lire les sous-groupes :

  1. Un petit sous-groupe a un intervalle large. Le sous-groupe sans réponse possible baisse le plus, de 0,148. Mais son intervalle va de −0,370 à +0,074. Lisez les cas; n’annoncez pas le nombre.
  2. Plusieurs sous-groupes, quelques surprises dues au hasard. Avec six sous-groupes, l’un peut sembler bon ou mauvais par hasard seulement. Un sous-groupe trouvé en cherchant après avoir vu les résultats est une question pour la prochaine évaluation, pas une conclusion.
  3. Le bootstrap ne peut pas voir un échec qui n’a jamais eu lieu. Le candidat réussit les 20 cas en français. Chaque rééchantillon donne donc aussi 20 sur 20, et l’intervalle va de 1,000 à 1,000. Cela ne signifie pas qu’il ne se trompe jamais en français. Cela signifie que 20 cas n’ont montré aucun échec.

Lisez les sous-groupes comme une liste de cas à ouvrir, pas comme un classement. Les sous-groupes difficiles et sans réponse possible contiennent 15 des 22 décisions perdues par le candidat sur les données combinées. Huit de ces 15 sont des réponses coupées à la limite.

Quand utiliser les intervalles, et ce qu’ils coûtent

Section intitulée « Quand utiliser les intervalles, et ce qu’ils coûtent »

Ajoutez un intervalle à chaque nombre dont dépend une décision, et indiquez le nombre de cas à côté. C’est la protection la moins coûteuse contre une interprétation excessive d’un petit jeu. Le bootstrap ne coûte qu’une seconde de calcul sur les sorties sauvegardées. Il fonctionne pour toute mesure, même sans formule.

Utilisez la différence appariée quand les deux systèmes ont répondu aux mêmes cas, ce que garantit une expérience contrôlée. Ne l’utilisez pas pour comparer des exécutions sur des cas différents, comme les nombres du mois dernier.

Un intervalle a des limites. Il couvre le bruit d’échantillonnage, pas un jeu biaisé : si un type de billet manque, aucun intervalle ne vous avertit. Il couvre le bruit d’une exécution, pas le bruit entre exécutions vu dans Expériences contrôlées. Et il indique l’ampleur possible de la différence, pas si cette ampleur compte. La limite de −0,03 de Grace détermine cela.

Erreur courante

Faire confiance à un sous-groupe parfait

Symptôme : Tomás lit le tableau des sous-groupes : « Français : 1,000, intervalle de 1,000 à 1,000. Le candidat est parfait en français. Mettons-le au moins en production pour les billets en français. »

Cause : un sous-groupe de 20 cas sans échec. Le bootstrap rééchantillonne seulement ce qu’il a, donc il ne peut pas créer un échec jamais vu. L’intervalle se réduit à un point. Un système qui échoue sur 1 billet en français sur 10 obtiendrait quand même 20 sur 20 environ 1 fois sur 8.

Solution : présentez le sous-groupe avec sa taille : « 20 cas en français sur 20, aucun échec observé ». Une règle approximative courante : sans échec sur n cas, le taux d’échec réel peut encore atteindre environ 3 ÷ n. Ici, c’est 15 %. Pour mettre en production uniquement pour les billets en français, ajoutez des cas en français jusqu’à obtenir un intervalle assez étroit.

  1. Exécutez python -m harness compare baseline candidate --split holdout --by slice.
  2. Avant de lire la sortie, faites une prédiction : dans quel sous-groupe le candidat perd-il le plus de décisions sur les données réservées?
  3. Trouvez le sous-groupe avec la plus forte baisse et son nombre de cas. Cette baisse représente-t-elle plus d’un ou deux cas?
Afficher la sortie attendue et une réponse
Note: the holdout set is frozen. Use it once, for the release decision.
candidate-v3-chat-small-r1-31b45f (candidate) against baseline-v2-chat-small-r1-b6a2b9 (baseline), holdout, 98 cases
decisions baseline 94 | candidate 83 | difference -0.112 [-0.184, -0.041] (n=98) | better 1, worse 12
boundary baseline 0.93 candidate 0.86 (n=14)
difficult baseline 1.00 candidate 0.83 (n=29)
french baseline 1.00 candidate 1.00 (n=10)
needs_person baseline 1.00 candidate 0.95 (n=21)
normal baseline 1.00 candidate 0.91 (n=11)
unanswerable baseline 0.77 candidate 0.54 (n=13)
criteria baseline 96 | candidate 87 | difference -0.092 [-0.163, -0.020] (n=98) | better 2, worse 11
boundary baseline 1.00 candidate 0.71 (n=14)
difficult baseline 0.97 candidate 0.86 (n=29)
french baseline 1.00 candidate 1.00 (n=10)
needs_person baseline 0.95 candidate 0.95 (n=21)
normal baseline 1.00 candidate 0.91 (n=11)
unanswerable baseline 1.00 candidate 0.92 (n=13)

Pour les décisions, le sous-groupe sans réponse possible baisse le plus : de 0,77 à 0,54, sur 13 cas, soit 3 cas. Le sous-groupe difficile baisse moins, de 1,00 à 0,83, mais sur 29 cas : 5 cas. En nombre de cas, le sous-groupe difficile perd davantage. Convertissez toujours la proportion d’un sous-groupe en nombre de cas avant de comparer les sous-groupes.

À vous de jouer : les règles de réponse, sur 200 cas

Section intitulée « À vous de jouer : les règles de réponse, sur 200 cas »

La règle de mise en production du module 1 utilise les décisions. Vérifiez aussi les règles de réponse, sur les données de développement et les données réservées réunies.

  1. En Python, chargez les cas de développement et les cas réservés : [c for c in load_cases(split="all") if c.split != "contaminated"].
  2. Utilisez per_case(cases, outputs, "criteria") pour les deux exécutions, puis paired_difference() et wins_losses().
  3. Écrivez une phrase pour Omar avec la différence, son intervalle, le nombre de cas et les nombres de cas améliorés et dégradés.
Afficher un exemple de réponse
>>> from harness.dataset import load_cases
>>> from harness.run import find_run, load_outputs
>>> from harness.compare import per_case, paired_difference, wins_losses
>>> cases = [c for c in load_cases(split="all") if c.split != "contaminated"]
>>> b = per_case(cases, load_outputs(find_run("baseline")), "criteria")
>>> c = per_case(cases, load_outputs(find_run("candidate")), "criteria")
>>> print(paired_difference(b, c))
-0.120 [-0.170, -0.070] (n=200)
>>> wl = wins_losses(b, c)
>>> len(wl["better"]), len(wl["worse"])
(3, 27)

« Sur 200 cas, le candidat respecte toutes les règles de réponse sur une proportion inférieure de 0,120 à la référence de base. L’intervalle à 95 % va de 0,070 à 0,170 de moins. Il fait mieux sur 3 cas et moins bien sur 27. » Les règles de formulation ont leurs propres erreurs, comme le mot « cesser » non détecté. Lisez donc les 27 cas avant de les citer.

Vérifiez votre compréhension

Sur les données de développement, la différence des décisions est de −0,059, avec l'intervalle [−0,127, 0,010]. Tomás dit : « L'intervalle comprend 0, donc le candidat est aussi bon que la référence de base. » Qu'est-ce qui ne va pas dans ce raisonnement?

Afficher la réponse

Un intervalle qui comprend 0 signifie que les données ne permettent pas d’exclure l’absence de différence. Il ne montre pas qu’il n’y en a aucune. Le même intervalle permet une perte de 0,127. Les données réservées, avec leurs propres cas, donnent −0,112 [−0,184, −0,041], entièrement sous 0. Les deux ensembles réunis donnent −0,085 [−0,135, −0,030]. Présentez la taille de la différence et son intervalle. Utilisez plus de cas quand l’intervalle est trop large pour prendre une décision.

Vérifiez votre compréhension

Pourquoi le banc d'évaluation calcule-t-il la différence cas par cas (appariée)? Pourquoi ne pas soustraire le score de la référence de base de celui du candidat, avec deux intervalles distincts?

Afficher la réponse

Les deux systèmes ont répondu aux mêmes cas, donc les cas difficiles le sont pour les deux. La différence appariée élimine cette partie commune et ne garde que les cas où les systèmes diffèrent. Son intervalle est donc plus étroit et équitable. L’appariement indique aussi les cas derrière la différence : sur les données réservées, 1 cas amélioré et 12 dégradés. Vous pouvez les lire un par un.

Vérifiez votre compréhension

Un sous-groupe de 14 cas limites passe de 1,00 à 0,71 pour les règles de réponse. Que présentez-vous, et que faites-vous ensuite?

Afficher la réponse

Présentez le résultat avec son nombre de cas et son intervalle : 10 sur 14 contre 14 sur 14. L’intervalle du candidat va d’environ 0,50 à 0,93. Lisez ensuite les 4 cas en échec, car 14 cas ne suffisent pas pour obtenir un chiffre fiable. Dans cette exécution, 2 des 4 cas sont des réponses coupées à la limite. Traitez un sous-groupe comme une liste de cas à lire, pas comme un verdict.

Récapitulatif

  • Accompagnez chaque chiffre de sa taille d’échantillon et d’un intervalle de confiance à 95 %. Sur 25 cas, l’intervalle de la référence de base a une largeur d’environ 0,28; sur 200, environ 0,075.
  • Le bootstrap rééchantillonne vos cas avec remise, 2 000 fois; les 95 % du milieu forment l’intervalle. Cinq cas avec un échec donnent de 0,4 à 1,0.
  • La différence appariée compare les systèmes cas par cas. Développement : −0,059 [−0,127, 0,010]; données réservées : −0,112 [−0,184, −0,041]; les deux : −0,085 [−0,135, −0,030].
  • Les sous-groupes sont petits : traitez-les comme des cas à ouvrir, pas comme des verdicts. Un sous-groupe parfait de 20 cas permet encore des échecs que ces 20 cas n’ont pas révélés.

À suivre : des preuves solides montrent que le candidat est moins bon. Mais Tomás signale un juge qui le préfère, 126 contre 48. Comment la qualité, le coût, le temps et un billet de sécurité passé inaperçu mènent-ils à une seule décision?

Leçon suivante : Compromis et régressions