Repository navigation
feat(ml,#13991): ML-10 TSAD benchmark flaws — SPC (1924) vs AE, 4 flaws de Wu & Keogh, UCR Archive - #14039
Conversation
…ws de Wu & Keogh, UCR Archive Nouveau notebook Python ML-10 (suite logique de ML-9) : why un détecteur de 1924 (Statistical Process Control M+3σ) bat un auto-encodeur MLPRegressor sur un benchmark trivial, les 4 pièges de Wu & Keogh (trivialité, densité irréaliste, étiquettes, run-to-failure) illustrés sur données réelles UCR, et le basculement sur l'UCR Archive comme benchmark honnête (SPC ≈ 0.17 sur 2sddb40). 3 exercices stubbés C.1, exécuté end-to-end (python3, 0 erreur). - ML-10-TSAD-Benchmark-Flaws-Python.ipynb : 33 cellules, 11 code, exec_count + outputs committés, density >= 1200 chars/code-cell, 0 raise/assert/1/0. - data/tsad : 5 séries réelles UCR (4.0 Mo) — SPC/AE/AUC mesurés firsthand (SPC 0.998 vs AE 0.752 sur tiltAPB4 ; AE 0.971 vs SPC 0.201 sur InternalBleeding16 ; SPC 0.172 / AE 0.531 sur 2sddb40). - README ML.Net : ligne ML-10 + cohérence des plages (ML-5 à ML-10) ; bloc CATALOG-STATUS et COURSE_CATALOG.* byte-identiques à main (cron inscrit). Verdict SOTA : SOTA-OK (données publiques UCR, NumPy/scikit-learn, aucun service externe). Voir #13991, #3801 (axe-2), #2874. Co-Authored-By: Claude-Code <noreply@anthropic.com>
MD hierarchy drift -- b445706Cette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] Revue d'approfondissement (auteur=jsboige, contrainte token : COMMENT only).
Notebook ML-10 TSAD solid : outputs UCR réels (tiltAPB4 SPC AUC 0.998 / AE 0.752, InternalBleeding16 contextuelle AE 0.971 / SPC 0.201, 2sddb40 SPC 0.172/AE 0.531), timestamps papermill cohérents, cohérence sortie↔markdown vérifiée cellule par cellule. Le message pédagogique (trivialité, densité, étiquetage, run-to-failure) est porté par des données réelles exécutées, pas par des affirmations.
Points forts :
- Honnêteté scientifique : Yahoo non téléchargeable est signalé explicitement, le mécanisme d'étiquetage est illustré sur une série UCR réelle plutôt que fabriqué — aucune métrique inventée.
- Les 4 pièges Wu & Keogh sont implémentés et mesurés (dont la baseline run-to-failure qui "gagne" avec AUC 0.894 sans rien détecter) — bon contre-exemple.
- La transition ponctuelle→contextuelle→collective est bien exploitée pour expliquer pourquoi SPC gagne puis perd.
Réserve mineure (non bloquante) : la citation "Keogh (2025) baseline SPC bat le SOTA sur TSB-AD-M" repose sur un post Reddit — la référence est citée mais la source primaire n'est pas une publication archivée. Un lien vers le fil Reddit (ou l'arXiv TSB-AD-M) renforcerait la traçabilité de l'affirmation 2025. Aucun impact sur la valeur pédagogique. (contrainte token : COMMENT only)
|
Grain tag obligatoire (#10045, bloquant).
Pour passer ce gate, le body doit porter en tete une ligne de la forme : Le |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Le post Reddit: https://www.reddit.com/r/MachineLearning/comments/1w1wt1s/you_can_beat_sota_time_series_anomaly_detection/ Une des publications de l'auteur qui vont dans ce sens: https://arxiv.org/pdf/2009.13807 |
|
Le user a fourni, le 2026-09-01T12:19:27Z, les sources que la réserve Hermes réclamait :
Ce que ça lève, et ce que ça ne lève pas. La réserve portait sur la traçabilité de l'affirmation « Keogh (2025) : baseline SPC bat le SOTA sur TSB-AD-M », dont la seule source citée était un post Reddit non archivé. Les deux liens répondent à la demande — mais la levée n'est pas acquise tant qu'ils ne sont pas dans le notebook : la réserve visait le contenu pédagogique, pas le fil de la PR. Ce qui reste à faire, côté lane :
Deux points bloquants indépendants, à traiter dans le même passage :
Aucune de ces trois choses n'est faite par ce commentaire : il les nomme. |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
…attribution TSB-AD Leve la reserve du user sur #14039 : la revendication « Keogh (2025), la baseline SPC de 1924 bat le SOTA sur TSB-AD-M » reposait sur un post Reddit cite sans lien ni statut. - Section 5 + references : le fil r/MachineLearning est desormais lie, et explicitement qualifie de source NON ARCHIVEE (message de forum, sans relecture par les pairs). Un encadre distingue ce qui est etabli — la these des 4 defauts, portee par l'article archive arXiv:2009.13807 deja cite — de ce qui est seulement rapporte. Le fil ne porte aucun resultat mesure ici. - Attribution TSB-AD corrigee : « Liu, S. » -> « Liu, Q. » (Qinghua Liu) et « Paparrizos et al. » -> « Liu & Paparrizos » (deux auteurs, Liu premier), verifie sur les actes NeurIPS 2024 D&B et sur la page du benchmark. - Le user proposait « ou l'arXiv TSB-AD-M » : ce papier n'a pas de preprint arXiv, les actes NeurIPS D&B et la page du benchmark sont les ancres archivees equivalentes et sont ajoutees a leur place. Deux cellules markdown seulement : aucune cellule de code touchee (execution_count et outputs byte-identiques), C.2 exempte le markdown. See #13991 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Réserve levée — traitée en code par La remarque : « la citation "Keogh (2025) baseline SPC bat le SOTA sur TSB-AD-M" repose sur un post Reddit — la référence est citée mais la source primaire n'est pas une publication archivée », avec le remède nommé — un lien vers le fil, ou l'arXiv TSB-AD-M. Le fil est maintenant lié aux deux endroits où la revendication apparaît (section 5 et Références), et son statut est écrit plutôt que sous-entendu : source non archivée, message de forum, sans relecture par les pairs ni garantie de permanence. Un encadré en section 5 sépare ce qui est établi — la thèse des quatre défauts, portée par l'article archivé arXiv:2009.13807 que le notebook citait déjà — de ce qui est seulement rapporté. Le fil ne porte aucun résultat mesuré dans ce notebook. C'est le point qui rendait la remarque utile au-delà de sa traçabilité : un notebook dont la thèse est « avant de s'extasier sur un score, regarder comment il est mesuré » ne peut pas citer ses propres sources sans la même exigence. La réserve a donc produit du contenu pédagogique, pas seulement une URL. Sur « ou l'arXiv TSB-AD-M » — vérifié, il n'existe pas. J'ai d'abord cru le tenir ( Deux erreurs d'attribution corrigées au passage, trouvées en allant vérifier cette référence-là :
Périmètre : deux cellules markdown. Les cellules de code sont byte-identiques ( |
MD hierarchy drift -- f846a62Cette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
…ner 4,1 Mo de series Deux defauts sur cette branche, repares ensemble parce que le second impose de re-executer le notebook de toute facon. 1. Redistribution non etablie (bibliography-hygiene). Le commit initial versionnait 5 series UCR (4,1 Mo, 230 619 lignes) sous data/tsad/. L'UCR Anomaly Archive ne publie aucune licence de redistribution : la page du dataset ne porte qu'une citation suggeree (Wu & Keogh, arXiv:2009.13807). La regle demande de ne pas recopier un dataset tant que provenance, licence et droits de redistribution ne sont pas etablis — ils ne le sont pas ici. ucr_anomaly_fetch.py lit desormais les series depuis l'archive publique par requetes HTTP Range : EOCD -> central directory -> octets du membre, sans telecharger les 184 Mo. Cache local sous data/tsad/ (gitignore). Aucun repli fabrique : UcrFetchError est levee si le reseau echoue, pour qu'une sortie ne puisse jamais passer pour une mesure sur donnees reelles. Perte nulle, verifiee : les 5 series relues au runtime sont SHA256- identiques aux fichiers supprimes. 2. lane_claim (garde bloquant). Le corps de la PR portait la lane po-2026 alors que ai-01 a redispatche le grain a po-2027 le 2026-09-01T21:37:40Z. Corrige dans le corps de la PR, pas ici. Notebook re-execute de bout en bout (papermill, exit 0) : 11 cellules code, 0 erreur, execution_count non nul partout. Les valeurs du corps de la PR sont inchangees — tiltAPB4 SPC 0,998 / AE 0,752 ; InternalBleeding16 0,201 / 0,971 ; 2sddb40 0,172 / 0,531 — puisque les donnees sont bit-a-bit les memes. C.1 : 0 erreur volontaire dans les sources ; les 3 stubs d'exercice (cellules 26, 28, 30) restent des TODO sans raise. See #13991 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
MD hierarchy drift -- 99da016Cette PR augmente le compte de defauts de rendu markdown Corriger (ex. |
|
Levée du commentaire de coordination du 2026-09-01T13:05:12Z. Il nommait trois choses à porter dans le notebook et deux points indépendants ; les cinq sont sur la tête courante 1. Lien Reddit en note explicite de son statut — fait dans
et dans les Références : « Source non archivée — message de forum, sans relecture par les pairs : citée pour la traçabilité de l'affirmation 2025, elle ne porte aucun des résultats mesurés dans ce notebook. » 2. arXiv 2009.13807 comme appui publié — fait dans le même commit. Le papier était déjà en tête des Références ; ce que le commit ajoute est le rôle que le coordinateur demandait — c'est lui qui porte désormais explicitement la thèse, le fil ne portant que le rapport : « la thèse de fond qu'il illustre, elle, repose sur l'article archivé de 2020 (arXiv:2009.13807), pas sur le fil ». La distinction établi / rapporté est le contenu pédagogique que la remarque a produit, au-delà de l'URL. 3. C.2 — modification purement markdown, dit dans le commit. Message de 4. 5. Tag
|
Le residu assume dans le body de #14243 : l'entree README de ML-11 avait ete volontairement differee tant que #14039 (ML-10) etait ouverte, pour ne pas rendre les deux PR mutuellement conflictuelles sur les memes hunks. #14039 est mergee (09:02Z), le residu est donc leve dans la PR elle-meme plutot qu'en suivi. README (6 hunks, symetriques a ceux de ML-10) : phrase d'intro du parcours, titre de section (ML-5 a ML-11), ligne de table, titre de phase 2, paragraphe de l'apprentissage non-supervise, section de detail, arbre de progression. Lien croise : ML-10 portait un placeholder mort '[ML-11 -> (a venir)]', desormais resolu ; ML-11 lie ML-10 en tete et en navigation. Le README de main portait de meme une reference avant en l'air ('le chainon entre ML-9 et le Matrix Profile'), que ce commit ferme. Modifications markdown uniquement : aucun output ni execution_count touche (verifie cellule par cellule), donc pas de re-execution requise (C.2) et le ratchet de provenance papermill n'est pas concerne. See #13992 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…CP/SPC, effondrement k=1 (#14243) * Add: ML-11 Matrix Profile multidimensionnel (detection d'anomalies sans apprentissage) Nouveau notebook Python de la serie ML.NET, volet 11. Reponse constructive a la critique methodologique de ML-10 : le Matrix Profile n'a pas de phase d'entrainement, donc rien a surapprendre sur un benchmark. Contenu (40 cellules, 16 code / 24 markdown, executees end-to-end) : - Section 1 : Matrix Profile univarie sur une anomalie CONTEXTUELLE (cadence acceleree, marginales inchangees). La carte de controle M+3s leve 0 alerte sur toute la serie ; le discord MP tombe dans la fenetre anormale (ratio 8.0x la mediane). - Section 2 : extension multidimensionnelle a 3 capteurs. ACP rang 2 et M+3s sont toutes deux noyees dans le bruit de fond ; les MP univaries classent l'anomalie conjointe au rang 6-8 ; la condensation min et mSTAMP K=1/K=2 la classent au rang 1. mSTAMP K=3 est aveugle -- plus de dimensions peut etre pire. - Section 3 : comparaison multi-graines (7, 11, 42, 99, 123) des 11 detecteurs. - Section 3b : effondrement du profil k=1 sur une anomalie repetee deux fois (pic 3.616 -> 1.161 pour un fond a 0.913) et sa restauration par k>=2. - Section 4 : annexe FMP-AE (hybridation MP + auto-encodeur), diagramme mermaid. - 3 exercices avec stubs conformes C.1 (aucun raise/assert False/1-0). Outil SOTA reel : stumpy 1.14.1 (stump, mstump), installe dans le venv du kernel python3 conformement a la regle F. Verdict SOTA-OK. See #13992 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Add: entree README ML-11 + lien croise ML-10 <-> ML-11 Le residu assume dans le body de #14243 : l'entree README de ML-11 avait ete volontairement differee tant que #14039 (ML-10) etait ouverte, pour ne pas rendre les deux PR mutuellement conflictuelles sur les memes hunks. #14039 est mergee (09:02Z), le residu est donc leve dans la PR elle-meme plutot qu'en suivi. README (6 hunks, symetriques a ceux de ML-10) : phrase d'intro du parcours, titre de section (ML-5 a ML-11), ligne de table, titre de phase 2, paragraphe de l'apprentissage non-supervise, section de detail, arbre de progression. Lien croise : ML-10 portait un placeholder mort '[ML-11 -> (a venir)]', desormais resolu ; ML-11 lie ML-10 en tete et en navigation. Le README de main portait de meme une reference avant en l'air ('le chainon entre ML-9 et le Matrix Profile'), que ce commit ferme. Modifications markdown uniquement : aucun output ni execution_count touche (verifie cellule par cellule), donc pas de re-execution requise (C.2) et le ratchet de provenance papermill n'est pas concerne. See #13992 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: myia-po-2027 <po-2027@coursia.lan> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Grain: DEEP/notebook-python -- lane myia-po-2027:CoursIA-2 -- prev: MED/research-code #14150
Résumé
Nouveau notebook Python ML-10 (
MyIA.AI.Notebooks/ML/ML.Net/ML-10-TSAD-Benchmark-Flaws-Python.ipynb), suite logique de ML-9 : le détecteur de 1924 (Statistical Process Control,M + 3σ, 3 lignes NumPy) bat un auto-encodeur (MLPRegressor) sur un benchmark trivial ; les 4 pièges de Wu & Keogh (2020) (trivialité, densité irréaliste, étiquettes, run-to-failure) sont illustrés sur des données réelles UCR ; puis bascule sur l'UCR Time Series Anomaly Archive comme benchmark honnête, où la baseline s'effondre enfin.Verdict SOTA — SOTA-OK
Données publiques (UCR Archive), NumPy + scikit-learn, aucun service externe — le vrai outil est invoqué proprement, pas un workaround dégradé (Prong A). Le problème est non-trivial (Prong B) : la démo SPC-vs-deep porte la leçon « le benchmark est trivial », PAS « le deep learner est nul » — le contraste contre-narratif (AE 0.971 > SPC 0.201 sur anomalie contextuelle) le prouve.
Reprise de lane + retrait des données UCR versionnées (cycle 99)
Cette PR a été ouverte par
myia-po-2026:CoursIApuis redispatchée àmyia-po-2027:CoursIA-2(DMmsg-20260901T213755-1azh0h, claim posé par ai-01 sur #13991 le 2026-09-01T21:37:40Z). Le tagGrain:déclarait encore l'ancienne lane : l'organelane_claimdealways-on-guardsrefusait donc la PR (pr_lane: myia-po-2026:CoursIAvsblocking_lane: myia-po-2027:CoursIA-2, reproduit localement parscripts/ci/lane_claim_required.py). Le tag est corrigé ci-dessus — c'est la réparation du rouge.En reprenant la PR, un second défaut est apparu, celui-ci de fond : le commit initial versionnait 5 séries UCR (4,1 Mo, 230 619 lignes) sous
data/tsad/. La page de l'archive UCR n'énonce aucune licence de redistribution — seulement une citation suggérée (vérifié firsthand surcs.ucr.edu/~eamonn/time_series_data_2018/).bibliography-hygiene.mdl'interdit explicitement : « ne pas le recopier tant que sa provenance, sa licence, ses conditions d'utilisation et ses droits de redistribution ne sont pas établis ». C'était aussi contraire à la consigne écrite du dispatch (« télécharger à l'exécution ou extrait minimal cité »).Réparation : les séries sont retirées du dépôt et remplacés par une lecture à l'exécution —
ucr_anomaly_fetch.py, qui lit l'archive de 184 Mo par requêtes HTTPRange(End Of Central Directory → répertoire central → octets du seul membre voulu). Coût : quelques centaines de Ko au lieu de 184 Mo, et rien de redistribué.Substitution prouvée lossless — les octets servis par le fetch sont SHA256-identiques aux fichiers retirés, série par série :
Les chiffres du notebook sont donc inchangés par construction, et re-mesurés par la ré-exécution ci-dessous.
Échec propre, pas de repli fabriqué : si le serveur ne répond pas,
UcrFetchErrorremonte telle quelle. Aucune série de substitution n'est inventée — un benchmark sur des données fabriquées ne démontrerait rien, ce qui est le travers même que ce notebook documente. Le cache local (data/tsad/) est ignoré par un.gitignorede sous-dossier.Périmètre effectif — 4 fichiers
gh pr view 14039 --json filesrend 4 fichiers, pas 9 : les 5data/tsad/*.txtsont ajoutés par le commit initial de la branche puis retirés par celui-ci, donc nets à zéro face àmain. Le périmètre réel est :MyIA.AI.Notebooks/ML/ML.Net/ML-10-TSAD-Benchmark-Flaws-Python.ipynbMyIA.AI.Notebooks/ML/ML.Net/ucr_anomaly_fetch.pyMyIA.AI.Notebooks/ML/ML.Net/README.mdMyIA.AI.Notebooks/ML/ML.Net/.gitignoreAucun workflow CI touché.
COURSE_CATALOG.generated.*byte-identique àmain.Preuves d'exécution (H.1)
Papermill sur kernel
python3, 0 erreur, 11 cellules code sur 33 (22 markdown), ré-exécuté après le passage au fetch réseau.execution_count != null+ outputs committés (C.2). Numéros mesurés firsthand :raise NotImplementedError/assert False/1/0= 0 ; 3 exercices stubbés (# TODO étudiant).pedagogy_density.py→ below_threshold: 0).Les 4 pièges (illustrés, data réelle, pas en prose)
|x−mean| > 3σ→ AUC 0.998 sur tiltAPB4.Critères d'acceptation (#13991)
execution_count != null+ outputsraise NotImplementedError/assert False/1/0; ≥ 3 exercices stubbésCOURSE_CATALOG.*byte-identique à main (le cron inscrit l'entrée)SOTA-OKdans ce bodyRéférences
Closes #13991. See #3801 (EPIC axe-2, registre des verdicts — la discipline reste), #2874 (anomalies connexes).
NB : la série UCR étant gravée dans le nom de fichier (intervalle GT), le parsing ignore le champ
NNNambigu et applique[début, fin]au fichier complet — documenté dans le notebook. Le blocCATALOG-STATUSdu README etCOURSE_CATALOG.generated.*ne sont pas touchés.Travail initial (notebook, 4 pièges, README) :
myia-po-2026:CoursIA.Co-Authored-By: Claude Haiku 4.5 (1M context) noreply@anthropic.com