github stanfordmlgroup/ngboost v0.6.0
v0.6.0 drop Python 3.9, breaking API changes and enhancements

one hour ago

RELEASE NOTES

Version 0.6.0

Breaking changes

  • Drop support for Python 3.9, which reached end-of-life in October 2025. The minimum supported version is now Python 3.10
  • NGBoost.score now returns the negative of the average scoring rule (the mean log-likelihood for LogScore), so that higher is better as scikit-learn expects. Previously, GridSearchCV and cross_val_score without an explicit scoring argument selected the worst model (issue #418, PR #423)
  • Base learners are now seeded from the model random_state, so fits are reproducible and independent of n_jobs. Output for the default base learner shifts relative to 0.5.x (PR #417)

New features

  • Add optional n_jobs parameter to fit base learners in parallel with threads (PR #416)
  • Support a distinct base learner for each distribution parameter, including scikit-learn nested parameters and feature importances for all-tree configurations (issue #338, PR #411)
  • Add validation_fraction and early_stopping_rounds to NGBClassifier and NGBSurvival for API parity with NGBRegressor (issue #402, PR #407)
  • Report fitted status to scikit-learn's check_is_fitted via __sklearn_is_fitted__, fixing NotFittedError in Pipeline.predict on sklearn >= 1.8 (PR #429)
  • Set scikit-learn classifier metadata on NGBClassifier so that scikit-learn correctly identifies it as a classifier (PR #413)
  • Handle array-like sample weights positionally and validate them at fit time; weights with wrong length, shape, NaN, or inf now raise ValueError (PR #425)
  • Document saving and loading models with skops and test the round trip (PR #427)

Bug fixes

  • Fix the CRPScore metric of Normal, NormalFixedMean, and LogNormal, which was off by a factor of the predicted scale. Fits using CRPScore with these distributions now produce correct natural gradients (issue #421, PR #424)
  • Fix the scale gradient of the Laplace CRPScore, which dropped a 0.75 * scale term (PR #419)
  • Fix censored scores and gradients for Exponential and LogNormal, which swapped censored and observed rows and had sign and extra-term errors (PR #420)
  • Fix the log-scale Fisher information of TFixedDf and Cauchy, which was off by a factor of 4 * var (PR #422)
  • Reset validation iteration metadata on refit so that re-calling fit on the same model behaves identically to fitting a fresh one (PR #426)
  • Keep random_state as given and seed a fresh generator in fit, so that get_params returns the original value and clones behave identically (PR #417)
  • Replace the deprecated friedman_mse criterion with squared_error for the default tree learner (issue #408, PR #409)

Documentation and CI

  • Build the user guide with Jupyter Book 2 in GitHub Actions and deploy on push to master (PR #428)
  • Remove the old prebuilt docs site generated by jupyter-book 0.x in 2020 (PR #430)
  • Run user guide notebooks during the docs build with --execute, replacing removed load_boston calls with load_diabetes (PR #431)
  • Mark observed rows as events in the survival examples (PR #436)
  • Run the test matrix once per commit and cancel stale PR runs via concurrency groups (PR #444)
  • Fix scikit-learn wheel resolution on Python 3.14 (PR #414)

Don't miss a new ngboost release

NewReleases is sending notifications on new releases.