Skip to content

feat(forecaster): quantile-LightGBM probabilistic head factory (#3)#349

Merged
bartzbeielstein merged 1 commit into
developfrom
feat/probabilistic-head
Jun 8, 2026
Merged

feat(forecaster): quantile-LightGBM probabilistic head factory (#3)#349
bartzbeielstein merged 1 commit into
developfrom
feat/probabilistic-head

Conversation

@bartzbeielstein
Copy link
Copy Markdown
Collaborator

Implements chapter-16 "adopt next" #3 — a probabilistic head turning the point forecast into calibrated bands — as a thin, sf2-safe convenience layer.

Non-duplication

The recursive forecaster already has the interval machinery: predict_interval (residual bootstrapping and split-conformal), predict_quantiles, predict_dist, binned residuals, and CRPS/pinball/coverage metrics. This PR does not reimplement any of that. It adds the one missing piece — native quantile-regression heads — plus a band assembler.

What's new (multitask/factories.py)

  • quantile_lgbm_forecaster_factory(config, quantiles=(0.1, 0.5, 0.9)) → one ForecasterRecursive per quantile using LGBMRegressor(objective="quantile", alpha=q), same lag/rolling config as the default factory. Deterministic, LightGBM-only. Refs hong16b, roma19a.
  • predict_quantile_band(forecasters, steps, enforce_monotonic=True) → assembles per-quantile forecasts into q_<level> columns and applies the Chernozhukov rearrangement (row-wise sort) to remove quantile crossing.
  • Fail-safe quantile validation (open (0,1), unique, non-empty).

For distribution-free coverage, compose with the existing ForecasterRecursive.predict_interval(method="conformal").

Tests & QC

14 new tests (factory params/validation, rearrangement, fit→predict integration). Suite 2413 passed, factories.py 100% coverage. ruff/black/isort clean, REUSE compliant, docs regenerated (2 new pages).

🤖 Generated with Claude Code

Implements chapter-16 "adopt next" #3 (point → calibrated bands) as a thin,
sf2-safe convenience layer over the EXISTING interval machinery — it does not
duplicate predict_interval / predict_quantiles (residual bootstrapping +
split-conformal already on ForecasterRecursive). Adds native quantile
regression heads instead.

- quantile_lgbm_forecaster_factory(config, quantiles=(0.1,0.5,0.9)) →
  one ForecasterRecursive per quantile with
  LGBMRegressor(objective="quantile", alpha=q), same lag/rolling config as the
  default factory. Deterministic, LightGBM-only. Refs hong16b, roma19a.
- predict_quantile_band(forecasters, steps, enforce_monotonic=True) → assembles
  the per-quantile forecasts into q_<level> columns and applies the
  Chernozhukov rearrangement (row-wise sort) to remove quantile crossing.
- Fail-safe quantile validation (open (0,1), unique, non-empty).

For distribution-free coverage, compose with the existing
ForecasterRecursive.predict_interval(method="conformal").

Tests: 14 new (factory params, validation, rearrangement, fit/predict
integration). Suite 2413 passed; factories.py 100% coverage. Docs regenerated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@bartzbeielstein bartzbeielstein merged commit a77b4c6 into develop Jun 8, 2026
10 checks passed
@bartzbeielstein bartzbeielstein deleted the feat/probabilistic-head branch June 8, 2026 17:34
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.

1 participant