Skip to content

Fix(notebooks,#17222): PyMC-10 -- references fondatrices, elpd non comparables et prescriptions inexistantes (audit #17073) - #24167

Open
jsboige wants to merge 7 commits into
mainfrom
feature/17222-pymc10-audit
Open

jsboige wants to merge 7 commits into
mainfrom
feature/17222-pymc10-audit

Conversation

@jsboige

@jsboige jsboige commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-ai-01:CoursIA-2 — prev: MED/notebook-python #24146

Tranche PyMC-10 de la partition d'audit #17222 (campagne #17073)

Application des corrections du cycle 303 (commentaire d'audit 6464119054) au carnet
MyIA.AI.Notebooks/Probas/PyMC/PyMC-10-Model-Selection.ipynb. Chaque finding a été
re-vérifié à la source avant édition
(protocole de ré-évaluation d'audit) — aucun n'a été
appliqué sur la seule foi du rapport d'audit.

Cellules de code non touchées → aucune ré-exécution n'est due (C.2/C.3) : le carnet
garde ses execution_count et ses sorties committées. Le hook pré-commit H.3 passe.

Les neuf corrections, et comment chacune a été vérifiée

# Finding Vérification first-hand Correction
1 Titre de la référence fondatrice Crossref, DOI 10.1007/s11222-016-9696-4 → « Practical Bayesian model evaluation using leave-one-out cross-validation and WAIC », Stat Comput 27(5):1413-1432 Le titre annoncé en tête de carnet (« Pareto Smoothed Importance Sampling Pointwise Predictive Model Selection ») est remplacé par le titre réel — que le carnet donnait déjà dans ses Références pour le même DOI
2 Tipping (2001) jmlr.org/papers/v1/tipping01a → Journal of Machine Learning Research 1(Jun):211-244 « NIPS 13 » → JMLR 1(Jun):211-244, en tête de §4 et en bibliographie
3 elpd non comparables Sortie committée de la cellule b0c1d2e9 : 1-gaussien −89.23 (n=50), 2-gaussien −90.08 (n=50), ARD −63.81 (n=100) Le tableau LOO porte désormais le jeu de données et son n, et un paragraphe explicite que l'elpd est une somme sur les observations : l'écart de ~25 unités mesure le doublement de n, pas la capacité prédictive ; seul p_loo se compare d'une ligne à l'autre
4 « à n=80 » Cellule d4e5f6a3 : n_obs = 50 (unimodal), n_obs_bi = 80 (bimodal) « à n=80 » → « à n=50 » : les 80 observations sont le jeu bimodal, la phrase portait sur le jeu unimodal
5 « stacking » vs code Cellule a7b8c9d6 : az.compare(..., method="BB-pseudo-BMA") (idem cellule f2a3b4c1) ; sortie committée : poids 0.7 / 0.3 La colonne weight est décrite comme l'empilement BB-pseudo-BMA — la méthode que le carnet utilise partout — et le texte rappelle que method= est ce qui nomme la méthode
6 Remèdes inexistants dir(pm) sous PyMC 6.3.2 : aucune entrée *orse*, aucune *entral* ; pm.HorseShoe et pm.NoncentralStudentT → AttributeError ; pymc_extras absent de l'environnement Les deux prescriptions sont retirées : le horseshoe est situé hors PyMC (pymc-extras, non installé ici) avec la voie réellement disponible (pré-sélection par corrélation, durcissement du prior hyper), et la prescription non-centrale est écartée comme hors sujet pour une hiérarchie Gamma + Normal
7 R-hat attribué au mauvais ajustement Sorties committées : le seul az.summary du carnet est dans la cellule f6a7b8c5 (mélange à 2 gaussiennes sur données unimodales) ; R-hat max 1.020, Divergences NUTS : 0 ; aucun diagnostic n'est affiché pour trace_2g_bi Le « cf. les diagnostics ci-dessus » devient une attribution explicite à l'ajustement unimodal, avec la mention que le carnet n'affiche aucun diagnostic pour l'ajustement bimodal
8 Dates de sortie d'ArviZ PyPI : arviz 1.0.0 le 2 mars 2026, arviz 1.1.0 le 24 avril 2026 « (depuis arviz 1.0, 2023) » → « ArviZ 1.0.0 est sorti le 2 mars 2026 » ; « ArviZ 1.1.0 (2024) » → « ArviZ 1.1.0 (sorti le 24 avril 2026) »
9 « Verdict attendu » de l'exercice 3 Rejeu hors carnet (PyMC 6.3.2 / ArviZ 1.3.0, plusieurs graines, les deux méthodes d'empilement d'az.compare, avec et sans terme constant) : sans terme constant, le modèle des indices (pm.Normal('w', ...), sans intercept) est mal spécifié pour y = 2x + 1 + bruit — le modèle linéaire y perd la comparaison (weight(deg1) = 0.00 en stacking, 0.03 en BB-pseudo-BMA, vainqueur deg2) ; avec terme constant, le classement s'inverse (1.00 en stacking, 0.63 en BB-pseudo-BMA ; sur la seconde graine 0.98 / 0.48) Le « Verdict attendu » est réécrit : le classement est le résultat à vérifier, et il ne s'obtient qu'avec un modèle correctement spécifié ; le poids n'est close qu'avec stacking et un terme constant. Les indices sont complétés (terme constant ; pm.compute_log_likelihood, sans quoi az.compare échoue sur TypeError: log likelihood not found in inference data object — reproduit firsthand). La lecture du tableau renvoie à ces conditions

Point bonus, mesuré pendant la tranche

Les indices de l'exercice 3 (« Comparer les 3 modèles avec az.compare() ») ne mentionnaient ni
pm.compute_log_likelihood — que les cellules f6a7b8c5 et e1f2a3b0 appellent pourtant, et sans
quoi az.compare échoue sur TypeError: log likelihood not found in inference data object
(reproduit firsthand pendant la tranche) — ni le terme constant, alors que les données sont
y = 2x + 1 + bruit. Le replay hors carnet a montré que ce second manque est le piège réel de
l'exercice
: sans intercept, le modèle linéaire est écarté de la comparaison, et le verdict
« poids proche de 1.0 » n'est atteignable qu'avec stacking. C'est le finding 9 du tableau
ci-dessus.

Parité des jumeaux

La paire Probas-10 Model-Selection (PyMC ↔ Infer-10) est rebaseline par un fichier
d'attestation dédié (scripts/notebook_tools/twin_pairs.d/probas-10-model-selection/0023-2026-11-02-myia-ai-01-CoursIA-2.yaml,
puis réattestée après le finding 9 dans 0024-2026-11-02-myia-ai-01-CoursIA-2.yaml).
Le jumeau C# n'est pas touché : il citait déjà Tipping au JMLR — la correction rétablit la
parité
sur ce point ; les corrections de dates ArviZ, d'API PyMC et de méthode d'empilement
sont propres à la stack PyMC/ArviZ et n'ont pas d'équivalent en Infer.NET.
check_twin_parity.py --pair "Probas-10 Model-Selection" → OK.

Portée

Livraison partielle de la partition d'audit #17222 : tranche PyMC-10. PyMC-11 et les
autres carnets de la partition restent à traiter. La clause paths: de la claim couvre
PyMC-10 et PyMC-11.

See #17222

🤖 Generated with Claude Code

jsboige and others added 2 commits November 2, 2026 09:03
…mparables, prescriptions inexistantes

Tranche d'audit #17073 (cycle 303, commentaire 6464119054) appliquee au carnet
PyMC-10-Model-Selection. Les huit findings ont ete re-verifies d'abord a la
source avant edition ; les corrections portent sur des cellules markdown
uniquement, donc aucune re-execution n'est due (C.2/C.3).

1. Titre de la reference fondatrice : le carnet annoncait "Pareto Smoothed
   Importance Sampling Pointwise Predictive Model Selection" pour le DOI
   10.1007/s11222-016-9696-4, alors que ce DOI designe "Practical Bayesian
   model evaluation using leave-one-out cross-validation and WAIC" (verifie
   sur Crossref, Stat Comput 27(5):1413-1432) -- titre que le meme carnet
   donnait deja dans ses References.
2. Tipping (2001) est publie au Journal of Machine Learning Research
   1(Jun):211-244, pas a NIPS 13 (verifie sur jmlr.org/papers/v1/tipping01a) ;
   le jumeau C# (Infer-10) citait deja JMLR.
3. La table LOO rapproche des elpd calcules sur trois jeux differents (50
   observations unimodales, 50 unimodales, 100 ARD) : l'ecart de ~25 unites
   mesure le doublement de n, pas une meilleure capacite predictive. Seul
   p_loo se compare d'une ligne a l'autre.
4. "a n=80" corrige en "a n=50" : n=80 est le jeu bimodal, la phrase portait
   sur le jeu unimodal.
5. La colonne weight est annoncee en "stacking" alors que tous les appels
   az.compare du carnet utilisent method="BB-pseudo-BMA".
6. Deux remedies prescrits n'existent pas dans PyMC : pm.HorseShoe et
   pm.NoncentralStudentT (aucune entree *orse* ni *entral* dans dir(pm) sur
   PyMC 6.3.2 ; le horseshoe vit dans pymc-extras, absent de l'environnement
   de la serie). La prescription non-centrale etait de surcroit hors sujet
   pour une hierarchie Gamma + Normal.
7. Le "R-hat ~1.02" attribue au cas bimodal est en realite celui de
   l'ajustement unimodal (seul az.summary du carnet) : l'attribution est
   corrigee, le carnet n'affichant aucun diagnostic pour trace_2g_bi.
8. Dates de sortie d'ArviZ : 1.0.0 le 2 mars 2026 et 1.1.0 le 24 avril 2026
   (PyPI), et non 2023 / 2024.

Livraison partielle : tranche PyMC-10 de la partition d'audit #17222 ;
PyMC-11 et les autres carnets de la partition restent a traiter.

See #17222

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Rebaseline de la paire apres la tranche d'audit PyMC-10 (commentaire
6464119054) : les deux cotes sont relus au blob de tete, le cote C# est
documente comme non touche (il citait deja Tipping au JMLR), et la
difference connue est inscrite dans le registre.

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

github-actions Bot commented Nov 2, 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 3.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 4.1s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.8s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.4s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.7s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 19.5s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.8s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 11.2s

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

jsboige and others added 2 commits November 2, 2026 09:11
…MC-10

Le "Verdict attendu" (modele lineaire avec un weight proche de 1.0) ne tient
pas tel quel : rejoue hors carnet (PyMC 6.3.2 / ArviZ 1.3.0, 2 graines x 2
methodes d'empilement x 2 specifications du modele), le modele des indices
(`pm.Normal('w', ...)` sans terme constant) est mal specifie pour
`y = 2x + 1 + bruit` -- le modele lineaire y PERD la comparaison (weight 0,00
en `stacking`, 0,03 en `BB-pseudo-BMA`, vainqueur deg2). Avec un terme
constant, le classement s'inverse (weight 1,00 en `stacking`, 0,63 en
`BB-pseudo-BMA`, 0,98 / 0,48 sur la seconde graine) : le weight proche de 1.0
n'est atteignable qu'avec `stacking` ET un terme constant.

Les indices sont completees (terme constant, `pm.compute_log_likelihood` --
sans elle `az.compare` echoue sur `TypeError: log likelihood not found in
inference data object`) et le "Verdict attendu" est reecrit en annonçant les
deux reglages dont il depend, avec les valeurs mesurees. La lecture du
tableau `az.compare()` renvoie vers ces conditions.

Cellule markdown uniquement (aucune cellule de code touchee) : pas de
re-execution due, les outputs committes restent valides.

See #17222

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…ercice 3

L'attestation du registre des jumeaux est refaite sur l'etat courant du carnet
(correction de l'exercice 3), et l'entree `known_differences` de la tranche est
completee par le neuvieme finding -- le "Verdict attendu" ne tient pas tel
quel : sans terme constant, le modele lineaire perd la comparaison ; le weight
proche de 1.0 n'est atteignable qu'avec `stacking` ET un terme constant.

Jumeau C# non touche.

See #17222

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

github-actions Bot commented Nov 2, 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 Nov 2, 2026

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

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 Nov 2, 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 Nov 2, 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 Nov 2, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 20
  • 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 added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-11-02) :

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359) — résolue

La collision de chemins signalée sur #24167 n'existe plus au passage du 2026-11-03T01:51Z : aucune autre PR ouverte ne partage désormais de chemin de fichier avec elle. Note laissée en place de l'avertissement (retraction non destructive).

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Nov 2, 2026
jsboige and others added 3 commits November 3, 2026 01:09
…audit

# Conflicts:
#	scripts/notebook_tools/twin_pairs.d/probas-10-model-selection/0023-2026-11-02-myia-ai-01-CoursIA-2.yaml
Le conflit de fusion portait sur l'index 0023 de la paire
`Probas-10 Model-Selection` -- deja publie sur main (collision d'index
entre deux emissions independantes). L'entree de main est conservee, et
la fusion modifie le blob du carnet PyMC-10 (auto-fusion) :
l'attestation est re-emise a l'index 0024, au-dessus du plancher.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…ndex intra-branche)

La paire probas-10-model-selection portait deux attestations a l'index 0024
sur cette branche (emissions du 2026-11-02 et du 2026-11-03) : le gate
"Twin index collision gate (#23208)" la refuse en collision intra_ref, et
l'ecart de la paire sur main reste invisible jusqu'a la fusion.

Correctif : git mv pur de 0024-2026-11-03 vers 0025 -- aucun contenu
touche, aucune re-execution due. Le lecteur prend le dernier index : 0025
reste l'attestation la plus recente (blob Python 33e5ea3, jumeau C#
744fbb7 inchange).

Une entree known_differences est ajoutee pour documenter la seconde
emission et la renumerotation.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant