Skip to content

fix(qc,#14122): quantbooks ML-RandomForest/ML-SVM -- purge UserWarning sklearn (re-exec QC Cloud) - #18623

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/14122-quantbooks-userwarning
Oct 1, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/14122-quantbooks-userwarning

Conversation

@jsboige

@jsboige jsboige commented Sep 30, 2026

Copy link
Copy Markdown
Owner

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

Summary

Purge le UserWarning sklearn des sorties de 2 quantbooks ML de la série QuantConnect (tranche #14122) en corrigeant la cause (passage d'un array NumPy à un scaler/classifieur ajusté sur DataFrame), puis re-exécution réelle sur QC Cloud (kernel-side, capture per-cell).

  • projects/ML-RandomForest/quantbook.ipynb — 1 ligne : latest = ticker_features.iloc[i:i+1] (retrait du .values)
  • projects/ML-SVM/quantbook.ipynb — même retrait + fix d'exposition : le backtest SVM réutilise UN modèle fit sur les colonnes SPY_* pour prédire les features propres à chaque ticker. Sans .values, sklearn valide les noms → ValueError: The feature names should match those that were passed during fit (fit SPY_*, predict QQQ_*). Fix : projection explicite des colonnes du ticker sur celles du fit (rename(dict(zip(...)))) — exactement la sémantique positionnelle que .values fournissait en silence, désormais affirmée et vérifiée par sklearn.

Le RF n'a pas besoin de ce second fix : son backtest fit déjà un scaler/modèle par ticker (t_scaler/t_model dans la boucle). Les .values restants sont légitimes (symbols.values(), y_test_wf.values — itération, pas un transform).

Re-execution QC Cloud (H.1 — EXEC_PROVED)

Session research R-63a70d811593436e65daa54ceeefa5f5 (node27), kernel Foundation-Py-Default (ipython 9.8.0), runner kernel-side via websocket (subprotocol v1) : re-exécution intégrale des sources depuis le disque kernel avec capture IPython.utils.capture_output par cellule, sérialisation mimebundle-only, écriture *_executed.ipynb, fetch par GET /files/.

Quantbook Projet QC BUILD_OK
ML-RandomForest 29434751 cells=22 code=10 errors=0 userwarnings=0 sha256=a02a17302d6dcd3d srcsha=9bc54d71
ML-SVM 29434752 (executé sur session 29434751, node27, après « No spare research nodes ») cells=22 code=10 errors=0 userwarnings=0 sha256=fb05416563279716 srcsha=53765a17

Inventaire C.2 : execution_count 1..10 dans l'ordre sur les 10 cellules code de chaque quantbook, 0 output error, 0 UserWarning dans les sorties — l'objet du grain. 11/12 outputs capturés (RF/SVM), backtests complets (ex. SVM : $100,000 → $139,031.20, +39.03 %).

Note d'exécution mesurée : le Run All de l'IDE web QC persiste execution_count mais droppe les outputs du fichier — la capture par runner kernel-side est la seule voie qui objective les sorties (le « File: Save » forcé ne les récupère pas).

Allègement déclaré (ratchet output-collapse) : la perte de volume en cellule 9-backtest (RF : 406 529 → 179 octets ; SVM : 326 097 → 252 octets) est l'objet du grain — les anciens outputs de cette cellule étaient 1575 streams UserWarning (un par rebalancement). Les figures des autres cellules sont intactes (feature importance 44 107 → 44 715 o, matrice de confusion 29 193 → 29 349 o). Les valeurs de backtest changent (RF 19,53 % → 34,26 % ; SVM 45,99 % → 39,03 %) car les anciens outputs dataient d'une ère source antérieure (leurs warnings citent MinMaxScaler, le source actuel utilise StandardScaler) : sorties périmées par rapport au source, la re-exécution fraîche est la trace honnête du code committé.

Diagnostic deriver (C.4)

Verdict : CAUSE_FIXED — la cause était locale en source : l'output committé portait le warning parce que le code passait .values (array sans noms) à un StandardScaler/SVC ajusté sur DataFrame. Fix causal en source + re-exécution fraîche. Le retrait a de plus exposé le mismatch de noms du backtest SVM (latent, masqué par le warning) — corrigé dans la même PR par projection explicite.

Validation

  • Pre-commit H.3 (notebooks committés AVEC outputs) : execution_count 1..10 + outputs sur chaque cellule code
  • Grep post-fix : plus aucun .iloc[i:i+1].values dans les 2 quantbooks ; autres projets QC vérifiés (BTC-ML, Chronos : .values array-native cohérent, 0 UserWarning committé — hors scope)

See #14122 (tranche QuantConnect ML — livraison partielle de l'EPIC, ne clôt pas).

🤖 Generated with Claude Code

…g sklearn par fix causal + re-exec QC Cloud complete

Retrait du .values avant scaler.transform (DataFrame garde ses feature names).
Le retrait expose le mismatch de noms du backtest SVM (fit SPY_*, predict
ticker_*): projection explicite des colonnes sur celles du fit, semantique
positionnelle que .values fournissait en silence, desormais validee par sklearn.
Re-exec kernel-side QC Cloud (node27, capture per-cell): ec 1..10 ordonnes,
0 erreur, 0 UserWarning, backtests complets (RF 11 outputs, SVM 12 outputs).

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

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 8.3s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.4s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 3.9s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.0s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.3s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.4s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 17.2s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.9s

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

@github-actions

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

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

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • 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

Copy link
Copy Markdown
Contributor

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

@jsboige

jsboige commented Oct 1, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18623
head: ebecd5e
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 2b9fcbfb07e46d62b81db44820133dc0cdb398dccac31baf07db2b6a9d413858
diff-files: 2
diff-additions: 144
diff-deletions: 16196
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 4e69bfe into main Oct 1, 2026
90 of 93 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