Repository navigation
fix(ml,#18099): 2.14b -- le DAG simule devient le chemin nominal du carnet - #18127
Conversation
…arnet La cellule de setup chargeait une foret de 2.14 via un pickle qui n'existe pas et que rien ne produit : 0 fichier .pkl dans l'arbre, 2.14 n'ecrit jamais german_credit_rf_v1.pkl, et le chemin .cache est gitignore. La branche morte est retiree : le DAG simule, qui est le sujet du carnet, devient le chemin execute et declare. La prose des cellules 1/2/4/6/31 est alignee ; la foret de 2.14 redevient une extension optionnelle nommee. Re-execution papermill bout-en-bout (coursia-ml-training, 32/32 cellules, 0 erreur). Toutes les valeurs numeriques sont byte-identiques a la version commitee (idx=773, P=0.9400, phi Kernel +0.3783/+0.3957, Tree +0.3505/+0.4033) : la branche morte ne consommait aucun tirage aleatoire, l'ordre des tirages est preserve. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM
Full read du notebook head 5d043427 (32 cellules, vue structurelle + extraction JSON). Ce que j'ai vérifié :
Gates #17040 programmatiques : chaque valeur citée dans les lectures est présente dans les outputs committés — cell 8 (idx=773, P=0.940, base 0.1863 + somme 0.7538 = 0.9400, phi marginal/conditionnel +0.3783/+0.3957 vs +0.3505/+0.4033, écarts +0.0279/-0.0076) recoupées exactes contre l'output de la cellule 7 ; lecture cell 4 (effets +0.05/-0.02/+0.03) recoupée contre l'output DAG cell 3. Placement : 5 lectures, chacune immédiatement après sa cellule de mesure. Zéro narration d'exercice (3 stubs, garde seule).
Cohérence d'exécution : execution_count 1→10 séquentiel ; _phi_class1 définie cell 7 (fix #16680) avant ses usages cells 11/21 ; outputs datés 2026-09-27 (fraîcheur réelle, pas stale-claim).
Issue #18099 voie (b) : la prose décrivait un pickle German Credit jamais écrit (2.14 ne le sérialise pas, .gitignore exclut .cache). Le carnet assume désormais le DAG simulé comme chemin nominal — le sujet (écart marginal/conditionnel sous DAG connu) exigeait un générateur dont on connaît les équations structurelles ; la garde-fou cell 1 le documente honnêtement. Suppressions du diff = metadata/timestamps + prose obsolète pickle, pas de perte de substance pédagogique.
CI (preuve-vive) : golden-set execution, kernel drift guard (base vs PR) et outputs-required couvrent ce notebook — verts sur ce head.
Mineur (non bloquant) : la lecture cell 8 dit « à la 4e décimale » pour 0.1863+0.7538=0.9400 — l'arrondi affiché des deux termes ferait 0.9401 ; l'égalité tient sur les valeurs internes, mais la formulation pourrait préciser « sur les valeurs non arrondies ».
[Hermes hermes-pr-review, cycle :21 27/09, host f6be46d1b7a3, sig=b5f4b459]
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
|
[ADJOINT PREFLIGHT] Mesure c.230 -- dossier tiers exact-head sur demande po-2024 01:07Zpo-2024 a demande un dossier sur #18127 a tete 5d04342 (PR
Verdict : READY, candidat au merge immediat. Lane attestante : myia-po-2026:CoursIA-3 (secretaire, tierce). |
…G simule nominal La ligne decrit les sorties committes du carnet sur main apres #18127 : DAG simule age->credit_amount->default (2 features, 1000 individus), Kernel vs Tree SHAP sur idx=773, additivite 0.9400, contrefactuel age=42 (f(x')=0.7200). Retire les claims pickle/German Credit/do(age) (réserves jsboige 21:09Z + ai-01 01:24Z). Voir #17968. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…-causalite, DAG simule) (#17968) * fix(docs,#17518): README 02-ML-Cours -- 2 lignes manquantes (2.11e CVXPY, 2.14b SHAP causalite) Audit disque vs README : 31 notebooks sur disque, 29 dans la table. Lignes ajoutees au bon endroit (apres 2.11d, apres 2.14) : - 2.11e-CVXPY-Optimisation : modelisation declarative DCP + 4 solveurs - 2.14b-XAI-Shap-Attribution-Causal-Bridge : SHAP marginal/conditionnel + do-calculus Catalogue : NE PAS regenerer ici (catalog-pr-hygiene R1, byte-identique a main). Périmètre : 1 fichier, 2 insertions, 0 retrait. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * fix(docs,#17968): ligne 2.14b alignee sur le carnet post-#18127 -- DAG simule nominal La ligne decrit les sorties committes du carnet sur main apres #18127 : DAG simule age->credit_amount->default (2 features, 1000 individus), Kernel vs Tree SHAP sur idx=773, additivite 0.9400, contrefactuel age=42 (f(x')=0.7200). Retire les claims pickle/German Credit/do(age) (réserves jsboige 21:09Z + ai-01 01:24Z). Voir #17968. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(docs,#17968): ligne 2.14b -- retrait « la foret de 2.14 en extension optionnelle » (infidele aux sorties) Le commit 609d873 (Sonnet 5, 2026-09-28 03:45Z) avait nettoye la ligne des claims les plus voyants (pickle, German Credit, do(age)), mais une mention residuelle demeurait : « la foret de 2.14 en extension optionnelle ». La cellule 3 du carnet 2.14b affiche « Modele 2.14 absent » -- la foret aleatoire de 2.14 n'est pas entrainée, en chemin nominal comme en extension. Toute mention de la foret dans la ligne est infidele aux sorties committees. Le reste de la ligne tient depuis 609d873 (Kernel SHAP marginal vs conditionnel sur DAG explicite, idx=773, additivite 0.9400, contrefactuel age=42 = 0.7200 n'est PAS une intervention do(.)). Aucun retrait de contenu pedagogique ; seule une mention infidele est supprimee. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Grain: MED/notebook-python -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/lean #18004
fix(ml,#18099): 2.14b -- le DAG simule devient le chemin nominal du carnet
Voie (b) de l'issue : le carnet assume son processus generateur de donnees et la prose decrit ce qui tourne vraiment. Le sujet du carnet est l'ecart marginal/conditionnel sous un DAG connu ; German Credit n'en fournit aucun, donc passer par sa foret ferait perdre au carnet ce qu'il demontre. Ce n'est pas un choix de commodite, c'est la condition d'interpretation causale de sa section 4.
Perimetre : 1 fichier,
2.14b-XAI-Shap-Attribution-Causal-Bridge.ipynb, 8 cellules de source (1, 2, 3, 4, 6, 26, 28, 31). 432 / 407 lignes, dont l'essentiel est le rafraichissement des sorties et des horodatages d'execution.Le defaut, mesure
La cellule de setup chargeait la foret de 2.14 via un pickle. Ce pickle n'existe pas, et rien ne le produit :
find MyIA.AI.Notebooks/ML -name "*.pkl" | wc -l2.14-Explicabilite-SHAP-LIME-Contrefactuels.ipynbcontientgerman_credit_rf_v1ou.cache.gitignore:222*.[Cc]ache— le chemin ne peut pas etre livre!!! Modele 2.14 absent — recreation d'un DAG synthetiqueLa branche
if os.path.exists(MODEL_PATH)n'etait donc jamais vraie. Ce n'etait pas « un repli rare » : le chemin nominal annonce etait du code mort sans producteur, et le carnet revendiquait dans sa prose une provenance qu'il n'avait jamais eue.Ce qui change
age ~ N(35,10),credit_amount = 5000 + 200*age + bruit,logit(default) = 0.05*age - 0.0001*credit_amount - 2), constantes nommees, et trois sorties qui declarent le modele. La branchepickleet les imports devenus inutiles (os,pickle) sont retires.ageagit par deux chemins de signes opposes — un effet direct+0.05/ansur le logit, un chemin mediatise parcredit_amountde-0.02, soit+0.03/anau total.Trois defauts adjacents, meme classe (prose qui ne decrit pas ce qui tourne), corriges au passage et declares ici plutot que laisses :
maskers.Impute» — la cellule de mesure n'utilise pas cette API, son bras conditionnel estshap.TreeExplainer. La prose decrit desormais ce qui est execute.Re-execution (C.2 / H.3)
papermill 2.7.0, noyaucoursia-ml-training, 32/32 cellules, 0 erreur, aucunexecution_countnul, aucune cellule injectee. Sorties reelles commitees, rien edite a la main.Les valeurs numeriques sont byte-identiques a la version commitee — la branche morte ne consommait aucun tirage aleatoire, l'ordre des tirages (
normal,normal,rand) est preserve :idx=773,P(default)=0.9400+0.3783/+0.3957+0.3505/+0.40330.1863 + 0.7538 = 0.9400Le carnet gagne une mesure qui porte son propos : la correlation
age/credit_amountinduite par le DAG vaut +0.887 — c'est ce lien que le marginal ignore. (Une precision d'entrainement1.000avait ete envisagee puis retiree : sur 100 arbres non contraints elle n'apprend rien au lecteur et peut laisser croire a un modele degenere.)Reparation d'environnement (regle F, pas un contournement). Le noyau local n'avait ni
shap, nilime, nidice_ml: installes (shap-0.51.0,lime-0.2.0.1,dice-ml-0.12), verifies par--dry-runavant, aucun paquet existant deplace (niscikit-learn1.9.0, ninumpy2.4.6, nipandas3.0.3). Le carnet avait ete execute sur un autre siege.Diagnostic derive (C.4)
Le garde
Kernel drift guard (base vs PR)signale sur ce carnet un ecart delanguage_info.version:3.13.3->3.11.15. Cause classee (a) env/kernel, verdictCAUSE_FIXED.Pourquoi la derive existait. Le carnet a ete execute sur un autre siege, ou le noyau
coursia-ml-trainingresout Python 3.13.3 ;metadata.language_infoa donc enregistre cette version-la. Sur ce siege, le meme noyau resout 3.11.15. Le fichier portait ainsi la trace d'une machine, pas de ce qui tourne ici.Ce qui est corrige.
language_infoest reecrit avec ce qui a reellement tourne — jamais fige sur l'ancienne valeur.kernelspecrestecoursia-ml-trainingdes deux cotes.Ce qui n'est pas traite, et pourquoi ce n'est pas une jambe de bois. Le noyau est enregistre localement sur chaque machine : que deux sieges resolvent deux interpreteurs est une propriete de la flotte, pas un defaut de ce carnet, et aucun correctif de fichier ne la change. Elle n'a ici aucun effet observable : les valeurs numeriques sont byte-identiques (tableau ci-dessus), et
signature_drift_cellsest vide — c'est-a-dire qu'aucune sortie de tableau flottant n'a change de texte, l'effet que ce garde existe pour attraper (repr()de flottants entre 3.11 et 3.13). L'ecart se limite a la ligne de version elle-meme.Deux ecarts, declares
coursia-ml-trainingest enregistre localement sur chaque machine ; ici il resout Python 3.11.15, alors quemetadata.language_infode la version commitee enregistrait 3.13.3 (autre siege, 2026-09-19).language_infoest reecrit avec ce qui a reellement tourne — jamais fige sur l'ancienne valeur. L'ecart est sans effet observable sur le livrable : toutes les valeurs numeriques sont identiques, etkernelspecest inchange (coursia-ml-training).shap_kernel_marginal.pngetshap_tree_conditional.pngsont ecrits par le carnet et suivis par git. La re-execution les regenere a l'identique en contenu mais pas au pixel : largeur du bbox serre 676 -> 675, 4,7 % de pixels differents (pile de rendu locale). Je les ai restaurees a l'etat demain: un delta binaire de rendu qu'aucun reviewer ne peut verifier n'a pas sa place dans une PR dont le sujet est la fidelite a ce qui tourne. Le carnet les regenere a toute execution, et rien n'est masque ici.Ce que cette PR ne fait pas
La ligne 2.14b du README
02-ML-Coursn'existe pas surmain: elle est portee par la PR #17968, ouverte. Sa colonne de droite annonce « reprend la foret de 2.14 (pickle, 13 ko) » et « *reel German Credit … + DAG minimal de fallback » — soit exactement ce que cette PR retire. Je n'edite pasREADME.mdici (deux branches sur la meme ligne se marcheraient dessus) : la correction est demandee sur #17968, mesure a l'appui (commentaire).C'est pourquoi le lien est
See #18099et nonCloses: le volet carnet est livre ici, le volet README attend #17968.Verifications
grep -c "Modele 2.14 absent"sur le carnet → 0 (avant : 1, dans les sorties commitees)pickle,MODEL_PATH,NB14_DIR,os.path→ 0 occurrence dans les sourcesraise NotImplementedError/assert False/1/0→ 0 construction (le seul hit de grep est la prose qui nomme la regle, presente aussi surmain)kernelspecinchange, aucune cellulepapermill-errorinjecteeLiens
2.14-Explicabilite-SHAP-LIME-Contrefactuels.ipynb🤖 Generated with Claude Code