Skip to content

enrich(ml,#13410): interpretive prose tranche for 02-ML-Cours (4 notebooks above density floor) - #16007

Merged
jsboige merged 1 commit into
mainfrom
feature/densite-13410-tranche
Sep 13, 2026
Merged

jsboige merged 1 commit into
mainfrom
feature/densite-13410-tranche

Conversation

@jsboige

@jsboige jsboige commented Sep 13, 2026

Copy link
Copy Markdown
Owner

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

Summary

Density sub-grain for #13410 (430 notebooks under the 1200 c/cell floor): the 4 lowest of 02-ML-Cours, lifted above the floor by interpretive prose anchored to each notebook's actual executed outputs.

Notebook Before (c/cell) After Added cells
2.4-Arbres-Forets-Ensembles 891 1330 5
2.3b-Naive-Bayes-Generatif 918 1241 3
2.1-Workflow-ML 1004 1286 3
2.2-Descente-de-gradient 1026 1355 4

All 15 new cells are markdown interpretations placed after the code cell they read (stratification proportions 0.483/0.480, overfitting scissors train 0.914 vs test 0.827 at depth 4, GD-vs-sklearn gap |dw|=0.0124 on a convex cost, three learning-rate regimes, tree/forest/boosting ladder 0.918 < 0.936 < 0.947, worst-features importances podium, generative-vs-discriminative exercise guides). No filler: each cell cites the real numbers printed by the notebook.

Method and proofs

  • Markdown-only edits (C.2 exception): every code cell untouched — execution_count and outputs preserved verbatim; no re-execution required. Exercises already >= 3 per notebook (counted: 6 Exercice/TODO hits each).
  • Byte-identity verified before editing: json.dumps(d, ensure_ascii=False, indent=1) + trailing newline round-trips all 4 files byte-identically; unmodified cells are never rewritten. Diff is pure insertions: 160 lines added, 0 deletions, no churn.
  • Guards: detect_markdown_rendering --check OK on all 4; pre-commit Passed (gitleaks, H.3, cell-source-parses, un-compilable-cell refusal); pedagogy_density on the 4 paths: below_threshold: 0.
  • Preflight collision: only open PR touching DSWA is fix(ml,#15719): échapper les pipes des code spans — tranche ML #15845 (2.5c/2.8c/4.2/ML.Net) — zero file overlap.

See #13410 (partial: 4 of 387 under-floor notebooks; the tracker stays open for the remaining surface).

🤖 Generated with Claude Code

…ntals

Lift the 4 lowest-density notebooks of 02-ML-Cours above the 1200 c/cell
floor (measured on origin/main): 2.4 Arbres 891, 2.3b Naive Bayes 918,
2.1 Workflow 1004, 2.2 Descente de gradient 1026.

Markdown-only edits: 15 interpretation cells added after the key result
cells (stratification reading, overfitting scissors, GD convergence and
learning-rate regimes, generative-vs-discriminative exercise guides,
tree/forest/boosting ladder 0.918 < 0.936 < 0.947, worst-features podium).
All prose anchored to the actual executed outputs of each notebook.
Code cells untouched: execution_count and outputs preserved verbatim
(C.2 markdown-only exception). Byte-identity of unmodified cells verified
by round-trip before editing; diff is pure insertions (160 lines, 0 churn).

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

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

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 5.3s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.2s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.3s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.7s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.8s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.0s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 14.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.1s

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

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 4
  • Code cells validated: 41
  • 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

Copy link
Copy Markdown
Contributor

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

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[ai-01] Markdown claims anchored : les 46 findings sont des faux positifs — mesurés, pas supposés. Je merge.

L'organe est advisory, pas un gate de merge, mais un advisory ne se balaie pas d'un revers : je l'ai rejoué localement à la tête f07012445 (checker_rc=1, 11/10/12/13 findings sur les 4 notebooks) et j'ai confronté chaque valeur signalée au contenu réel des sorties du notebook, pas seulement à la cellule précédente.

La mesure décisive — l'organe signale une arrondi, pas une invention

2.4-Arbres-Forets-Ensembles, finding 0.086 :

prose  : « *worst perimeter* (0,086), *worst radius* (0,079) »
output : 3. worst perimeter   0.0858
         4. worst radius      0.0790

0.0858 arrondi à trois décimales donne 0,086. La valeur est exacte, la sortie la porte, et la prose l'arrondit honnêtement. La preuve que c'est bien la mécanique du checker et non un hasard : 0,147 de la même phrase n'est pas signalé — parce que la chaîne 0.147 est littéralement contenue dans 0.1470. Le checker fait une recherche de sous-chaîne ; 0.086 n'est pas une sous-chaîne de 0.0858, 0.147 l'est de 0.1470. Le finding mesure une longueur de chaîne, pas une véracité.

Les quatre formes de FP, avec leur compte

Forme Exemples Verdict
Référence croisée de notebook « notebook 2.5 », « sections 2.9 », « 2.3 », « notebook 2.1 » ce sont des numéros de fichier, pas des grandeurs — majorité des findings
Hyperparamètre cité depuis le code flip_y=0.10, lr = 0,001 / 0,05 / 1,5, n_train_naif = int(0.7 * len(X)) la valeur vit dans la cellule code et la sortie est une figure ; l'organe ne lit pas les <Figure …>
Arithmétique posée dans la phrase 357/569 ≈ 0,63, « 1,5 exemple », « 0,6 % », « 1,1 point », « prédire 2.51 quand la vérité est 2.49 » dérivations et exemples pédagogiques, pas des mesures rapportées
Arrondi d'une valeur présente 0,086 ← 0.0858 la seule qui ressemblait à un défaut ; c'en est l'inverse

Les valeurs qui portent réellement les affirmations du cours — accuracy 0,827, 0,918, 0,936, 0,947, plateau ~0.745, écart +0.09 — sont toutes ancrées dans les sorties. C'est précisément ce que C.5 protège, et c'est tenu.

Ce que je ne fais pas

Je ne demande pas de « réparer » ces 46 lignes : réécrire 0,086 en 0,0858 ou dé-lier « notebook 2.5 » pour satisfaire un matcher de sous-chaînes dégraderait la prose pour verdir un advisory. C'est l'anti-pattern que le protocole d'audit-reassessment nomme — un fix aveugle sur un finding automatisé propage du faux travail.

Ce qui mérite une suite, en revanche, et que je note sans le mettre à la charge de cette PR : l'organe gagnerait à ignorer les nombres qui suivent immédiatement le mot « notebook »/« section » ou vivent dans une cible de lien markdown, et à comparer les décimaux à tolérance d'arrondi plutôt qu'en sous-chaîne. Ces deux règles seules éteignent la quasi-totalité des 46. Si ça se confirme sur d'autres PRs, ça vaudra son issue.

Reassessed by ai-01 : FALSE POSITIVE (4 classes, 4 notebooks) — protocole audit-reassessment, vérification mécanique sur les sorties réelles + lecture pédagogique.

jsboige added a commit that referenced this pull request Sep 16, 2026
… only

Les tranches de densite (#16007, #16012, #16021, #16343, #16352) ne
touchent jamais la baseline : elle est un snapshot Phase-1 ("burn down,
do not grow"), ses valeurs ne se retro-fitent pas. Restauration de la
version main.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Sep 16, 2026
Les tranches de densite (#16007, #16012, #16021, #16343, #16352) ne
touchent jamais la baseline : elle est un snapshot Phase-1 ("burn down,
do not grow"), ses valeurs ne se retro-fitent pas. Restauration de la
version main.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Sep 18, 2026
…ML-2/ML-3 Python (#16381)

* enrich(mlnet,#13410): tranche densite fondations scikit-learn ML-1/2/3 Python

ML-1 753->1209 (graine, lecture des 4 points, coefficients OLS, jeu de
test extrapolation, interpolation vs extrapolation, graphique, perfection
100% comme signal d'alerte, grammaire commune). ML-2 957->1231 (describe,
expansion one-hot 7->9, R2=1.0 sur-apprentissage). ML-3 882->1214 (donnees
lineaires, GBM vs OLS, biais-variance, classement AutoML). Markdown
uniquement (exception C.2), baseline scoped 3 cles.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* revert(mlnet,#13410): baseline edits — canon des tranches = notebooks only

Les tranches de densite (#16007, #16012, #16021, #16343, #16352) ne
touchent jamais la baseline : elle est un snapshot Phase-1 ("burn down,
do not grow"), ses valeurs ne se retro-fitent pas. Restauration de la
version main.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(16381): rebaseline twin pairs ml-1/ml-2/ml-3 after markdown-only density tranche

Pairs attested: ML-1 Introduction, ML-2 Data&Features, ML-3 Entrainement&AutoML
(ML.NET/Python family).

Paraphyte-preservant verification (python-compare vs origin/main): all code
cells byte-identical (source + outputs + execution_count) — ML-1 13/13,
ML-2 9/9, ML-3 8/8; changes are markdown-only additions (+8/+3/+4 cells).

Command run per pair:
python scripts/notebook_tools/check_twin_parity.py --update --pair "<name>" --by "myia-po-2026:CoursIA"

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(ml,#16381): aligner moyennes 1 434 s / 4,4 km sur describe 1433.57 / 4.4125

Markdown-only fix (pas de re-exec, pas de cellule code touché) :
- moyennes : 1 722 s et 4,8 km -> 1 434 s et 4,4 km (arrondi describe)
- ecart-type : ~1 000 s -> ~958 s (aligne sur cellule describe plus haut)

Source de verite : cellule C describe 7.000000 8.000000 7.000000 8.000000
mean 1.428571 1.875000 1433.571429 4.412500

Tells : c.1175-L1 (markdown-only PR diff, pas hand-edit d'output) +
c.564 strict reponse nominative observation adjoint c.661 + c.974 strict
1 amend/cycle.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(ml,#16381): rebaseline twin pair ML-2 Data&Features post-markdown drift fix

Suite au drift introduit par mon precedent commit `6f19facb2` (markdown
1 434s/4,4km aligne describe), le registre `twin_pairs.d/ml-2-data-features/`
attestait encore `content_python_sha: ee614a3f` (SHA pre-fix). Le
checker Twin parity voyait donc drift introduced vs le nouveau SHA
post-fix `912c8f54`, ce qui faisait echouer le check requis \#8057.

Nouvelle attestation YAML `0006-2026-09-18-myia-po-2026-CoursIA.yaml` :
- python_sha: 9f0afcb
- content_python_sha: 912c8f5490cb747d648bafa4f3a29b486974bb09dbec0b16ba5c2528ef00cad0

Fix substance : drift elimine (1 drift remaining = GameTheory-4c
NashExistence = DRIFT PRE-EXISTING non lie a cette PR cf rapport CI
`drift_introduced: 0 / drift_pre_existing: 1`).

Tells : c.641 ★★★ fondateur strict L5/L6 attester APRES hook pre-commit
(le precedent YAML 0005 datait du commit 9cc1af6, j'avais modifie
depuis sans --update). c.974 strict 1 amend/PR (substance uniquement,
pas body PR cette fois).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(ml,#16381): clarifier vendor_id/payment_type dtype str (pandas 2.x)

Suite revue ai-01 c.665 — la cellule C6 (id 5bbb4809) du notebook ML-2-Data&Features-Python
disait 'vendor_id et payment_type sont de type object (chaines)' alors que la sortie
committée juste au-dessus affiche str (pandas 2.x). Le seul 'object' visible est le
dtype: de pied de la Series des dtypes, pas celui des colonnes.

Reformulation : 'de type texte (str dans la sortie ci-dessus, object dans l'ancienne
nomenclature pandas)' — la paranthese dit au lecteur où vérifier, sans casser le
message pedagogique sur le one-hot encoding qui suit.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(ml,#16381): re-attester twin pair ML-2 post dtype str fix

Suite rebase-arm-DWELL c.665 : la modif markdown-only du notebook (object -> str)
a change le SHA du contenu. Tell c.641 ★★★ re-attestation twin parity
AFTER hook pre-commit.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 22, 2026
…ncement / 09-Einstein / 10-Cryptarithmetic (#16379)

* enrich(z3,#13410): tranche densite SMT - lectures mesurees 08/09/10

08-Ordonnancement 735->1267 (NP-difficulte + bornes, anatomie du modele
7 vars / 6 disjonctives, lecture glouton 14h vs optimal 8h, lecture Gantt).
09-Einstein 1115->1228 (verification du temoin : 4 indices relus).
10-Cryptarithmetic 879->1290 (anatomie des retenues contre la solution,
temoin vs preuve, lecture DANGER). Markdown uniquement (exception C.2),
baseline scoped 3 cles.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* revert(z3,#13410): baseline edits — canon des tranches = notebooks only

Les tranches de densite (#16007, #16012, #16021, #16343, #16352) ne
touchent jamais la baseline : elle est un snapshot Phase-1 ("burn down,
do not grow"), ses valeurs ne se retro-fitent pas. Restauration de la
version main.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(z3,#13410): repositionne 2 cellules Interpretation apres leur code (check_interp_positioning)

Einstein cell#7 et Cryptarithmetic cell#5 etaient parachutees entre
deux headers, sans code au-dessus dans leur section (incident PyMC-15
#10580). Deplacees juste apres le code qu'elles interpretent (l'affichage
du modele / le solveur SEND+MORE) : sources inchangees, ordre seul,
outputs intacts. check_interp_positioning --check : OK repo-wide.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
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