Tableau récapitulatif¶
Tous les chiffres du cours sur une page. Sauf mention contraire, tout est mesuré sur le même jeu de test : 1 146 matchs, les 42 derniers jours, jamais utilisés pour entraîner ni pour choisir.
Le classement final¶
| Rang | Approche | Brier | Log-loss | Exactitude | Modèle | Features |
|---|---|---|---|---|---|---|
| 1 | segmodel | 0.2041 | 0.5916 | 67,9 % | 2 logistiques L2 mélangées 75/25 | 54 |
| 2 | lastmile | 0.2044 | 0.5931 | 67,5 % | logistique L2 | 54 |
| 3 | assault | 0.2054 | 0.5954 | 66,8 % | logistique L2 | 46 |
| 4 | squeeze | 0.2154 | 0.6192 | 64,6 % | logistique L2 | 42 |
| 5 | push | 0.2172 | 0.6210 | 64,0 % | logistique L2 | 40 |
| 6 | final | 0.2180 | 0.6221 | 64,2 % | logistique L2 | 32 |
| 7 | bayes | 0.2256 | 0.6410 | 63,8 % | XGBoost + TrueSkill | 12 |
| 8 | stats | 0.2289 | 0.6469 | 62,0 % | XGBoost | 17 |
| 9 | maps | 0.2293 | 0.6474 | 59,8 % | XGBoost | 19 |
| 10 | stack | 0.2306 | 0.6515 | 60,1 % | moyenne de logits XGB + logistique | 10 |
| 11 | logreg | 0.2315 | 0.6538 | 60,4 % | logistique L2 codée à la main | 22 |
Quatre approches ne figurent pas au classement, faute d'avoir battu le leader du moment :
| Approche | Brier | Exactitude | Validation | Statut |
|---|---|---|---|---|
| gbdt (CatBoost réglé, 50 essais × 3 bibliothèques) | 0.2331 | 59,7 % | 0.22262 | pas de gain sur le champion non réglé (0.2330) |
| hardcore (branche simple sur le segment dur) | 0.2042 | 68,0 % | 0.2135 contre 0.2147 | gain de validation non transféré |
| ultimate (économie recalculée sur 12 mois) | 0.2041 | 67,9 % | 0.2157 contre 0.2147 | dégrade en validation ; candidat = leader, holdout = contrôle exact |
lastcard (wtsm, TrueSkill par carte réchauffé) |
0.2044 | 66,8 % | 0.2135 contre 0.2147 | gain de validation non transféré — « la validation mentait » |
Erreur fréquente — comparer des lignes à n différent
Trois approches du concours ont mesuré sur un échantillon légèrement
réduit, faute de couverture complète de leurs sources : stats sur
1 119 matchs, maps sur 1 141. Toutes les autres lignes portent sur
1 146. Les écarts sont faibles mais réels ; c'est une des raisons pour
lesquelles la fusion final a reconstruit une timeline commune à toutes les
familles.
Les repères¶
| Repère | Brier | Log-loss | Exactitude | Nature |
|---|---|---|---|---|
| Pièce lancée | 0.250 | 0.693 | 50 % | arithmétique |
| Glicko de Valve (baseline) | 0.2422 | 0.6772 | 56,0 % | mesuré chez nous |
| Champion v2 (XGBoost, 10 features) | 0.2330 | 0.6568 | 60,4 % | mesuré chez nous |
| Leader final (segmodel) | 0.2041 | 0.5916 | 67,9 % | mesuré chez nous |
| Bookmaker réel, 160 matchs cotés du holdout | 0.2094 | 0.6067 | 65,6 % | mesuré chez nous, cotes appariées |
| Bookmakers, tier 1 | 0.198 | — | 68,7 % | littérature, autre pool |
| Mémoire universitaire CS2 (logistique) | — | 0.62 | 65 % | littérature, autre pool |
La ligne « bookmaker réel » est le vrai palier de notre échantillon. Elle ne remplace pas la ligne de littérature — elle la situe : sur nos matchs, un opérateur réel fait 3,1 points d'exactitude de moins que le repère publié, parce que le pool n'est pas le même.
Le duel contre le marché¶
Toutes les cotes proviennent d'un seul opérateur, marché d'avant-match uniquement, dévigorisées. Le détail est dans la partie Contre le marché.
La couverture en cotes¶
| Ensemble | Matchs | Avec cote d'avant-match | Part |
|---|---|---|---|
| Holdout | 1 146 | 160 | 14 % |
| Train | 10 287 | 1 268 | 12 % |
| Total exploitable | — | 1 428 | de 2025-10 à 2026-08 |
| ~~Segment en direct, en quarantaine~~ | — | 4 975 + 67 | fuite du futur |
L'appariement initial n'en trouvait que 903 : le fichier d'historique long n'avait jamais été confronté au dataset, laissant 5 377 lignes non appariées et 525 matchs cotés invisibles.
Les mesures successives, et leurs retournements¶
| Chantier | Pool | n | Nous | Marché | \(P\)(nous meilleurs) |
|---|---|---|---|---|---|
odds |
holdout coté | 160 | 0.2138 | 0.2094 | 28,5 % |
vsmarket |
+ train out-of-fold | 903 | 0.2112 | 0.2131 | 73,8 % |
oddsmax |
appariement élargi | 1 159 | 0.2123 | 0.2097 | 20,6 % |
oddsmax |
les 256 matchs ajoutés | 256 | 0.2162 | 0.1974 | 0,3 % |
fairfight |
armes égales, couverture totale | 1 428 | 0.2239 | 0.2076 | 0,0 % |
fairfight |
armes égales, force maximale | 804 | 0.2130 | 0.2127 | 47,1 % |
Aucune configuration ne porte \(P(\text{nous meilleurs})\) au-dessus de 95 %.
Le biais de taille d'entraînement, chiffré¶
Échantillon fixe de 804 matchs ; seule la fenêtre de fit change. Le marché est invariant par construction.
| Fenêtre \(N\) | Notre Brier | Brier du marché | \(P\)(nous meilleurs) |
|---|---|---|---|
| 1 209 | 0.2234 | 0.2127 | 1,1 % |
| 2 000 | 0.2210 | 0.2127 | 1,9 % |
| 3 000 | 0.2179 | 0.2127 | 9,1 % |
| 4 000 | 0.2158 | 0.2127 | 20,7 % |
| 6 000 | 0.2130 | 0.2127 | 47,1 % |
Quintupler la fenêtre nous rend 0.0104 de Brier, monotonement.
La cote comme information supplémentaire¶
| Variante | Brier out-of-fold | Brier holdout complet |
|---|---|---|
leader segmodel (base) |
0.2072 | 0.2041 |
| + cote en feature | 0.2073 | 0.2041 |
| + cote et interactions | 0.2081 | 0.2046 |
| deux régimes, mélange de logits \(w = 0{,}38\) | — | 0.2036 |
Le mélange à deux régimes gagne 0.0005 (\(P = 93{,}6\,\%\)) et perd 0,2 point d'exactitude : départage nominal. En réglant \(w\) a posteriori sur le holdout, le mieux atteignable est 0.2087 contre 0.2094 pour le marché seul — le supplément d'information du modèle vaut 0.0007 de Brier.
Le pool comparable défini a priori (bookpool)¶
Définitions figées et horodatées à 11:51:56 UTC ; première métrique à 11:51:57. Le modèle n'est pas ré-entraîné : seule l'évaluation est restreinte.
| Pool | n | Exactitude | Brier | Log-loss | Ancre Glicko | Apport |
|---|---|---|---|---|---|---|
| D0 global | 1 146 | 67,9 % | 0.2041 | 0.5916 | 59,1 % | +8,8 pts |
| D1 enjeu ≥ 50 k$ | 398 | 70,9 % | 0.1933 | 0.5674 | 61,6 % | +9,3 pts |
| D2 notoriété top-100 | 278 | 66,2 % | 0.2202 | 0.6337 | 55,0 % | +11,2 pts |
| D3 LAN | 380 | 74,7 % | 0.1722 | 0.5156 | 61,8 % | +12,9 pts |
| D4 enjeu ∧ notoriété | 226 | 66,8 % | 0.2178 | 0.6294 | 55,3 % | +11,5 pts |
| D5 top-30 strict | 48 | 58,3 % | 0.2380 | 0.6739 | 54,2 % | +4,2 pts |
L'exactitude de l'ancre donnée ici (59,1 % sur D0) n'est pas produite par la même mesure que la baseline Glicko de 56,0 % du tableau des repères ; seuls ses écarts entre pools sont utilisés.
Un spécialiste entraîné sur le seul pool comparable ne sauve rien : 0.2195 contre 0.2178 sur D4, 0.2269 contre 0.2202 sur D2.
L'angle mort de l'exactitude (maxacc)¶
| Mesure | Valeur |
|---|---|
| Seuil optimal en validation | \(t^\star = 0{,}530\) |
| Effet de ce seuil en holdout | −1,83 point (67,89 % → 66,06 %) |
| Optimum a posteriori du holdout | \(t = 0{,}485\), 68,59 % (inutilisable) |
| IC 95 % de l'exactitude du leader | [65,27 ; 70,59], demi-largeur ±2,66 pt |
| Meilleur objectif orienté exactitude (SVM hinge) | 67,28 % pour un Brier de 0.2180 |
Déplacer le seuil ne change ni le Brier ni la log-loss : les deux lignes concernées affichent 0.2041 / 0.5916 à l'identique.
Les horloges de force en prédicteurs purs¶
Sans aucun modèle par-dessus : la probabilité vient directement de l'horloge.
| Horloge | Brier | Commentaire |
|---|---|---|
| Glicko de Valve (RD figé à 75) | 0.2422 | la baseline officielle |
| Elo à marge | 0.2398 | meilleure horloge simple mesurée |
| Glicko-2 complet (\(\tau = 0{,}3\), période 7 j) | 0.2365 | l'incertitude rendue vivante |
| TrueSkill par joueur (\(\beta = 25/4\)) | 0.2354 | les ratings suivent les transferts |
Le chiffre de l'Elo à marge vient du commentaire de vrs/predict.py, qui situe
le Glicko de Valve à 0.2423 sur la même mesure ; les autres lignes viennent des
rapports d'approche, où Valve est à 0.2422. L'écart d'un dix-millième est un
arrondi, pas un désaccord.
Injectées dans le modèle du champion, les mêmes horloges donnent : Glicko-2 → 0.2310, TrueSkill → 0.2256. Les deux ensemble ne font pas mieux que TrueSkill seul (0.2258).
La décomposition des gains¶
Les 0.0381 point de Brier gagnés entre la baseline Glicko et le leader final.
| Contribution | Gain | Part |
|---|---|---|
| Features d'équipe de base + Elo à marge | −0.0092 | 24 % |
| Les trois familles du concours + passage au linéaire | −0.0150 | 39 % |
| Horloges de la littérature (pi, TrueSkill par carte, momentum) | −0.0008 | 2 % |
| Rang mondial daté (horloge externe longue durée) | −0.0018 | 5 % |
| Réchauffage des horloges + économie par manche + préchauffage externe | −0.0100 | 26 % |
| Interactions « équipes bien connues » | −0.0010 | 3 % |
| Mélange par segment | −0.0003 | 1 % |
| Total | −0.0381 | 100 % |
Le détail du saut d'assault¶
Mesuré en une seule passe de holdout, tableau pré-enregistré.
| Étape | Brier | Exactitude | Gain marginal |
|---|---|---|---|
| Reproduction de squeeze (états froids, train 6 mois) | 0.2153 | 64,6 % | — |
| États natifs réchauffés (fenêtre 12 mois) | 0.2081 | 66,2 % | −0.0072 |
| + entraînement étendu à 12 mois | 0.2078 | 66,3 % | −0.0003 |
| + économie par manche seule | 0.2064 | 66,7 % | −0.0017 |
| + préchauffage externe seul | 0.2063 | 66,4 % | −0.0018 |
| Combiné, retenu en validation | 0.2054 | 66,8 % | — |
La carte des segments¶
Découpage a posteriori de la passe unique de holdout du leader. Aucun réentraînement.
| Segment | n | Brier | Exactitude |
|---|---|---|---|
Horloges froides (inf = 0) |
244 | 0.1591 | 75,0 % |
| LAN | 380 | 0.1722 | 74,7 % |
| Bo1 | 60 | 0.1729 | 76,7 % |
| Ensemble du holdout | 1 146 | 0.2041 | 67,9 % |
| Bo3 et plus | 1 086 | 0.2058 | 67,4 % |
Horloges informées (inf = 1) |
902 | 0.2163 | 66,0 % |
| En ligne | 766 | 0.2199 | 64,5 % |
| Noyau dur : en ligne et Bo3+ | 758 | 0.2205 | 64,3 % |
| Complémentaire du noyau dur | 388 | 0.1720 | 75,0 % |
Deux découpages, deux sources
Les huit premières lignes viennent du rapport officiel du leader
(scratch/ml/segmodel/report.json, section segments_holdout). Les deux
dernières — le noyau dur « en ligne et Bo3+ » et son complémentaire —
viennent du rapport hardcore (segments_holdout_dur, entrée leader), qui
est le seul à avoir mesuré ce croisement, sur le leader re-mesuré à 0.2041
exact.
Le segment « en ligne » (766) et le noyau dur (758) diffèrent de 8 matchs : les Bo1 joués en ligne.
Composition croisée du holdout¶
| LAN | En ligne | Total | |
|---|---|---|---|
| Bo1 | 52 | 8 | 60 |
| Bo3 et plus | 328 | 758 | 1 086 |
| Total | 380 | 766 | 1 146 |
Les 52 et 328 sont obtenus par soustraction ; les autres cases sont mesurées. C'est ce tableau qui montre que le segment Bo1 est composé à 87 % de LAN, et qu'il remesure donc l'effet LAN au lieu d'un effet de format.
La calibration du leader¶
Six tranches, holdout complet.
| Tranche annoncée | n | Probabilité moyenne | Taux observé | Écart |
|---|---|---|---|---|
| 0 – 20 % | 60 | 12,7 % | 11,7 % | −1,0 pt |
| 20 – 35 % | 154 | 28,2 % | 29,9 % | +1,7 pt |
| 35 – 50 % | 249 | 43,1 % | 43,4 % | +0,3 pt |
| 50 – 65 % | 329 | 57,7 % | 59,9 % | +2,2 pt |
| 65 – 80 % | 242 | 72,1 % | 73,1 % | +1,1 pt |
| 80 – 100 % | 112 | 87,3 % | 91,1 % | +3,8 pt |
Les hyperparamètres du leader¶
Modèle sauvegardé : scratch/ml/segmodel/model_segmodel.pkl.
| Paramètre | Valeur |
|---|---|
| Famille de modèle | régression logistique, pénalité L2 |
| Régularisation \(C\) | 0,3 |
| Demi-vie de récence | aucune (pondération uniforme) |
| Nombre de features | 54 |
| Standardisation | moyenne et écart-type appris sur le train, stockés avec le modèle |
| Variable de segmentation | ts_sigma_sum (somme des incertitudes TrueSkill) |
| Seuil de segment | médiane du jeu FIT : 17,4102 |
| Poids du modèle de segment | \(w = 0{,}75\) |
| Poids du modèle global | \(1 - w = 0{,}25\) |
| Espace du mélange | logits |
| Entraînement final | tous les matchs antérieurs à la coupure du holdout |
La règle de prédiction¶
Trois régressions logistiques sont ajustées : une globale sur toutes les
lignes, et deux par segment (seg0 pour les matchs peu informés, seg1 pour
les matchs informés). Pour un match donné, on calcule le segment, puis :
où \(\ell_{\text{segment}}\) est le logit produit par le modèle du segment auquel appartient le match, \(\ell_{\text{global}}\) celui du modèle global, et \(p\) la probabilité finale que l'équipe 1 gagne.
Les seuils de segmentation candidats¶
Calculés sur le jeu FIT, pour les deux définitions de segment explorées.
| Variable | Quantile 0,35 | Quantile 0,50 | Quantile 0,65 |
|---|---|---|---|
ts_sigma_sum (retenue) |
15,4029 | 17,4102 | 19,4989 |
wn_min (écartée) |
3,2189 | 3,9890 | 4,6052 |
Les 54 features¶
Par famille d'origine.
Features d'équipe de base (10) — glicko_diff, melo_diff, form5_diff,
form10_diff, h2h_balance, experience_diff, rest_diff, stability_diff,
lan, stakes.
Horloges bayésiennes (6) — ts_diff, ts_sigma_sum, g2_diff,
g2_phi_sum, ts_valve_disagree, ts_g2_disagree.
Statistiques joueurs (6) — prat_mean_diff, prat_star_diff,
prat_std_diff, padr_diff, pkast_diff, pcov_diff.
Cartes et manches (10) — rshare_diff, exp_mapwr_diff, best_map_edge,
pool_depth_diff, round_share_diff, ct_share_diff, t_share_diff,
h2h_maps_diff, h2h_maps_n, veto_n.
Apports de push (8) — pi_diff_a, ts_diff*ts_sigma_sum,
melo_diff*form5_diff, tsm_diff, tsm_sigma_sum, n7_diff, n21_diff,
streak_diff.
Rang mondial (2) — hr_rank_diff, hr_trend_diff.
Préchauffage et économie (4) — wmelo_diff, eco_clutch_diff,
eco_adv_diff, eco_eff_diff.
Interactions « informé » (8) — inf, inf*melo_diff, inf*ts_diff,
inf*glicko_diff, inf*hr_rank_diff, inf*round_share_diff,
inf*wmelo_diff, inf*pi_diff_a.
Les découpages temporels¶
| Jeu | Effectif | Rôle |
|---|---|---|
| FIT | 9 479 | ajuster les coefficients pendant l'exploration |
| VAL | 808 | choisir hyperparamètres et candidats |
| TRAIN (FIT + VAL) | 10 287 | réentraîner le candidat retenu |
| HOLD | 1 146 | mesurer, une seule fois |
Pour mémoire, avant l'extension de la fenêtre native à douze mois : FIT 4 108, TRAIN 4 916, holdout inchangé à 1 146.
Les volumes de données¶
| Gisement | Volume | Couverture |
|---|---|---|
| Cache HTML local | ~16 000 pages | socle de tout le projet |
| Pages de match avec statistiques joueurs | 9 112 analysées, 8 376 exploitables | — |
| Pages de match avec veto | 6 631 | — |
| Pages de match avec scores par carte et mi-temps | 6 523 | — |
| Manches détaillées (source externe) | 209 482 manches sur 10 180 cartes | 4 304 / 6 056 matchs (71 %) |
| Historique de matchs 2024 → 2026 (source externe) | 40 023 matchs, 77 890 cartes | 39 375 avec cartes |
| Historique de classement mondial daté (extraction harvest) | 66 860 points | 494 équipes |
Historique de classement mondial daté (extraction squeeze, celle qui alimente hr_rank_diff) |
42 302 points | 439 équipes, 84 % des matchs |
| Clichés de statistiques de carrière archivés | 966 clichés datés | 19 % du holdout |
Le budget de mesure, chantier par chantier¶
| Chantier | Passes de holdout | Contrôle de reproduction du leader précédent |
|---|---|---|
| Concours (6 approches) | 1 chacune | — |
| final | 1 | — |
| push | 2 (déclaré dans le rapport) | leader re-mesuré à 0.2180 |
| squeeze | 1 | leader re-mesuré à 0.2172 |
| assault | 1 | squeeze reproduit à 0.2153 (publié : 0.2154) |
| lastmile | 1 | assault reproduit à 0.2054 exact |
| segmodel | 1 | lastmile reproduit à 0.2044 exact |
| hardcore | 1 | segmodel reproduit à 0.2041 exact |
| ultimate | 1 | segmodel reproduit à 0.2041 exact |
| lastcard | 1 | segmodel reproduit à 0.2041 exact |
Le taux de survie des gains de validation¶
Le critère d'arrêt de la campagne, sous forme de tableau. Un gain « survit » quand il se retrouve en holdout.
| Chantier | Gain en validation | Résultat en holdout | Survie |
|---|---|---|---|
| final | oui | 0.2180, leader battu | ✔ |
| push | oui | 0.2172, leader battu | ✔ |
| squeeze | oui | 0.2154, leader battu | ✔ |
| assault | oui | 0.2054, leader battu | ✔ |
| lastmile | oui | 0.2044, leader battu | ✔ |
| segmodel | oui | 0.2041, leader battu | ✔ |
| hardcore | −0.0012 | +0.0001 | ✘ |
| ultimate | dégradation en validation | contrôle exact | ✘ |
| lastcard | −0.0012 | +0.0003 | ✘ |
Six survies consécutives, puis trois échecs consécutifs. C'est cette séquence, et non le dernier résultat pris isolément, qui a clos la campagne.
Les gisements de la fin de campagne¶
| Gisement | Avant unification | Après unification |
|---|---|---|
| Manches détaillées | 209 482 manches / 4 304 matchs | 299 961 manches / 6 220 matchs |
| Cartes couvertes | 10 180 | 15 156 |
| Appariement, fenêtre 2026-02 → 2026-08 | 85,0 % | 85,0 % |
| Appariement, fenêtre 2025-08 → 2026-02 | — | 89,6 % |
| Accord sur le vainqueur | — | 6 207 / 6 220 (13 écarts exclus) |
| Couverture d'économie, jeu FIT | 3 041 / 9 479 | 6 211 / 9 479 |
| Couverture d'économie, holdout | 964 / 1 146 | 969 / 1 146 |
Les deux dernières lignes expliquent à elles seules pourquoi le doublement de couverture n'a rien rapporté : il s'est produit sur l'entraînement ancien, pas sur la période évaluée.