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.scorenow returns the negative of the average scoring rule (the mean log-likelihood forLogScore), so that higher is better as scikit-learn expects. Previously,GridSearchCVandcross_val_scorewithout an explicitscoringargument selected the worst model (issue #418, PR #423)- Base learners are now seeded from the model
random_state, so fits are reproducible and independent ofn_jobs. Output for the default base learner shifts relative to 0.5.x (PR #417)
New features
- Add optional
n_jobsparameter 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_fractionandearly_stopping_roundstoNGBClassifierandNGBSurvivalfor API parity withNGBRegressor(issue #402, PR #407) - Report fitted status to scikit-learn's
check_is_fittedvia__sklearn_is_fitted__, fixingNotFittedErrorinPipeline.predicton sklearn >= 1.8 (PR #429) - Set scikit-learn classifier metadata on
NGBClassifierso 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
skopsand test the round trip (PR #427)
Bug fixes
- Fix the
CRPScoremetric ofNormal,NormalFixedMean, andLogNormal, which was off by a factor of the predicted scale. Fits usingCRPScorewith these distributions now produce correct natural gradients (issue #421, PR #424) - Fix the scale gradient of the
LaplaceCRPScore, which dropped a0.75 * scaleterm (PR #419) - Fix censored scores and gradients for
ExponentialandLogNormal, which swapped censored and observed rows and had sign and extra-term errors (PR #420) - Fix the log-scale Fisher information of
TFixedDfandCauchy, which was off by a factor of4 * var(PR #422) - Reset validation iteration metadata on refit so that re-calling
fiton the same model behaves identically to fitting a fresh one (PR #426) - Keep
random_stateas given and seed a fresh generator infit, so thatget_paramsreturns the original value and clones behave identically (PR #417) - Replace the deprecated
friedman_msecriterion withsquared_errorfor 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 removedload_bostoncalls withload_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)