Skip to content

Fix(search,#23384): App-18-HyperparameterTuning -- convergence kernel 3.13 et re-execution canonique - #23469

Merged
jsboige merged 2 commits into
mainfrom
feature/23384-app18-hyperparam-tuning
Oct 31, 2026
Merged

jsboige merged 2 commits into
mainfrom
feature/23384-app18-hyperparam-tuning

Conversation

@myia-po-2023

Copy link
Copy Markdown
Collaborator

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: DEEP/notebook-python #23454

Objet

Convergence du carnet App-18-HyperparameterTuning au kernel canon python3 3.13 et re-execution reelle (census #23384).

Voir #23384.

Etat avant

Les sorties commitees avaient ete produites hors canon : metadata.language_info.version = 3.11.9. Le carnet etait donc execute dans un environnement different du canon du depot (3.13.x), sans que la derive soit tracee.

Diagnostic dérive

Cause : (a) environnement / kernel hors canon — les sorties commitees dataient d'une execution sous Python 3.11.9, le canon du depot etant python3 3.13.

Verdict : CAUSE_FIXED.

Mesure de la derive (avant correctif)

La question etait : la derive vient-elle de la fonction d'evaluation ou de la recherche ?

Le evaluate_rf du carnet (sklearn RandomForestClassifier(random_state=42, n_jobs=-1) + cross_val_score(cv=5)) a ete rejoue sous sklearn 1.6.1 sur les jeux de parametres commites :

cas mesure publie ecart
GA -- commite 0.785417 0.7854 +0.000017
Optuna -- commite 0.781250 0.7812 +0.000050
PSO -- commite 0.787500 0.7875 0.000000
Grid -- commite 0.768750 0.7688 -0.000050
Bayesian -- commite 0.783333 0.7833 +0.000033

L'evaluation est invariante : tous les scores commites sont reproduits a 1e-5 pres. La derive porte donc sur les trajectoires de recherche de GA (0,7854 -> 0,7750) et d'Optuna (0,7812 -> 0,7833) ; Grid (0,7688), Random (0,7667), Bayesian (0,7833) et PSO (0,7875) sont identiques au bit pres.

Reproductibilite du resultat canonique

Deux runs canoniques independants (deux processus separes, kernel 3.13.3, sklearn 1.6.1 / numpy 2.3.5 / optuna 5.0.0) : scores et jeux de parametres identiques pour les six methodes. Les seules differences entre les deux runs sont les temps d'horloge de la sortie (colonne Temps (s) du tableau comparatif), qui ne sont pas reproductibles par nature et ne sont repris nulle part dans la prose.

Ce n'est donc pas un defaut de type « budget mural » (cf. la lecon CP-SAT) : le carnet n'a aucun timeout ni plafond temporel -- GA 5 generations x 20 individus, Optuna 50 trials, PSO 10 iterations x 10 particules, Grid/Random/Bayesian 50 evaluations.

Ce qui change dans le carnet

  • Sorties : re-execution complete sous 3.13.3 -- 34/34 cellules, 0 erreur, 14 cellules code, execution_count non nul partout, 2 figures PNG preservees, metadata.language_info.version = 3.13.3.

  • Prose de md[30] : re-derivee par script depuis les sorties (scripts/notebook_tools/ -- aucune valeur recopiee a la main) :

    • classement : PSO 0,788 > Bayesian 0,783 = Optuna 0,783 > GA 0,775 > Grid 0,769 > Random 0,767 ;
    • etendue 0,021 (inchangee) ; ecart du leader sur Random 0,021, sur Grid 0,019 ;
    • profondeurs des meilleurs points : 13 a 16 sur une echelle de 3 a 30 ;
    • max_features des meilleurs points : 0,10 a 0,15 (contre 0,5 pour Grid, 0,33 pour Random) ;
    • min_samples_leaf : 1 partout sauf la GA a 6.

    Deux affirmations de la prose precedente sont devenues fausses sous les sorties canoniques et ont ete corrigees : « min_samples_leaf eleve » (la valeur mesuree est 1 pour cinq methodes sur six) et « PSO (0,788) et GA (0,785) dominent » (GA n'est plus qu'en 4e position, et Optuna n'etait pas cite).

Seule la cellule markdown 30 a change ; aucune source de cellule code n'a ete modifiee (verifie cellule par cellule base vs head). C.3 : la re-execution porte sur le carnet entier, la modification de contenu est la prose.

Garde-fous (diff commite, base origin/main 6d50cc0)

Organe Verdict
validate_pr_notebooks.py origin/main passed: true, EXEC_PROVED, 14 cellules code
check_kernel_drift.py origin/main findings: []
check_output_collapse.py origin/main flagged: 0, regressed: false (2153 -> 2152 caracteres de sortie)
check_source_collapse.py origin/main flagged: 0, regressed: false (advisory) — source inchangee
check_output_failure_text.py origin/main regressions: 0 (TOOL_FAILURE / MACHINE_PATH / DECLARED_FALLBACK : 0 -> 0)
check_activity_leak.py --diff origin/main...HEAD [OK]
check_prose_quantitative_claims.py --diff origin/main...HEAD [OK]
check_twin_parity.py --check --pair "App-18 HyperparameterTuning" OK=1 DRIFT=0

Fuite de chemin machine : 0 occurrence stricte ; metadata.papermill normalise en basename ; probeAddresses absent (carnet Python).

Perimetre

3 fichiers :

  1. MyIA.AI.Notebooks/Search/Part3-Cas-pratiques/App-18-HyperparameterTuning.ipynb — re-execution canonique 3.13.3 + prose re-derivee de md[30] ;
  2. scripts/notebook_tools/twin_pairs.d/app-18-hyperparametertuning.yaml — entree known_differences (append-only) ;
  3. scripts/notebook_tools/twin_pairs.d/app-18-hyperparametertuning/0010-2026-10-30-myia-po-2023-CoursIA.yaml — attestation de rebaseline.

Le jumeau C# App-18b-HyperparameterTuning-CSharp.ipynb n'est pas touche (blob 1b519d3f identique a main) : sa comparaison de reference (ML.NET AutoML 0,7714 vs k-NN from-scratch 0,7143) porte sur son propre split deterministe (TrainTestSplit seed 424242) et sur son propre modele (k-NN), donc l'ecart de classement mesure cote Python ne s'y applique pas. Parite semantique preservee.

🤖 Generated with Claude Code

jsboige and others added 2 commits October 30, 2026 06:36
… 3.13 et re-execution canonique

Le carnet etait execute hors canon (Python 3.11.9). Re-execution complete
sous le canon kernel `python3` 3.13 (3.13.3) : 34/34 cellules, 0 erreur,
14 cellules code, execution_count non nul partout, 2 figures PNG.

Mesure de la derive (deux runs canoniques independants) : tous les scores et
tous les jeux de parametres sont identiques entre les deux runs ; seuls les
temps d'horloge varient (il s'agit de la colonne 'Temps (s)' de la sortie,
non reproductible par nature et non reprise dans la prose). La divergence
avec les sorties commitees porte donc sur les trajectoires de recherche de
GA (0,7854 -> 0,7750) et d'Optuna (0,7812 -> 0,7833) -- la fonction
d'evaluation, elle, est invariante (re-evaluation des jeux de parametres
commites sous sklearn 1.6.1 : memes scores a 1e-5 pres).

La prose de md[30] est re-derivee par script depuis les sorties (aucune
valeur recopiee a la main) : classement PSO 0,788 > Bayesian 0,783 =
Optuna 0,783 > GA 0,775 > Grid 0,769 > Random 0,767 ; etendue 0,021 ;
profondeurs des meilleurs points 13 a 16 sur une echelle de 3 a 30 ;
max_features 0,10 a 0,15 ; min_samples_leaf 1 sauf la GA a 6. La mention
'min_samples_leaf eleve' de la prose precedente etait fausse sous les
sorties canoniques et a ete retiree.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ces et attestation de rebaseline

Re-audit firsthand : la derive porte sur le seul cote Python (blob C# inchange,
1b519d3 cote main et cote branche) ; le contenu Python change par la
convergence #23384 (kernel 3.13.3, re-execution canonique), decrite en
known_differences. Attestation 0010 avec --by explicite, --update en dernier.
check_twin_parity --check --pair 'App-18 HyperparameterTuning' -> OK=1 DRIFT=0.

Co-Authored-By: Claude Sonnet 5.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

✅ 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

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 added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 30, 2026
@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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

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

@github-actions

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.0s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 2.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 3.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.1s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.4s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.6s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 14.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.2s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 8.5s

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

@github-actions github-actions Bot added the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

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

Labels

large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants