Skip to content

fix(notebook,#19624): Lab5 Track1 -- etape ML non degeneree (jeu riche + baseline majoritaire) - #19672

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/19624-lab5-ml-nondegenere
Oct 7, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/19624-lab5-ml-nondegenere

Conversation

@jsboige

@jsboige jsboige commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2026:CoursIA — prev: LIGHT/docs #19542

Le défaut

L'étape « Machine Learning » du Lab 5 (Track1-LangChain/Day3-Data-Agents/Labs/Lab5-Viz-ML) s'entraînait sur les 7 lignes de transactions.csv :

Donnees preparees : 4 echantillons d'entrainement, 2 de test
Précision du modèle : 1.00

Sur deux exemples de test, la précision ne peut valoir que 0.00, 0.50 ou 1.00 : aucune de ces valeurs ne mesure quoi que ce soit. Le moteur SOTA (régression logistique) y équivalait à une baseline triviale — c'est exactement le cas dégénéré que vise le critère de richesse de problème.

Ce que fait la PR

Voie 3 de l'issue (arbitrage déclaré au claim) : transactions.csv reste le fil des étapes data (nettoyage, visualisations, Exercice 2), et la seule étape ML bascule sur le jeu wine de scikit-learn — 178 échantillons, 13 variables numériques, 3 classes.

Le vocabulaire du carnet est préservé (categorie reste le nom de la cible) et les noms consommés en aval (model, y_test, y_pred, X_train, y_train, accuracy) sont inchangés : les Exercices 2 et 3 ne sont pas réécrits.

Le fichier CSV n'a pas été élargi : sa saleté (valeur manquante, date entre guillemets) est le matériel d'exercice du Lab 4, et l'élargir aurait cassé le laboratoire précédent.

Après (exécuté, sortie committée)

Donnees preparees : 124 echantillons d'entrainement, 54 de test
Features : 13 variables numeriques | Target : categorie (3 classes)
Repartition des classes : {0: 59, 1: 71, 2: 48}

Précision du modèle : 0.981
Précision de la baseline majoritaire : 0.389
Écart au-dessus de la baseline : +0.593

Trois ajouts au-delà de la bascule

  1. Baseline majoritaire. C'est elle qui rend le score interprétable : une précision seule peut ne refléter que des classes déséquilibrées. Le carnet imprime désormais l'écart, et la cellule d'interprétation explique les trois cas (écart positif / nul / négatif — ce dernier étant un signal d'alarme, pas un résultat).
  2. StandardScaler dans un Pipeline. Les 13 variables s'expriment dans des unités incomparables (proline ~centaines, hue ~unités) : un ajustement sans standardisation laissait un ConvergenceWarning dans la sortie committée — une sortie qu'on ne peut pas interpréter. Corrigé par la cause, pas par un scrub.
  3. stratify=y au split, pour conserver la proportion des trois classes dans les deux ensembles.

Cohérence des exercices

Laisser une courbe ROC tracée sur 2 points de test (Exercice 4) aurait reconduit le même défaut dans la même section. Les Exercices 1 (partie binaire) et 4 sont donc ré-ancrés sur le jeu riche : cible binaire alcool_eleve (teneur en alcool au-dessus de la médiane), même geste « seuil sur une variable numérique → classification binaire → ROC ». Les cellules restent des stubs (None # TODO etudiant) : C.1 est respectée.

Fusion avec #19625 (main avait touché le même carnet)

main a reçu #19625 (nav/H1 au canon, exercices avant Conclusion, lecture ancrée, accents) sur ce même carnet pendant que cette branche le réécrivait — conflit réel. Résolution cellule par cellule, pas ligne à ligne :

  • l'ordre et la structure viennent de main — le réordonnancement pédagogique de Fix(ml,#17387): Lab5 — nav/H1 au canon, exercices avant Conclusion, lecture ancrée, accents #19625 est une décision délibérée, on ne la défait pas ;
  • 18 cellules identiques, 6 changées par main seul (prises telles quelles), 5 par moi seul (gardées), 2 en vrai désaccord, composées à la main :
    • l'interprétation du score — les deux côtés avaient diagnostiqué le même défaut : main écrivait « ici 1.00, méfiez-vous, transactions.csv est minuscule », devenu faux après la bascule. Composition retenue : mon interprétation contre la baseline (vraie) plus la leçon de méthode de main, qui reste vraie (« un score ne se lit qu'avec le volume de test qui le porte ») ;
    • l'Exercice 4 — texte de main (accents, bloc Référence Fawcett) avec mon ré-ancrage (alcool_eleve sur df_ml) appliqué par-dessus ;
  • ré-exécution complète post-fusion : les sorties des 31 cellules viennent toutes du même run.

Aucune des contributions de #19625 n'est perdue : ses 6 cellules modifiées, sa cellule ajoutée et son réordonnancement sont dans la tête fusionnée.

Diff

Un seul fichier, 2 commits (le correctif, puis la fusion de main) :

 MyIA.AI.Notebooks/ML/.../Lab5-Viz-ML/Lab5-Viz-ML.ipynb | 453 ++++---
 1 file changed, 453 insertions(+), 247 deletions(-)

Mes cellules dans l'ordre fusionné : 14, 15, 17, 18, 20, 25, 26 (les indices de la première version, avant le réordonnancement de #19625, étaient 14, 15, 17, 18, 22, 27, 28).

Preuves d'exécution et gardes

Ré-exécution réelle (C.2) : py -3.13 -m papermill -k python313, --cwd du dossier du carnet (le CSV est résolu depuis Path.cwd()), refaite après la fusion.

metadata.kernelspec est restauré à celui de la base (python3) : 3.13.13 est le même major.minor que la base (3.13.12), et le nom du kernelspec est une déclaration de portabilité du carnet, pas un fait d'exécution — l'exécuter sous le kernel python3 local (Python 3.11) aurait produit une dérive de version.

Garde Résultat
check_c2_compliance.py 1/1 notebooks compliant
check_exec_sequence.py fully executed: 1, CLEAN (1..N): 1, 0 DIRTY
check_cell_source_parses.py findings: 0
check_kernel_drift.py origin/main OK: 0 regression
check_output_failure_text.py origin/main 0 regressed
check_output_collapse.py / check_source_collapse.py (advisory) 0 flagged
check_prose_quantitative_claims.py --strict rc=0
check_notebook_nav_chain.py --check OK: 0 NEW finding vs baseline
check_interp_positioning.py --check OK: no new misplaced interp cells
Fuites de chemin machine dans les sorties 0
Erreurs volontaires (C.1) 0

Tous ces gardes ont été passés après la ré-exécution post-fusion, sur la tête committée.

Note sur prose-counts-guard (bloquant, #17636) : il attrape tout « N lignes » en chiffres. Mes trois occurrences décrivaient la taille d'un fichier de données pédagogique (transactions.csv), pas un compte d'artefact du dépôt — elles sont passées en lettres (« sept lignes ») et la mention redondante de la cellule de code a été supprimée. L'information reste au lecteur ; le rejeu --strict rend rc=0.

Hors périmètre

Le fichier CSV du Lab 4, les notebooks voisins du Track 1 et le contrat de données des Exercices 2-3 sont inchangés.

See #19624

🤖 Generated with Claude Code

…e + baseline)

L'etape « Machine Learning » du Lab 5 s'entrainait sur les 7 lignes de
`transactions.csv` : le split laissait 4 exemples d'entrainement et 2 de test,
et la precision affichee (1.00) ne mesurait rien.

Voie 3 de l'issue : `transactions.csv` reste le fil des etapes data
(nettoyage, visualisations, Exercice 2), et **la seule etape ML** bascule sur
le jeu « wine » de scikit-learn (178 echantillons, 13 variables numeriques,
3 classes). Le vocabulaire du carnet est preserve (`categorie` reste le nom de
la cible), et les noms consommes en aval (`model`, `y_test`, `y_pred`,
`X_train`, `y_train`) sont inchanges : les Exercices 2 et 3 ne sont pas
reecrits.

Ajouts au-dela de la bascule :
- comparaison a la **baseline majoritaire** : c'est elle qui rend le score
  interpretable (0.981 contre 0.389, ecart +0.593), la ou une precision seule
  peut ne refleter que des classes desequilibrees ;
- `StandardScaler` en amont du classifieur : les 13 variables ont des echelles
  incomparables (proline ~centaines, hue ~unites) et un ajustement sans
  standardisation laissait un `ConvergenceWarning` dans la sortie committee --
  une sortie qu'on ne peut pas interpreter ;
- `stratify=y` au split, pour conserver la proportion des trois classes ;
- Exercices 1 (partie binaire) et 4 re-ancres sur le jeu riche : laisser une
  courbe ROC tracee sur 2 points de test aurait reconduit le meme defaut.

Cellules touchees : 14, 15, 17, 18, 22, 27, 28.

Re-execution (C.2) : `py -3.13 -m papermill -k python313`, `--cwd` du carnet.
`metadata.kernelspec` restaure a celui de la base (`python3`) : la 3.13.13 est
le meme major.minor que la base (3.13.12), le nom est une declaration de
portabilite, pas un fait d'execution.

Gardes passees sur la tete : C.2 conforme, sequence d'execution CLEAN (1..N),
source parse 0 finding, 0 fuite de chemin machine, chaine de navigation
`0 NEW finding`, positionnement des interpretations OK.

See #19624

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…19672)

main avait recu #19625 (Lab5 : nav/H1 au canon, exercices avant Conclusion,
lecture ancoree, accents) sur LE MEME carnet que cette branche reecrit.

Resolution cellule par cellule -- l'ordre et la structure viennent de main
(le reordonnancement pedagogique de #19625 est une decision deliberee, on ne
la defait pas), le contenu de mes 7 cellules est substitue dessus :

- 18 cellules identiques, 6 changees par main seul (prises), 5 par moi seul
  (gardes) ;
- `5e3a09e6` (interpretation du score) -- les DEUX cotes avaient diagnostique
  le meme defaut : main ecrivait « ici 1.00, mefiez-vous, transactions.csv est
  minuscule », devenu FAUX apres la bascule (le score est desormais 0.981
  contre une baseline de 0.389). Composition : mon interpretation contre la
  baseline (vraie) + la lecon de methode de main, qui reste vraie : « un score
  ne se lit qu'avec le volume de test qui le porte » ;
- `e9fe6ce9` (Exercice 4) -- texte de main (accents, bloc Reference Fawcett)
  avec mon re-ancrage (`alcool_eleve` sur `df_ml`) applique par-dessus.

Re-execution complete post-fusion (C.2) : py -3.13 -m papermill -k python313,
--cwd du carnet ; 10 cellules code, sequence CLEAN 1..10, sorties coherentes
(124/54, precision 0.981, baseline 0.389, ecart +0.593).

prose-counts-guard (bloquant, #17636) attrapait trois « N lignes » chiffres :
les comptes decrivent un fichier de DONNEES pedagogique, pas un artefact du
depot -- passes en lettres (« sept lignes »), mention redondante de la
cellule de code supprimee. Rejeu --strict : rc=0.

Gardes passees sur la tete fusionnee : C.2 conforme, sequence CLEAN,
source parse 0 finding, 0 fuite de chemin machine, nav-chain 0 NEW finding,
positionnement des interpretations OK.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

github-actions Bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 6.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 6.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.4s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 3.7s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 23.7s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.0s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 19.4s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 10
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2024:CoursIA-2
pr: 19672
head: e891afb
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 51e6521f39ab298271abd97ef4f172233e50c26e3fb5f0ad1ddcdbae4e0da3ac
diff-files: 1
diff-additions: 453
diff-deletions: 247
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19672
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 424dc62 into main Oct 7, 2026
107 of 125 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants