- L'objet aléatoire est le tirage. Trois colonnes : le paramètre vrai (fixe, inconnu), l'estimateur (aléatoire, fonction du tirage), le tirage lui-même (p01-01, pas 2). Ici le tirage est le test set ; les deux modèles sont figés.
- SE d'une proportion. SE(p) = √(π(1−π)/n), estimé par plug-in (p01-01, pas 5). Pour π = 0,87 et n = 1 000 : 0,0106, soit 1,06 point.
- H₀ porte sur le paramètre, la p-value est une aire sous H₀ (p01-02, pas 2 et pas 3). On ne « prouve » jamais H₀ ; on la rejette ou on ne la rejette pas.
- Variance d'une différence. Var(X − Y) = Var(X) + Var(Y) − 2Cov(X, Y) (p00-02). Le terme −2Cov est tout le cas 2.
La chaîne
Le décor : une seule colonne bouge
Un test set de 1 000 lignes, deux modèles figés. Poids appris, seuils fixés, rien de stochastique à la prédiction : sur une ligne donnée, chaque modèle rend toujours la même réponse.
La colonne aléatoire n'est donc pas « les prédictions » : c'est le test set. Les deux accuracies affichées descendent du même tirage, et c'est de là que vient tout le reste.
« Ce qui varierait si je refaisais l'expérience, c'est le test set ; les deux modèles, eux, ne tirent rien. »
| modèle | justes / 1 000 | p |
|---|---|---|
| A | 872 | 0,872 |
| B | 881 | 0,881 |
| écart | +9 lignes | +0,009 |
Question posée : « B est-il meilleur ? » — donc sur un seul objet, la différence πB − πA, pas sur deux.
La différence est l'objet tronc
H₀ : πA = πB, testée par D = pB − pA. Sa variance n'est pas la somme des deux :
Convention de signe : ici D = B − A, donc D > 0 veut dire « B meilleur ». Le déroulé D2 note la différence dans l'autre sens, d = A − B ; les conclusions sont les mêmes, les signes s'inversent.
Le test non apparié jette le dernier terme. Sous H1 la covariance est positive : le jeter gonfle la variance, élargit l'intervalle et coûte de la puissance.
« Les deux modèles sont évalués sur les mêmes lignes, donc leurs erreurs sont corrélées positivement, donc la variance de la différence est plus petite que la somme des variances, donc le test non apparié manque de puissance. »
= √(1,116·10−4 + 1,048·10−4) = 0,0147
z = 0,009 / 0,0147 = 0,61 ; p ≈ 0,54. Verdict : rien du tout.
Le calcul est valide, il n'est pas faux : il répond juste à une expérience qu'on n'a pas faite (deux test sets distincts). Il a payé pour une indépendance qu'on ne consomme pas.
Apparier : seuls les désaccords portent l'information
Descendre à la ligne. Sur la ligne i, Di = Yi − Xi ∈ {−1, 0, +1} (B moins A). Les deux modèles d'accord — justes ensemble ou faux ensemble — donnent Di = 0 : ni au numérateur, ni à la variance.
Restent les désaccords : b lignes où A seul a juste, c lignes où B seul a juste. Sous H₀ les deux sortes sont équiprobables, d'où
n a disparu de la formule. Ce n'est pas un oubli, c'est l'énoncé.
« Une ligne où les deux modèles sont d'accord donne Di = 0, donc elle ne pèse ni sur l'écart ni sur sa variance, donc l'effectif informatif n'est pas 1 000 mais le nombre de désaccords, donc McNemar teste seulement si les désaccords sont équilibrés. »
| B juste | B faux | total A | |
|---|---|---|---|
| A juste | 842 | b = 30 | 872 |
| A faux | c = 39 | 89 | 128 |
| total B | 881 | 119 | 1 000 |
c − b = 9, cohérent avec les +9 lignes du pas 1. Désaccords : b + c = 69.
Les 931 lignes d'accord ne sont nulle part dans ce calcul. L'écart de 9 se lit sur 69 tirages à pile ou face, pas sur 1 000.
Lecture : ce qui décide est le dénominateur
L'écart brut est au numérateur, le nombre de désaccords au dénominateur. À écart égal, moins de désaccords fait monter le χ² : deux modèles qui divergent partout sont plus durs à départager que deux modèles quasi identiques qui penchent toujours du même côté.
C'est l'inverse de l'intuition « plus de données, plus de puissance » : ici la donnée utile, ce sont les désaccords, et ils se comptent après coup.
« L'écart est au numérateur et les désaccords au dénominateur, donc à écart égal moins de désaccords fait monter le χ², donc deux modèles proches se départagent plus facilement, donc annoncer n = 1 000 ne dit rien de la précision de la comparaison. »
Dans les deux cas : A = 872, B = 881, écart +9 lignes.
| table | b | c | b+c | χ² | p |
|---|---|---|---|---|---|
| désaccords larges | 30 | 39 | 69 | 1,17 | 0,28 |
| désaccords serrés | 5 | 14 | 19 | 4,26 | 0,039 |
Même différence observée, verdict opposé. Le seuil p = 0,05 est franchi vers b + c ≈ 21 : au-delà, 9 lignes d'écart se noient dans le bruit des désaccords.
L'écart c − b reste bloqué à 9 lignes ; seul le nombre de désaccords b + c bouge (valeurs impaires, pour que b et c restent entiers). Fais glisser : la p-value de McNemar monte, et le point passe du bon côté de la ligne rouge des 5 % vers 21 désaccords. Les deux boutons posent les deux tables du pas 4.
Bootstrap apparié : la même idée sans formule
McNemar tient au fait que D est une moyenne. Pour une métrique qui n'en est pas une — F1, AUC, taux de préférence jugé par un LLM — il n'y a pas de formule fermée. On simule alors « refaire l'expérience » : tirer 1 000 lignes avec remise, recalculer la différence, recommencer, lire la dispersion.
Une ligne tirée emporte les deux prédictions. Rééchantillonner les deux colonnes séparément effacerait la covariance et ramènerait au SE non apparié.
« Le bootstrap rejoue le tirage du test set, donc il faut retirer des lignes entières pour garder la corrélation des deux mesures, donc l'intervalle obtenu est bien celui de la différence appariée, donc on se passe de la formule là où la métrique n'est pas une moyenne. »
- Répéter 2 000 fois : tirer 1 000 indices avec remise, recalculer D sur ces lignes.
- IC à 95 % = quantiles 2,5 % et 97,5 % des 2 000 valeurs de D.
- Sur le fil rouge, l'IC retrouve la conclusion de McNemar sans jamais écrire (c−b)²/(b+c).
Ce qu'il ne voit pas. Le bootstrap rééchantillonne le tirage qu'on a. Si ce tirage a déjà servi à choisir B parmi plusieurs candidats, il tourne autour d'une valeur déjà gonflée et produit un intervalle centré au mauvais endroit. C'est exactement le pas suivant.
À quoi ressemble la sortie. p01-05 mène la recette jusqu'au bout sur son propre fil rouge — la médiane de dix latences, une statistique sans formule de SE : 1 000 rééchantillons donnent SE = 8,86 ms et l'IC percentile [119,5 ; 142,5] ms. Même geste, autre quantité : ce n'est pas la différence appariée à n = 1 000 de cette chaîne-ci, c'est l'exemple qui montre l'histogramme des rééchantillons et la lecture des quantiles.
Mécanisme complet dans p01-05 ; version pas à pas sur deux modèles dans le déroulé D2.
Le max ment tronc
Changement d'expérience : B n'est plus donné, c'est le meilleur de 40 configurations essayées sur ce test set. Sous H3 les 40 valent pareil ; le classement est alors entièrement fabriqué par le bruit du tirage.
Le score rapporté n'est plus un score, c'est un maximum de 40 variables bruitées. Un max ne peut que monter, et son espérance dépasse la valeur commune de
Le calcul de cette espérance passe par P(max ≤ t) = Φ(t/SE)k : elle est dérivée dans D3, ici on la prend telle quelle. Même mécanisme que le témoin atteignable : prendre le meilleur d'un ensemble ne peut que faire monter le chiffre affiché.
« La règle de sélection garde le plus haut des 40 scores, donc le chiffre rapporté est un maximum de variables bruitées, donc il contient la chance qui l'a fait gagner, donc un test set qui a servi à choisir ne mesure plus. »
n = 1 000, π = 0,87 pour les 40 : SE = √(0,87·0,13/1000) = 0,0106.
Le gagnant affiche 2,3 points de plus qu'il ne vaut, sans qu'aucune des 40 mesures ne soit biaisée : chacune est sans biais, c'est leur max qui ne l'est pas.
La même chose côté tests. 40 comparaisons indépendantes au seuil de 5 % : P(au moins un faux positif) = 1 − 0,9540 = 0,87. Corriger le seuil (Bonferroni, FDR) répond à cette question-là ; cela ne répare pas le score du gagnant, qui est l'affaire du pas 7.
Une seule config, annoncée d'avance
La meilleure de 40 configs qui valent toutes 0,87
Chaque tirage est un test set de 1 000 lignes, simulé par 1 000 pile ou face à 0,87 — aucune approximation normale. Trait bleu : la valeur vraie, la même pour tout le monde. Trait rouge : la moyenne des tirages effectués. En haut, une config nommée avant d'ouvrir le fichier : les deux traits se superposent. En bas, la même vérité, mais on garde le plus haut des 40 scores : la forme entière glisse d'environ 2 écarts-types à droite. Tire dans les deux, compare les décalages affichés sous chaque histogramme. Rien n'a été truqué : seul le geste « garder le meilleur » a changé.
Remède : train, validation, test
Le biais naît du jeu qui a servi à choisir. Il suffit donc que le jeu qui sert à mesurer ne soit pas celui-là : on règle et on compare sur la validation, on ouvre le test une seule fois, à la fin, pour le chiffre rapporté.
Le score de validation du gagnant reste gonflé — c'est le prix du choix, et on ne le publie pas. Le score de test, lui, est un tirage neuf, indépendant de la sélection : son bruit est centré.
« Le biais du max vient du jeu qui a servi à choisir, donc on le paie sur la validation, donc le test reste un tirage que la sélection n'a jamais vu, donc le chiffre rapporté redevient sans biais. »
| jeu | rôle | combien de fois | chiffre |
|---|---|---|---|
| train | ajuster les poids | autant qu'on veut | aucun |
| validation | choisir parmi les 40 | autant qu'on veut | 0,893 — gonflé, non publié |
| test | mesurer le retenu | une fois | ≈ 0,870 ± 2 SE |
Ce que la k-fold ne répare pas. Moyenner sur 5 folds divise le SE par √5 (0,0106 → 0,0048) et réduit le biais du max d'autant (2,3 → 1,0 point). Réduit, pas supprimé : mesurer mieux ne défait pas « choisir sur ce qu'on a mesuré ».
Biais attendu du score du gagnant, SE · E[max de k], sous H3. Monte k : la courbe grimpe vite puis s'aplatit — passer de 40 à 200 configs coûte moins cher que passer de 1 à 10. Baisse n : la courbe entière se dilate, car le biais est proportionnel au SE. Petit jeu de validation et beaucoup de configs est le pire mélange — et c'est la situation ordinaire d'un sweep d'hyperparamètres.
Où ça casse casse
Deux hypothèses portent toute la chaîne — même tirage (H1), lignes indépendantes (H2) — et elles tombent séparément.
« Apparier suppose le même tirage et McNemar suppose des lignes indépendantes, donc chacune de ces deux hypothèses a sa propre façon de tomber, donc on nomme laquelle a lâché avant de discuter le chiffre. »
- Pas le même test set. H1 tombe, il n'y a plus de paires : retour au test non apparié du pas 2. Moins puissant, mais valide — c'est de la puissance perdue, pas une erreur.
- Lignes dépendantes. H2 tombe : plusieurs lignes du même utilisateur, frames d'une même vidéo, reformulations d'une même question. L'effectif informatif est inférieur au nombre de désaccords comptés, donc b + c est surévalué et McNemar devient trop optimiste. Remède : apparier au niveau du groupe (bootstrap par cluster).
- Différence dans le bruit. z = 0,61 ne dit pas « A = B », il dit « on ne sait pas » : l'IC de la différence contient 0 mais aussi des écarts qui compteraient en production. La réponse est plus de lignes, pas une conclusion d'égalité.
- Validation trop petite. Le biais du max se reporte alors sur la validation avec un SE large (figure 3) : le classement des 40 devient du bruit, et le remède du pas 7 protège le chiffre rapporté sans protéger le choix. Mesurer proprement et choisir correctement sont deux problèmes distincts.
Résumé
- Objet aléatoire : le test set commun. Les deux mesures en descendent ensemble, leurs bruits sont corrélés, donc on apparie — le terme −2Cov n'est pas un raffinement.
- McNemar : les lignes d'accord donnent Di = 0 et sortent du calcul ; χ² = (c − b)²/(b + c), sans n.
- Même écart, moins de désaccords ⇒ plus significatif : 81/69 → p = 0,28 ; 81/19 → p = 0,039.
- Le max de k scores bruités est décalé vers le haut d'environ SE · E[max de k] : 40 configs, SE = 1,06 point ⇒ +2,3 points offerts par la chance.
- Train / validation / test : on choisit sur la validation, on mesure sur le test, ouvert une seule fois. Un test set qui a servi à choisir ne mesure plus.
Chaîne verbalisée — une prise, à voix haute
- Quel est l'objet aléatoire quand on compare A et B ?Le test set commun — les modèles sont figés. Les deux accuracies descendent du même tirage, donc leurs erreurs sont corrélées.
- Pourquoi l'appariement gagne-t-il de la puissance ?Var(D) = VarA + VarB − 2Cov : ignorer la covariance gonfle la variance. Et les lignes d'accord donnent Di = 0, elles ne pèsent nulle part.
- Que teste McNemar, avec quelle statistique ?H₀ : les deux sortes de désaccords sont équiprobables (b = c). χ² = (c − b)²/(b + c), 1 ddl ; n n'y figure pas.
- Pourquoi le meilleur de 40 configs surestime-t-il sa valeur ?Son score est un max de 40 variables bruitées, décalé de ≈ SE·E[max de 40] ≈ 2,16 SE. Chaque mesure est sans biais, leur max ne l'est pas.
- Quel protocole répare, et que ne répare-t-il pas ?Train / validation / test : on choisit sur la validation, on mesure sur le test ouvert une fois. Il protège le chiffre rapporté, pas la qualité du choix si la validation est petite.
Ponts et cartes
stats::comparaison (apparié vs non apparié, McNemar, l'effectif qui compte) · stats::multiplicite (biais du max, 1 − 0,95k, sélection sur le test) · ml::validation (train/validation/test, ce que la k-fold ne répare pas) · stats::inference (H₀ sur la différence, p-value).
Une carte qui résiste après cette chaîne est une carte à refondre, pas une section à relire.