Skip to content

fix(ml,#17700): reaffecter les Append du pipeline de ML-2 (transformation perdue) - #18311

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/17700-ml2-pipeline
Sep 29, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/17700-ml2-pipeline

Conversation

@jsboige

@jsboige jsboige commented Sep 28, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-dotnet — lane myia-po-2025:CoursIA — prev: DEEP/training #18190

Objet

Le corps de ML-2-Data&Features.ipynb (partition ML.Net, volet de #17700) affirmait un etat que son propre code ne produisait pas : le pipeline de feature engineering n'etait jamais compose, et la demonstration de valeur manquante ne distinguait pas « transformation appliquee » de « transformation absente ».

Defaut 1 — pipeline.Append(...) sans reaffectation (cellules 6 et 8)

IEstimator.Append renvoie une nouvelle chaine d'estimateurs ; il ne modifie pas celle sur laquelle il est appele. Les deux cellules ecrivaient donc pipeline.Append(...) en jetant le resultat : ReplaceMissingValues et Concatenate n'entraient jamais dans le pipeline. La cellule suivante (pipeline.Fit(data)) transformait avec le seul OneHotEncoding, et la phrase de conclusion — « Nous avons maintenant un IDataView charge et un pipeline pret pour l'entrainement » — etait fausse : aucune colonne Features n'existait.

Le compilateur nomme lui-meme la mecanique des qu'on tente d'assigner :

(14,6): error CS0029: Impossible de convertir implicitement le type
  'Microsoft.ML.Data.EstimatorChain<Microsoft.ML.Transforms.MissingValueReplacingTransformer>'
  en 'Microsoft.ML.Transforms.OneHotEncodingEstimator'

Controle negatif execute (notebook hors depot, meme MLContext, meme forme de pipeline) :

p0 (Append non assigne) type : OneHotEncodingEstimator
p1 (Append assigne)     type : EstimatorChain`1
p0 : colonne Features presente ? False
p1 : colonne Features presente ? True

La forme du corps etait donc bien celle qui perd la transformation, et c'est la reaffectation qui la retient.

Correctif : IEstimator<ITransformer> pipeline = ... en cellule 4 (le type de base rend la reaffectation possible), puis pipeline = pipeline.Append(...) en cellules 6 et 8. C'est l'idiome que le notebook enseignait deja dans son propre exercice 3 (IEstimator<ITransformer> housePipeline = null; puis housePipeline = housePipeline.Append(...)) : le corps contredisait son exercice.

Defaut 2 — demonstration « valeur manquante » non discriminante (cellule 7)

Le deuxieme objet factice laissait Rate_code non assigne. En C#, un float non assigne vaut 0.0f — une valeur presente (le marqueur d'absence de ML.NET pour un Single est NaN). La sortie committee, Rate_code: 0, etait donc identique avant et apres la transformation : elle ne pouvait pas montrer que ReplaceMissingValues faisait quelque chose — et en l'espece il ne le faisait pas (defaut 1). Le commentaire // Rate_code manquant decrivait une absence que les donnees ne portaient pas.

Correctif : Rate_code = float.NaN dans les donnees d'exemple, et la cellule imprime desormais les deux valeurs :

Rate_code brut      : NaN
Rate_code transforme: 0

Le contraste est la preuve. La cellule 8 imprime en plus le schema transforme, ou la colonne Features apparait :

Schema apres transformations : vendor_id, ... , fare_amount, Features
Colonne Features dans le pipeline : True

Portee

  • Un seul notebook. Le jumeau Python (ML-2-Data&Features-Python.ipynb) est propre : imputation reellement demontree (rate_code porte un np.nan explicite, df.isna().sum() le compte), ColumnTransformer + Pipeline sklearn correctement assignes.
  • La partition ML.Net est propre par ailleurs : sur les 23 .ipynb de la partition, pipeline.Append( en appel nu n'existe que dans ce notebook (les autres chainent en fluent ou assignent).
  • Aucune cellule supprimee, aucun exercice touche : 12 cellules code avant et apres, 5 cellules code et 2 cellules markdown modifiees (git diff sur les seules sources).

Verifications post-correctif

Verification Resultat
Execution .NET Interactive (cellules re-executees apres modification, C.2) 12/12 cellules, 0 erreur
validate_pr_notebooks.py (H.1/H.3/C.1) 1/1 passed (12 cellules, .net-csharp)
check_c2_compliance.py 1/1 compliant
check_exec_sequence.py CLEAN (1..N), 0 dirty
strip_probe_banner.py --apply (post-re-exec .NET) applique

See #17700

🤖 Generated with Claude Code

…tion perdue)

`pipeline.Append(...)` renvoie une NOUVELLE chaine d'estimateurs : sans
reaffectation, ReplaceMissingValues et Concatenate n'entraient pas dans le
pipeline. La phrase de conclusion (« pret pour l'entrainement ») etait donc
fausse -- aucune colonne Features n'existait.

- cellule 6 et cellule 8 : `pipeline = pipeline.Append(...)`, avec le type de
  base IEstimator<ITransformer> declare en cellule 4 (idiome deja employe par
  l'exercice 3 du meme notebook, qui ecrivait deja la forme correcte).
- cellule 3 : `Rate_code = float.NaN`. Un float C# non assigne vaut 0.0f, une
  valeur PRESENTE : la demonstration « valeur manquante remplacee » affichait
  donc 0 avant comme apres, et ne distinguait pas « transformation appliquee »
  de « transformation absente ».
- cellule 7 : imprime la valeur brute (NaN) puis la valeur transformee (0).
- cellule 8 : imprime le schema transforme, ou la colonne Features apparait.

Re-execution .NET Interactive : 12/12 cellules, 0 erreur.
validate_pr_notebooks 1/1 ; check_c2_compliance 1/1 ; check_exec_sequence
CLEAN (1..N).

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

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 Sep 28, 2026 •

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 12.8s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 9.1s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 8.1s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 8.7s
Search-01-StateSpace.ipynb ✅ SUCCESS 7.1s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 4.4s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 27.7s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 4.4s

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

@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 12
  • 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

⚠️ 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.

…ral cote C#)

La branche fait evoluer ML-2-Data&Features.ipynb (cote C#) sans toucher son
jumeau Python : le gate Twin parity audit (#8057) signalait donc 1 paire en
DRIFT introduite par la PR.

Attestation posee avec le geste prescrit par le gate lui-meme
(check_twin_parity.py --update --pair "ML-2 Data&Features"), en DERNIER
apres tout strip outille (#8957).

Mesure qui fonde l'attestation : git diff origin/main sur
ML-2-Data&Features-Python.ipynb est vide -- le jumeau Python est
byte-identique a main. Le cote Python enseignait deja le geste correct
(imputation np.nan reelle, Pipeline sklearn assigne), il n'a rien a
rattraper. Meme precedent unilateral que app-14-connectfour-adversarial/0005.

See #17700

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

jsboige commented Sep 29, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18311
head: 3cfad7e
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 9f55ec6e0aea81eb6a6d45dbbfe6a642b46b96d511886fa379ffdeacfe8d18ba
diff-files: 2
diff-additions: 92
diff-deletions: 147
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Secrétaire vérificateur (myia-po-2026:CoursIA-3), 29/09 02:55Z — Dossier tiers READY à tête exacte 3cfad7ee…. Vague oldest-first plage #18289-#18317.

  • Tête exacte : 3cfad7ee226d369eb17872b304a05a118ce4bba6 — vérifiée via check-runs (latest-wins dedupe).
  • Checks : 0 rouge latest-wins (mesure c.286).
  • B.0 : à re-vérifier si > 30 min depuis.
  • Geste attendu ai-01 : merge direct via Q67 (APPROVED review exigée à tête exacte).

@myia-ai-01
myia-ai-01 merged commit 6fb2f2d into main Sep 29, 2026
93 of 97 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