Aller au contenu

Le cimetière — toutes les méthodes qui ont échoué

Un rapport de projet ne montre en général que ce qui a marché. C'est dommage, parce que les échecs contiennent plus d'information : un succès dit « ceci marche », un échec bien mesuré dit « ceci ne marche pas et voici pourquoi », ce qui délimite le problème.

Ce chapitre enterre proprement sept méthodes. Chacune a droit à ses mathématiques, à ses chiffres, et à une autopsie. Deux d'entre elles n'ont jamais été codées — leur mise à l'écart est un choix raisonné, présenté comme tel.

Avant tout : combien vaut un chiffre ?

Une précaution nécessaire pour lire ce qui suit. L'incertitude d'un Brier mesuré sur nos échantillons vaut, en ordre de grandeur :

Échantillon Taille Incertitude approximative du Brier
holdout complet 1 146 ± 0.005
validation interne 808 ± 0.006
segment dur de la validation 531 ± 0.007

Ce calcul suppose le modèle parfaitement calibré et prend l'écart-type des contributions individuelles \((p_i - y_i)^2\) à partir de notre propre table de calibration ; c'est une approximation, pas un test statistique.

Deux modèles comparés sur les mêmes matchs sont bien plus précisément départageables que ces chiffres ne le suggèrent — leurs erreurs sont largement communes, et seule la différence compte. Mais l'ordre de grandeur reste utile : un écart de 0.001 n'est pas un résultat, il faut soit un écart plus gros, soit la même conclusion sur deux fenêtres disjointes.

C'est précisément l'erreur commise dans le cinquième cas de ce chapitre.


1. Le stacking, acte I : cinq bases jumelles

La méthode

Le stacking consiste à empiler deux étages. À l'étage du bas, plusieurs modèles de base prédisent chacun leur probabilité. À l'étage du haut, un méta-modèle apprend à combiner ces prédictions.

Le point délicat est de fournir au méta-modèle des prédictions honnêtes : si on entraîne une base sur un match puis qu'on lui demande de le prédire, elle triche. La solution standard est l'out-of-fold : découper le train en blocs, et prédire chaque bloc avec un modèle entraîné sur les autres. Pour un problème temporel, les blocs doivent être des préfixes chronologiques — chaque bloc est prédit par un modèle ajusté sur tout ce qui le précède, jamais sur ce qui le suit (intégrité temporelle).

   bloc :  1    2    3    4    5    6    7    8    9    10
           ├────┼────┼────┼────┼────┼────┼────┼────┼────┤
   fit sur ████ →  prédit bloc 2
   fit sur █████████ →  prédit bloc 3
   fit sur ██████████████ →  prédit bloc 4
                                  …
   fit sur ███████████████████████████████ →  prédit bloc 10

Le protocole réel

L'approche stack a construit cinq modèles de base : le champion XGBoost ré-entraîné, une régression logistique sur les mêmes features, un XGBoost privé des deux ratings, un Elo à marge analytique, et le Glicko de Valve. Out-of-fold sur 10 blocs temporels (blocs 2 à 9 exploitables). Quatre méta-modèles candidats, départagés par le Brier moyen des trois derniers blocs :

Méta-modèle Brier interne
moyenne des logits XGBoost + logistique 0.2295
logistique sur 3 bases (XGB, logreg, Elo) 0.2296
logistique sur les 5 bases 0.2306
logistique sur les 5 bases, faible régularisation 0.2308

Le méta retenu est le plus simple des quatre : une moyenne de logits à deux termes.

Le résultat

Modèle Brier holdout Accuracy
Champion XGBoost 0.2329 60.0 %
Stack 0.2306 60.1 %
Bases : logistique seule 0.2310 62.0 %
Bases : XGBoost sans les ratings 0.2356 58.1 %
Bases : Elo à marge seul 0.2397 57.6 %
Bases : Glicko seul 0.2422 56.1 %

Le stack gagne 0.0023 sur le champion. C'est réel — mais très en dessous de la fourchette attendue pour un ensemble (l'ordre de grandeur habituel serait 0.005 à 0.010), et surtout : la logistique toute seule fait 0.2310, à 0.0004 du stack. Tout l'appareil à deux étages n'apporte rien qu'un modèle plat n'ait déjà.

L'autopsie : ce sont les erreurs qui doivent se décorréler

Voici le calcul qui explique tout. Supposons \(M\) modèles dont les erreurs ont la même variance \(\sigma^2\) et une corrélation deux à deux \(\rho\). La variance de l'erreur de leur moyenne vaut

\[ \operatorname{Var}\!\left(\frac{1}{M}\sum_{m=1}^{M} \varepsilon_m\right) = \sigma^2\left(\rho + \frac{1 - \rho}{M}\right) \]

Cette formule est le cœur de tout l'ensembling. Numériquement :

Corrélation \(\rho\) \(M = 2\) \(M = 6\)
0.95 0.975 \(\sigma^2\) 0.958 \(\sigma^2\)
0.50 0.750 \(\sigma^2\) 0.583 \(\sigma^2\)

Le nombre de modèles ne sert à rien si \(\rho\) est proche de 1 : quand \(\rho = 0.95\), passer de 2 à 6 modèles fait gagner 1.7 % de variance. Quand \(\rho = 0.5\), il fait gagner 17 %.

Or nos cinq bases partageaient les mêmes features. Elles voyaient la même chose, donc elles se trompaient sur les mêmes matchs : un match imprévisible (une équipe qui sort un jour de grâce) est raté par les cinq. Leur \(\rho\) était très élevé, et la formule ci-dessus fixe le plafond.

À retenir — la loi de l'ensembling

Un ensemble n'exploite pas la diversité des modèles, il exploite la décorrélation de leurs erreurs. Deux algorithmes différents sur les mêmes features produisent des erreurs très corrélées ; c'est pour cela qu'ils ne s'additionnent pas.


2. Le stacking, acte II : six familles disjointes

L'autopsie précédente désignait un coupable clair — les features partagées — et donc un remède évident : construire des bases sur des familles de features strictement disjointes. C'est ce qu'a fait lastmile.

Le protocole

Six modèles de base, sans aucune feature en commun : les horloges, les statistiques joueurs, les données de maps, l'économie des rounds, le rang HLTV, les features v2 historiques. Out-of-fold sur 6 blocs temporels. Méta-modèle logistique nourri des logits des six bases plus une mesure de dissensus (l'écart-type des six avis, qui indique quand les familles se contredisent).

C'était une bonne idée, correctement exécutée, et l'échec est sans appel.

Configuration Brier validation
stack de 6 familles disjointes (méta + dissensus) 0.2201
stack + la base à 46 features (7 bases) 0.2178
blend 50/50 du stack et du meilleur modèle plat 0.2170
modèle plat à 54 features 0.2163

Le stack n'a jamais battu le modèle plat, dans aucune de ses variantes. Ajouter le modèle plat comme septième base ne fait que le rapprocher de lui-même, sans jamais le dépasser.

L'autopsie : décorréler les features ne décorrèle pas les erreurs

C'est la leçon la plus subtile du chapitre, et elle mérite qu'on s'y arrête.

Les six familles mesurent des choses différentes — un rating TrueSkill n'est pas un ADR, qui n'est pas un win rate par map. Mais elles estiment toutes la même quantité latente : la force relative des deux équipes. Ce sont six thermomètres pointés sur le même patient. Leurs mesures diffèrent, leurs erreurs, elles, sont dominées par ce que le patient a d'imprévisible ce jour-là — et cette part-là est commune.

Il y a une seconde raison, plus mécanique. Le modèle plat à 54 features voit déjà toutes les familles simultanément. Il peut apprendre qu'un écart de rating compte davantage quand le rang HLTV le confirme — une interaction entre familles. Le stack, lui, force chaque famille à produire son avis isolément avant de les combiner : il détruit l'information croisée à l'étage du bas, et le méta-modèle ne peut pas la reconstruire à partir de six nombres.

Limite importante

Le stacking n'est pas mort en général — il domine les compétitions Kaggle depuis quinze ans. Il est mort ici, dans un cadre précis : un seul type de données, un seul mécanisme causal, un modèle plat capable d'ingérer toutes les features à la fois. Le stacking gagne quand les bases ne peuvent pas être fusionnées : sources hétérogènes (texte + image + tabulaire), échelles de temps incompatibles, ou modèles pré-entraînés qu'on ne peut pas ré-entraîner ensemble.


3. Le GBDT→LR de Facebook

La méthode

Publiée par Facebook en 2014 pour la prédiction de clics publicitaires, c'est une des recettes hybrides les plus élégantes du domaine. On entraîne d'abord un ensemble d'arbres, puis on jette leurs prédictions : on ne garde que l'identité des feuilles atteintes. Chaque arbre devient une variable catégorielle (« ce match est tombé dans la feuille 5 de l'arbre 12 »), encodée en indicatrices, et l'ensemble de ces indicatrices nourrit une régression logistique.

\[ \mathbf{x} \;\longrightarrow\; \underbrace{\big[\mathbf{1}[\text{feuille}_1 = k_1], \ldots, \mathbf{1}[\text{feuille}_T = k_T]\big]}_{\text{codage par les arbres}} \;\longrightarrow\; p = \sigma(\mathbf{w}^\top \mathbf{z} + b) \]

L'idée est séduisante : les arbres fabriquent automatiquement des non-linéarités et des interactions, la régression logistique les recombine linéairement avec une calibration propre et une régularisation sérieuse. Le meilleur des deux mondes.

Les chiffres

L'approche push l'a implémentée et réglée sur trois configurations :

Configuration Brier validation
régression logistique de référence, 40 features 0.2263
GBDT→LR, arbres de profondeur 2, \(C = 0.1\) 0.2405
GBDT→LR, arbres de profondeur 3, \(C = 0.03\) 0.2443
GBDT→LR, arbres de profondeur 3, \(C = 0.1\) 0.2559
mélange logistique + GBDT→LR (50/50) 0.2344
mélange logistique 75 % + GBDT→LR 25 % 0.2281

C'est un désastre : la meilleure configuration perd 0.0142 de Brier, soit la moitié de tout le chemin parcouru pendant la campagne entre le champion de départ (0.2330) et le leader final (0.2041). Même dilué à 25 % dans la logistique, il dégrade encore.

Honnêteté du protocole

Sur la table exploratoire du holdout, GBDT→LR marque 0.2211 et son mélange avec la logistique 0.2174 — beaucoup moins catastrophique qu'en validation, et à peu près à égalité avec le modèle finalement retenu (0.2172). Cela ne change rien à la décision, qui a été prise sur la validation avant toute mesure sur le holdout, et cela n'établit aucune supériorité. Mais l'écart entre les deux fenêtres est lui-même instructif sur la volatilité de ces mesures.

L'autopsie : des marches sur une droite

Le codage par feuilles remplace une variable continue par une variable catégorielle. Sur une relation vraiment linéaire, c'est une perte sèche à deux titres.

D'abord la discrétisation : tous les matchs d'une même feuille reçoivent la même contribution, quel que soit leur écart de rating à l'intérieur de la feuille. On approche une droite par un escalier.

Ensuite, et c'est plus grave, la perte de l'ordre : pour la régression logistique de l'étage du haut, les feuilles sont des catégories sans relation entre elles. Elle ne sait pas que la feuille 3 est « entre » la feuille 2 et la feuille 4. Chaque feuille reçoit un poids indépendant, estimé sur les seuls matchs qui y sont tombés. On remplace un modèle à 40 paramètres contraints par un modèle à plusieurs centaines de paramètres libres, sur 4 000 lignes.

Le GBDT→LR marche chez Facebook parce que leurs features brutes (identifiants d'annonceur, contextes catégoriels) n'ont aucune structure linéaire à préserver, et parce qu'ils ont des centaines de millions de lignes pour estimer les poids de feuilles. Nous avons l'inverse : une structure linéaire forte, et 4 000 lignes.


4. La calibration forcée : Platt et isotonique

La méthode

Un modèle peut classer correctement tout en annonçant de mauvais nombres. S'il dit 80 % là où la réalité est 70 %, il est surconfiant : son ordre est bon, sa calibration est mauvaise. Deux recalibrations classiques existent.

Platt scaling : on ajuste une régression logistique à une variable sur les logits du modèle,

\[ p' = \sigma\big(a \cdot \operatorname{logit}(p) + b\big) \]

où \(a\) contrôle la « pente » de confiance (\(a < 1\) rétrécit vers 0.5) et \(b\) le décalage global. Deux paramètres seulement : c'est robuste, mais ça ne corrige qu'une déformation très régulière.

Régression isotonique : on cherche la fonction croissante \(g\) qui minimise \(\sum_i (y_i - g(p_i))^2\), résolue par l'algorithme pool adjacent violators. Le résultat est une fonction en escalier, arbitrairement flexible. Beaucoup plus puissante que Platt — et beaucoup plus capable de sur-ajuster.

Le constat de départ

La table de calibration du champion sur le holdout montrait un vrai problème :

Tranche n Annoncé Réel Écart
0.5 – 0.65 459 56.7 % 55.3 % −1.4 pt
0.65 – 0.8 251 72.8 % 64.5 % −8.3 pt
0.8 – 1.0 73 84.0 % 89.0 % +5.0 pt

Huit points de surconfiance sur 251 matchs : de quoi croire à un gain facile.

Le résultat

La sélection interne, faite proprement sur les prédictions out-of-fold du train, a choisi... l'identité — c'est-à-dire aucune calibration :

Calibrateur Brier interne (champion) Brier interne (stack)
aucun 0.2280 0.2295
Platt 0.2280 0.2298
isotonique 0.2300 0.2318

Et quand on force quand même la calibration sur le holdout, pour voir :

Modèle Brut + Platt + isotonique
Champion 0.2329 0.2338 0.2346
Stack 0.2306 0.2312 0.2327

Les quatre dégradent. L'isotonique fait particulièrement mal en log-loss (0.6889 contre 0.6564 pour le champion brut), ce qui est logique : ses paliers extrêmes envoient des probabilités très proches de 0 ou 1, et la log-loss punit sévèrement une certitude fausse.

L'autopsie : une dérive de régime, pas un défaut du modèle

Le point décisif est celui-ci : la surconfiance mesurée dans le holdout n'existe pas dans les prédictions out-of-fold du train. Le modèle n'est pas structurellement surconfiant ; il l'a été sur ces six semaines-là.

Un calibrateur ne peut apprendre que ce qui est présent dans ses données d'apprentissage. Comme la déformation n'y est pas, il apprend une correction nulle (ce que fait Platt, correctement) ou du bruit (ce que fait l'isotonique). Dans les deux cas, appliquée à un holdout où la déformation existe, la correction ne corrige rien et ajoute sa propre variance.

Erreur fréquente

Regarder la table de calibration du test, y voir un défaut, et le corriger. C'est une fuite déguisée en bonne pratique : on utilise le test pour choisir un paramètre. Le seul protocole valide est celui appliqué ici — apprendre le calibrateur sur des prédictions out-of-fold du train, et le sélectionner sur ce même train, quitte à ce qu'il choisisse l'identité.

Épilogue rassurant : les leaders suivants n'ont plus jamais eu ce défaut. La table de calibration de segmodel (chapitre 3) est propre sur les six tranches. La surconfiance était bien un accident de régime, pas une maladie chronique.


5. Le rétrécissement vers 50 %

La méthode

Si un modèle est trop confiant, on peut ramener toutes ses prédictions vers 0.5 par une transformation à un seul paramètre :

\[ p' = 0.5 + s\,(p - 0.5), \qquad 0 < s \leq 1 \]

Cette transformation a une propriété remarquable : elle préserve l'ordre des prédictions et le côté de 0.5. L'accuracy est donc rigoureusement inchangée, par construction — seuls le Brier et la log-loss peuvent juger. C'est la façon la plus pure d'isoler la question « ce modèle est-il trop confiant ? ».

Il existe même un \(s\) optimal en forme fermée. En posant \(d_i = p_i - 0.5\) et \(e_i = y_i - 0.5\), le Brier vaut

\[ B(s) = \frac{1}{n}\sum_i (s\,d_i - e_i)^2 = s^2 \overline{d^2} - 2s\,\overline{de} + 0.25 \]

qui est une parabole en \(s\), minimale en

\[ s^{\star} = \frac{\overline{de}}{\overline{d^2}} = \frac{\sum_i (p_i - 0.5)(y_i - 0.5)}{\sum_i (p_i - 0.5)^2} \]

Un \(s^\star < 1\) signale un modèle surconfiant, \(s^\star > 1\) un modèle sous-confiant, et \(s^\star \approx 1\) un modèle dont l'échelle de confiance est correcte.

Les chiffres

L'approche hardcore a testé le rétrécissement seul, sur la validation interne, en visant le segment le plus difficile (matchs en ligne et Bo≥3) :

Configuration Brier global Brier segment dur
leader segmodel, sans rétrécissement 0.2147 0.2238
\(s = 0.85\) 0.2146 0.2236
\(s = 0.70\) 0.2154 0.2249

Verdict : \(s = 0.85\) est neutre à 0.0001 près, \(s = 0.70\) dégrade franchement. Le \(s^\star\) implicite est donc très proche de 1. Le leader n'est pas surconfiant sur le segment dur — l'hypothèse de départ était fausse.

L'échec instructif : un gain de validation qui ne se transfère pas

hardcore ne s'est pas arrêté là. Il a testé une seconde idée, plus intéressante : sur le noyau dur, un modèle plus simple (3 features seulement : TrueSkill, Elo à marge, rang HLTV) battrait-il le modèle riche à 54 features, par un meilleur compromis biais-variance ? Cette branche simple était mélangée au leader, puis éventuellement rétrécie — soit 110 combinaisons en validation.

En validation, l'hypothèse semblait tenir, et proprement :

Brier global Brier segment dur
leader (référence) 0.2147 0.2238
branche 3 features, \(C = 0.03\), poids 0.25 0.2135 0.2221
même branche, mais avec les 54 features 0.2148 —

Tout collait : le gain était présent sur les deux métriques, et la version « riche » de la même branche faisait pire, ce qui confirmait le raisonnement biais-variance à l'intérieur de la branche.

Puis la passe holdout, unique :

Brier global Brier dur (n = 758) Accuracy
leader segmodel (contrôle exact) 0.2041 0.2205 67.9 %
candidat hardcore 0.2042 0.2207 68.0 %

Rien. Le gain de 0.0012 mesuré en validation vaut 0.0000 sur le holdout.

L'autopsie : 110 essais sur 531 matchs

Reprenons le tableau d'incertitude du début de chapitre : sur les 531 matchs durs de la validation, l'incertitude d'un Brier est de l'ordre de 0.007. Le gain observé était de 0.0012 — un sixième de cette incertitude.

Et il n'a pas été observé une fois : il a été sélectionné comme le meilleur de 110 combinaisons. Quand on tire 110 fois dans une distribution centrée en zéro avec un écart-type de 0.007, le maximum tiré est positif et respectable par pure mécanique. Le gain sélectionné était le bruit lui-même, choisi pour son amplitude.

À retenir — la règle des trois questions

Avant de croire un gain de validation, se demander :

  1. Combien d'essais ont produit ce maximum ? (ici : 110)
  2. Quelle est l'incertitude sur l'échantillon de validation ? (ici : ±0.007)
  3. Le gain est-il grand devant cette incertitude ? (ici : six fois plus petit)

hardcore est le seul rapport de la campagne à conclure « hypothèse INFIRMÉE » et à ne pas ajouter de ligne au leaderboard. C'est aussi le plus utile.


6. La recomposition map par map

La méthode

Un match de CS2 n'est pas un événement atomique : c'est un Bo3, donc deux ou trois manches. Il y a mécaniquement deux fois plus de manches que de matchs, et prédire la manche plutôt que la série devrait donner un modèle mieux entraîné, qu'on recompose ensuite :

\[ P(\text{gagner un Bo3}) = p^2(3 - 2p), \qquad P(\text{gagner un Bo5}) = p^3(10 - 15p + 6p^2) \]

où \(p\) est la probabilité de gagner une manche. Ces formules — démontrées au chapitre 5 — supposent les manches indépendantes et de même probabilité.

Deux variantes ont été essayées. La première (H1) prédit la victoire binaire sur chaque map du veto attendu, puis compose. La seconde (H2) descend encore d'un cran : elle prédit la proportion de rounds gagnés et modélise la manche comme une course au premier à 13.

Les chiffres

push, sur la validation interne :

Configuration Brier validation
logistique de référence, niveau série 0.2263
H1 : maps binaires composées en série 0.2303
H2 : rounds fractionnaires + course au 13 0.2379
modèle map pur, sur le sous-ensemble au veto connu 0.2368
modèle de course pur 0.2416
mélange 75 % référence + 25 % H1 0.2269
mélange 75 % référence + 25 % H2 0.2281

Le premier modèle logistique du concours avait déjà fait la même expérience, sous une forme plus simple : entraîner sur des labels fractionnaires tirés des scores de série (un 2-1 compte deux victoires de manche et une défaite), puis recomposer par la binomiale. Résultat en validation croisée : 0.2309 contre 0.2303 pour la cible série, et le mélange optimal des deux donnait un poids de zéro à la version manche.

L'autopsie : deux erreurs qui se composent

Le premier problème est le veto. Pour composer les probabilités de map, il faut savoir quelles maps seront jouées — or le veto n'a lieu qu'au moment du match. Il faut donc le prédire, avec un modèle qui a sa propre erreur, et cette erreur se propage dans chacune des trois probabilités qu'on va multiplier. Un modèle bruité élevé au carré donne un modèle très bruité.

Le second problème est l'indépendance, qui est fausse. Les manches d'une même série sont corrélées : la même équipe joue, avec la même forme du jour, le même plan, le même état de nerfs. Or ignorer une corrélation positive rend la formule trop tranchée — elle attribue à la série plus de certitude qu'elle n'en a. Avec \(p = 0.6\) par manche, la formule donne 0.648 pour le Bo3 ; si les manches sont fortement corrélées, la vraie valeur est plus proche de 0.6.

C'est exactement le diagnostic du rapport logreg : « la corrélation intra-série que la binomiale ignore coûte plus que le supplément d'échantillons ne rapporte ». Et celui de push sur H2 : la course au premier à 13 « rend surconfiant ».

Le signal de map n'est pas mort, il a changé de porte

Descendre au niveau de la manche était une bonne intuition — c'est la recomposition qui est mauvaise. push a fait passer la même information par des horloges au lieu d'un modèle : TrueSkill mis à jour par map (deux fois plus de mises à jour), pi-ratings sur l'écart de rounds, Elo par map. Ces features-là ont été adoptées et font partie du leader final. Le niveau map devait entrer dans le modèle comme feature, pas comme cible.


7. Le k plus proches voisins, jamais tenté

La méthode

Le k-NN ne construit aucun modèle. Pour prédire un match, il cherche les \(k\) matchs passés les plus proches dans l'espace des features et renvoie leur taux de victoire :

\[ p(\mathbf{x}) = \frac{1}{k}\sum_{i \in \mathcal{N}_k(\mathbf{x})} y_i \]

C'est le modèle le plus intuitif qui soit : « qu'est-il arrivé les fois où la situation ressemblait à celle-ci ? ».

Pourquoi il n'a pas été essayé

Deux raisons, l'une géométrique, l'autre statistique. Il s'agit d'un raisonnement a priori, pas d'un résultat mesuré chez nous — la distinction est importante.

La malédiction de la dimension. Pour que « voisin » ait un sens, il faut que les \(k\) plus proches points soient effectivement proches. En dimension \(d\), pour capturer une fraction \(f\) du volume d'un hypercube unité, il faut un sous-cube de côté \(f^{1/d}\) :

Fraction du volume \(d = 10\) \(d = 54\)
1 % côté 0.63 côté 0.918
10 % côté 0.79 côté 0.958

En dimension 54 — la nôtre — attraper 1 % des points exige de parcourir 92 % de l'étendue de chaque feature. Les « voisins » les plus proches ne sont donc pas locaux du tout : ce sont des matchs qui ressemblent vaguement au nôtre sur tout, et précisément sur rien. Avec 10 287 matchs seulement, la situation ne peut que s'aggraver.

L'absence de pondération. Nos 54 features n'ont pas la même valeur : ts_diff porte énormément d'information, veto_n très peu. Une distance euclidienne standardisée leur donne rigoureusement le même poids ; on peut le corriger à la main, mais alors il faut estimer 54 pondérations — c'est-à-dire refaire une régression, en moins bien.

Or c'est exactement ce qu'une régression logistique régularisée fait nativement, en apprenant ses poids par maximum de vraisemblance. Devant des features déjà travaillées, déjà standardisées, à frontière quasi linéaire, le k-NN n'avait aucune propriété que le modèle en place n'ait déjà, et une faiblesse majeure qu'il n'a pas.


8. Les réseaux de neurones, écartés

Même statut : un choix raisonné, pas une mesure.

Un perceptron multicouche modeste — 54 entrées, une couche cachée de 64 neurones — compte

\[ 54 \times 64 + 64 + 64 + 1 = 3\,585 \text{ paramètres} \]

pour 10 287 lignes d'entraînement. Trois lignes par paramètre. Le modèle linéaire en compte 55, et il a fallu le régulariser sérieusement (\(C = 0.3\)) pour qu'il ne sur-ajuste pas.

Trois arguments s'ajoutent à ce comptage.

D'abord la littérature. Les comparaisons systématiques sur données tabulaires (notamment Grinsztajn, Oyallon et Varoquaux, 2022) concluent que les modèles à base d'arbres restent devant les réseaux profonds sur les jeux tabulaires de taille modeste, et que l'écart ne se referme qu'avec des volumes bien supérieurs aux nôtres. Or chez nous, les arbres perdaient déjà contre une droite.

Ensuite la convexité. La régression logistique a un optimum unique, atteint à coup sûr, reproductible à l'identique. Un réseau introduit une initialisation aléatoire, un choix d'optimiseur, un pas d'apprentissage, un nombre d'époques, une architecture — soit cinq axes de réglage supplémentaires à valider sur 808 matchs de validation. La section 5 de ce chapitre a montré ce que 110 essais font déjà sur 531 matchs.

Enfin l'argument décisif : un réseau sert à apprendre des représentations. Il est imbattable quand les features brutes n'ont pas de sens direct (pixels, caractères, signaux). Nos features ne sont pas brutes : ce sont des écarts de rating et des probabilités, c'est-à-dire des représentations déjà construites, par nous, avec du savoir métier. Il n'y avait pas de représentation à découvrir.


Le registre des décès

Méthode Mesure Cause du décès
Stack de 5 bases jumelles 0.2306 vs 0.2310 pour la logistique seule erreurs trop corrélées (\(\rho \approx 1\))
Stack de 6 familles disjointes 0.2201 / 0.2178 / 0.2170 vs 0.2163 à plat features disjointes ≠ erreurs décorrélées ; l'étage bas détruit les croisements
GBDT→LR (Facebook) 0.2405 – 0.2559 vs 0.2263 escalier sur une droite, perte de l'ordre, trop de paramètres libres
Calibration Platt 0.2329 → 0.2338 (forcée) la déformation n'existe pas dans le train : inapprenable
Calibration isotonique 0.2329 → 0.2346, log-loss 0.6564 → 0.6889 idem, plus la variance de sa flexibilité
Rétrécissement vers 50 % \(s = 0.85\) neutre, \(s = 0.70\) dégrade le leader n'est pas surconfiant : \(s^\star \approx 1\)
Branche simple sur le noyau dur val 0.2135 → holdout 0.2042 vs 0.2041 sur-ajustement de sélection : 110 essais, 531 matchs
Recomposition map par map 0.2303 – 0.2416 vs 0.2263 veto à prédire + indépendance des manches fausse
k plus proches voisins non tenté malédiction de la dimension (\(0.1^{1/54} = 0.958\))
Réseaux de neurones non tenté 3 585 paramètres pour 10 287 lignes ; rien à représenter

À retenir

L'essentiel du chapitre

  • L'ensembling exige la décorrélation des erreurs, pas la diversité des modèles ni celle des features. Formule à retenir : \(\sigma^2(\rho + (1-\rho)/M)\).
  • Un modèle plat qui voit toutes les features à la fois est difficile à battre par un empilement qui les sépare avant de les recombiner.
  • Une calibration ne peut corriger que ce qui est présent dans ses données d'apprentissage. Un défaut visible uniquement dans le test est inapprenable — et le regarder est déjà une fuite.
  • Le rétrécissement \(p' = 0.5 + s(p-0.5)\) ne touche pas l'accuracy : c'est le test le plus propre de la surconfiance, avec un optimum en forme fermée.
  • Un gain de validation plus petit que l'incertitude, sélectionné parmi des dizaines d'essais, est du bruit. C'est l'erreur la plus coûteuse du chapitre, et elle a été mesurée puis publiée.
  • Descendre en granularité (la manche) était juste ; recomposer était faux. La bonne porte d'entrée était la feature, pas la cible.

Le chapitre suivant quitte la prédiction pure pour l'usage réel du modèle : de la prédiction à la simulation.