hessboost 0.2.0__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hessboost-0.2.0 → hessboost-0.2.2}/Cargo.toml +1 -1
- hessboost-0.2.2/PKG-INFO +573 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/README.md +19 -5
- {hessboost-0.2.0 → hessboost-0.2.2}/pyproject.toml +3 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/Cargo.lock +2 -2
- {hessboost-0.2.0 → hessboost-0.2.2}/python/Cargo.toml +1 -1
- hessboost-0.2.2/python/README.md +533 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/__init__.py +11 -1
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_booster.py +330 -1
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_data.py +120 -17
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_hessboost.pyi +73 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_matrix.py +25 -12
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_model_io.py +1 -1
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_sklearn_common.py +2 -2
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_training.py +86 -5
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/online.py +5 -2
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/sklearn.py +2 -2
- hessboost-0.2.2/python/hessboost/target_stats.py +245 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/booster.rs +43 -1
- hessboost-0.2.2/python/src/compact.rs +96 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/data.rs +2 -2
- hessboost-0.2.2/python/src/gpu.rs +144 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/lib.rs +8 -0
- hessboost-0.2.2/python/src/target_stats.rs +105 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/train.rs +39 -3
- hessboost-0.2.2/python/tests/test_compact.py +83 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_data.py +7 -4
- hessboost-0.2.2/python/tests/test_gpu.py +77 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_model_io.py +17 -0
- hessboost-0.2.2/python/tests/test_polars.py +91 -0
- hessboost-0.2.2/python/tests/test_target_stats.py +168 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_training.py +29 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/backend/exact_sum.rs +78 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/backend/metal.rs +801 -154
- {hessboost-0.2.0 → hessboost-0.2.2}/src/data/dmatrix.rs +88 -3
- {hessboost-0.2.0 → hessboost-0.2.2}/src/data/target_stats.rs +95 -6
- {hessboost-0.2.0 → hessboost-0.2.2}/src/lib.rs +6 -3
- hessboost-0.2.2/src/model/embed.rs +128 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/mod.rs +5 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/cv/mod.rs +175 -30
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/online/cache.rs +41 -3
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/online/mod.rs +6 -3
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/online/update.rs +5 -1
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/compact.rs +173 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/aft.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/aft.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/aft.json +694 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/aft.margins +7 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/categorical_splits.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/categorical_splits.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/categorical_splits.json +864 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/categorical_splits.margins +5 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dart.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dart.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dart.json +850 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dart.margins +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_flow_matching.hbdm +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_flow_matching.hbdm.json +2874 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_flow_matching.hbdm.probe +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_score.hbdm +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_score.hbdm.json +2879 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_score.hbdm.probe +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_treeffuser_vp.hbdm +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_treeffuser_vp.hbdm.json +2526 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/diffusion_treeffuser_vp.hbdm.probe +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_negbinomial.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_negbinomial.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_negbinomial.json +1173 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_negbinomial.margins +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal.json +1589 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal_vector_leaves.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal_vector_leaves.json +975 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/dist_normal_vector_leaves.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/early_stopping.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/early_stopping.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/early_stopping.json +798 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/early_stopping.margins +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/expectiles.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/expectiles.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/expectiles.json +1384 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/expectiles.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/forest_diffusion.hbff +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/forest_diffusion.hbff.json +127628 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/forest_diffusion.hbff.probe +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/forest_flow.hbff +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/forest_flow.hbff.json +88629 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/forest_flow.hbff.probe +3 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/gblinear.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/gblinear.json +42 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/gblinear.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/linear_leaves.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/linear_leaves.json +1066 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/linear_leaves.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/multi_target.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/multi_target.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/multi_target.json +1615 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/multi_target.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/multiclass_forest.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/multiclass_forest.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/multiclass_forest.json +6028 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/multiclass_forest.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/quantiles.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/quantiles.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/quantiles.json +2358 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/quantiles.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/vector_leaves.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/vector_leaves.json +1036 -0
- hessboost-0.2.2/tests/data/saved/0.2.1/vector_leaves.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/aft.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/aft.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/aft.json +694 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/aft.margins +7 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/categorical_splits.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/categorical_splits.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/categorical_splits.json +864 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/categorical_splits.margins +5 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dart.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dart.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dart.json +850 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dart.margins +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_flow_matching.hbdm +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_flow_matching.hbdm.json +2874 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_flow_matching.hbdm.probe +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_score.hbdm +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_score.hbdm.json +2879 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_score.hbdm.probe +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_treeffuser_vp.hbdm +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_treeffuser_vp.hbdm.json +2526 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/diffusion_treeffuser_vp.hbdm.probe +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_negbinomial.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_negbinomial.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_negbinomial.json +1173 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_negbinomial.margins +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal.json +1589 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal_vector_leaves.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal_vector_leaves.json +975 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/dist_normal_vector_leaves.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/early_stopping.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/early_stopping.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/early_stopping.json +798 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/early_stopping.margins +1 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/expectiles.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/expectiles.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/expectiles.json +1384 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/expectiles.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/forest_diffusion.hbff +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/forest_diffusion.hbff.json +127628 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/forest_diffusion.hbff.probe +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/forest_flow.hbff +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/forest_flow.hbff.json +88629 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/forest_flow.hbff.probe +3 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/gblinear.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/gblinear.json +42 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/gblinear.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/linear_leaves.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/linear_leaves.json +1066 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/linear_leaves.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/multi_target.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/multi_target.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/multi_target.json +1615 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/multi_target.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/multiclass_forest.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/multiclass_forest.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/multiclass_forest.json +6028 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/multiclass_forest.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/quantiles.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/quantiles.hbtd +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/quantiles.json +2358 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/quantiles.margins +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/vector_leaves.bin +0 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/vector_leaves.json +1036 -0
- hessboost-0.2.2/tests/data/saved/0.2.2/vector_leaves.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/metal.rs +65 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/online.rs +98 -0
- hessboost-0.2.0/PKG-INFO +0 -383
- hessboost-0.2.0/python/README.md +0 -345
- {hessboost-0.2.0 → hessboost-0.2.2}/LICENSE +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/benches/training.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/balanced_bagging.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/bench_compare.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/binary_classification.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/boulevard_inference.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/budget.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/common/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/compact_model.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/conformal.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/constraints.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/custom_objective.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/distributional.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/ebm.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/forest_flow.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/metal.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/model_io.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/multiclass.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/online_update.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/ordered_target_stats.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/pfn_boost.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/rank_xendcg.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/ranking.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/shap.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/train_regression.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/tree_diffusion.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/examples/virtual_ensembles.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_core.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_exceptions.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/_sklearn_base.pyi +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/conformal.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/diffusion/__init__.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/diffusion/forest.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/ebm.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/folds.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/inference.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/hessboost/py.typed +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/codec.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/conformal.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/diffusion.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/dist.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/ebm.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/errors.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/forest.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/inference.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/online.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/src/params.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/conftest.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_conformal.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_diffusion.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_ebm.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_forest.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_inference.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_online.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_params.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_sklearn.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_stubs.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/python/tests/test_threads.py +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/backend/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/check.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/config/groups.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/config/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/config/params.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/emit.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/parse.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/schema.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/config/xgboost/tests.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/conformal.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/data/ghist.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/data/loaders.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/data/meta.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/data/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/data/quantile.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/data/sketch.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/data/sort.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/fit.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/forest/encoding.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/forest/fit.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/forest/format.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/forest/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/format.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/io.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/process.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/diffusion/sample.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/ebm/grid.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/ebm/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/error.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/ebm.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/kernel.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/linalg.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/refit.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/solver.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/inference/term_kernel.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/curve.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/distributional.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/elementwise.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/factory.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/quantile.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/ranking.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/metric/survival.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/categories.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/bitstream.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/decode.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/encode.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/compact/tests.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/container.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/io.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/lightgbm.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/native.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/objective.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/predict.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/predictions.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/sections.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/serde.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/shap.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/shrinkage.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/slice.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/ubjson.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/uncertainty.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/validate.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/document.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/objective.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/parse.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/tests.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/model/xgboost/tree.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/absolute.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/classification.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/count.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/custom.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/count.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/dist.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/family.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/loss.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/special.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/distributional/tests.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/multi_target.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/multiclass.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/params.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/quantile.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/query.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/ranking.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/regression.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/spec.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/survival/aft.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/survival/cox.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/survival/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/survival/tests.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/objective/xendcg.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/rng.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/aarch64/tests.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/aarch64.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/scalar.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/tests.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/simd/x86_64.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/test_support.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/api.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/boulevard.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/budget.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/continuation.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/cv/fold.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/dart.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/ebm/boulevard.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/ebm/classic.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/ebm/fast.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/ebm/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/eval.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/gblinear.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/margins.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/multi_output.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/prepare.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/refresh.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/round.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/row_sampling.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/sampling.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/sglb.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/train/tests.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/train.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/training/validate.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/budget.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/categorical.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/exact.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/hist/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/hist/search.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/lightgbm.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/multi.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/oblivious.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/online.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/partition.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/shared.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/builder/split.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/constraints.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/gain.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/hist/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/hist/quantized.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/hist/walk.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/linear.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/linear_fit.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/oblivious.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/regtree.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/reuse.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/src/tree/sampler.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/boulevard.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/budget.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/common/bits.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/common/fixtures.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/common/mod.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/common/smooth.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/continuation.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/lightgbm-4.7.0-binary.expected.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/lightgbm-4.7.0-binary.txt +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/lightgbm-4.7.0-linear.expected.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/lightgbm-4.7.0-linear.txt +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/aft.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/aft.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/aft.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/aft.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/categorical_splits.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/categorical_splits.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/categorical_splits.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/categorical_splits.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dart.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dart.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dart.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dart.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_negbinomial.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_negbinomial.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_negbinomial.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_negbinomial.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal_vector_leaves.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal_vector_leaves.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/dist_normal_vector_leaves.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/early_stopping.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/early_stopping.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/early_stopping.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/early_stopping.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/expectiles.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/expectiles.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/expectiles.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/expectiles.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/gblinear.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/gblinear.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/gblinear.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/linear_leaves.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/linear_leaves.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/linear_leaves.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multi_target.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multi_target.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multi_target.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multi_target.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multiclass_forest.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multiclass_forest.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multiclass_forest.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/multiclass_forest.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/quantiles.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/quantiles.hbtd +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/quantiles.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/quantiles.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/vector_leaves.bin +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/vector_leaves.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/saved/0.2.0/vector_leaves.margins +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/xgboost-3.4.2-categorical.json +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/data/xgboost-3.4.2-categorical.ubj +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/diffusion.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/distributional.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/ebm.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/forest.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/lightgbm_parity.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/model_format.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/multi_output.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/native_format.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/parity.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/properties.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/quantized.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/round_hook.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/sampling.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/sglb.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/shap_accumulation.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/target_stats.rs +0 -0
- {hessboost-0.2.0 → hessboost-0.2.2}/tests/tree_options.rs +0 -0
hessboost-0.2.2/PKG-INFO
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: hessboost
|
|
3
|
+
Version: 0.2.2
|
|
4
|
+
Classifier: Development Status :: 4 - Beta
|
|
5
|
+
Classifier: Intended Audience :: Developers
|
|
6
|
+
Classifier: Intended Audience :: Science/Research
|
|
7
|
+
Classifier: Operating System :: MacOS
|
|
8
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
9
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
|
+
Classifier: Programming Language :: Python :: Free Threading :: 3 - Stable
|
|
17
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
18
|
+
Classifier: Programming Language :: Rust
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
20
|
+
Classifier: Typing :: Typed
|
|
21
|
+
Requires-Dist: numpy>=2
|
|
22
|
+
Requires-Dist: pandas>=2.2 ; extra == 'pandas'
|
|
23
|
+
Requires-Dist: polars>=1.0 ; extra == 'polars'
|
|
24
|
+
Requires-Dist: scikit-learn>=1.6 ; extra == 'scikit-learn'
|
|
25
|
+
Provides-Extra: pandas
|
|
26
|
+
Provides-Extra: polars
|
|
27
|
+
Provides-Extra: scikit-learn
|
|
28
|
+
Summary: Fast, deterministic gradient boosting in Rust: conformal intervals, explainable boosting machines, distributional boosting, and tree-based diffusion
|
|
29
|
+
Keywords: xgboost,gradient-boosting,gbdt,machine-learning,decision-trees,rust
|
|
30
|
+
Author-email: Brenden Matthews <brenden@brndn.io>
|
|
31
|
+
License-Expression: Apache-2.0
|
|
32
|
+
Requires-Python: >=3.11
|
|
33
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
34
|
+
Project-URL: Changelog, https://github.com/brndnmtthws/hessboost/releases
|
|
35
|
+
Project-URL: Documentation, https://github.com/brndnmtthws/hessboost/tree/main/python#readme
|
|
36
|
+
Project-URL: Homepage, https://github.com/brndnmtthws/hessboost
|
|
37
|
+
Project-URL: Issues, https://github.com/brndnmtthws/hessboost/issues
|
|
38
|
+
Project-URL: Repository, https://github.com/brndnmtthws/hessboost
|
|
39
|
+
|
|
40
|
+
# hessboost for Python
|
|
41
|
+
|
|
42
|
+
**Fast, deterministic gradient boosting in Rust.** The core API (`DMatrix`,
|
|
43
|
+
`train`, `cv`, `Booster`, and scikit-learn estimators) takes the parameter
|
|
44
|
+
names XGBoost users know, and models move to and from XGBoost as JSON or
|
|
45
|
+
UBJSON.
|
|
46
|
+
|
|
47
|
+
- **Strict.** An unknown parameter, a value of the wrong type or range, or
|
|
48
|
+
a combination hessboost does not implement raises an error; nothing is
|
|
49
|
+
silently ignored.
|
|
50
|
+
- **Deterministic.** The same parameters, data, and seed give the same
|
|
51
|
+
model at any `nthread`.
|
|
52
|
+
- **Typed** (`py.typed`, complete type information), with the GIL released
|
|
53
|
+
while training and predicting, and free-threaded CPython supported.
|
|
54
|
+
- **Modern modeling (opt-in).** Conformal prediction intervals,
|
|
55
|
+
confidence intervals for the regression function (Boulevard boosting),
|
|
56
|
+
distributional boosting (a predictive distribution per row), LightGBM/CatBoost
|
|
57
|
+
tree options, class-balanced binary bagging, and XE-NDCG ranking
|
|
58
|
+
(`objective="rank:xendcg"`).
|
|
59
|
+
|
|
60
|
+
## Installation
|
|
61
|
+
|
|
62
|
+
```sh
|
|
63
|
+
uv add hessboost # or: pip install hessboost
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Extras: `hessboost[pandas]`, `hessboost[polars]`, and
|
|
67
|
+
`hessboost[scikit-learn]`. numpy is the only required dependency.
|
|
68
|
+
|
|
69
|
+
Prebuilt wheels are published for Linux x86_64 and aarch64 (glibc
|
|
70
|
+
manylinux and musl/Alpine musllinux), macOS arm64 (with Metal support:
|
|
71
|
+
`device="metal"` training histograms and `Booster.to_gpu()` GPU batch
|
|
72
|
+
prediction), and Windows x86_64: one `abi3` wheel per platform for
|
|
73
|
+
CPython 3.11 and newer, plus a wheel for free-threaded CPython 3.14t.
|
|
74
|
+
Elsewhere the installer builds from the source distribution, which needs
|
|
75
|
+
Rust 1.93 or newer and a C compiler (for libzstd).
|
|
76
|
+
|
|
77
|
+
## Quick start
|
|
78
|
+
|
|
79
|
+
Train on a `DMatrix`, evaluating a holdout set every round and stopping
|
|
80
|
+
once it stops improving:
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
import numpy as np
|
|
84
|
+
import hessboost
|
|
85
|
+
|
|
86
|
+
rng = np.random.default_rng(0)
|
|
87
|
+
X = rng.normal(size=(1000, 5))
|
|
88
|
+
y = (X[:, 0] + X[:, 1] ** 2 > 1).astype(int)
|
|
89
|
+
|
|
90
|
+
dtrain = hessboost.DMatrix(X[:800], label=y[:800])
|
|
91
|
+
dvalid = hessboost.DMatrix(X[800:], label=y[800:])
|
|
92
|
+
|
|
93
|
+
booster = hessboost.train(
|
|
94
|
+
{"objective": "binary:logistic", "max_depth": 4, "eta": 0.1, "eval_metric": "auc"},
|
|
95
|
+
dtrain,
|
|
96
|
+
num_boost_round=500,
|
|
97
|
+
evals=[(dvalid, "valid")],
|
|
98
|
+
early_stopping_rounds=20,
|
|
99
|
+
verbose_eval=False,
|
|
100
|
+
)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`predict` takes a `DMatrix` or anything its constructor accepts. The default
|
|
104
|
+
range is the iterations through `best_iteration` (pass `iteration_range=(0, 0)`
|
|
105
|
+
for every iteration), except `pred_leaf`, which defaults to all of the
|
|
106
|
+
model's trees, not just through `best_iteration`.
|
|
107
|
+
The flag arguments are exclusive:
|
|
108
|
+
|
|
109
|
+
```python
|
|
110
|
+
probabilities = booster.predict(X[800:]) # through best_iteration
|
|
111
|
+
margins = booster.predict(X[800:], output_margin=True)
|
|
112
|
+
shap = booster.predict(X[800:], pred_contribs=True) # (rows, features + 1)
|
|
113
|
+
leaves = booster.predict(X[800:], pred_leaf=True) # (rows, trees) int32, all trees
|
|
114
|
+
print(booster.best_iteration, booster.get_score(importance_type="gain"))
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Input data
|
|
118
|
+
|
|
119
|
+
`DMatrix` takes numpy arrays of any numeric dtype and memory layout (a
|
|
120
|
+
C-contiguous `float32` array is used without a copy), pandas and polars
|
|
121
|
+
DataFrames, scipy sparse matrices, and anything `numpy.asarray` accepts.
|
|
122
|
+
NaN, and a frame's null, is missing (or pass `missing=`); ranking data
|
|
123
|
+
takes `group=` sizes or `qid=`, and `survival:aft` takes
|
|
124
|
+
`label_lower_bound=`/`label_upper_bound=`.
|
|
125
|
+
`Booster.predict` accepts the same inputs directly.
|
|
126
|
+
|
|
127
|
+
### Training controls
|
|
128
|
+
|
|
129
|
+
`train` supports XGBoost's everyday arguments: `evals`, `evals_result`,
|
|
130
|
+
`early_stopping_rounds`, `verbose_eval` (printed live, every round or
|
|
131
|
+
every `n`-th), `xgb_model` (continued training, or tree refresh with
|
|
132
|
+
`process_type="update"`), a custom objective `obj`, a `custom_metric`,
|
|
133
|
+
and `callbacks`. Ctrl-C stops training at the end of the current round
|
|
134
|
+
and raises `KeyboardInterrupt`. `hessboost.cv` cross-validates over
|
|
135
|
+
shuffled folds, explicit folds, or a scikit-learn splitter; on ranking data
|
|
136
|
+
each fold must hold whole query groups (e.g. `GroupKFold` over the query
|
|
137
|
+
ids). `hessboost.train_with_budget(params, dtrain, budget)` trains with one
|
|
138
|
+
fitting budget in place of `eta`, tree limits, and a round count
|
|
139
|
+
(PerpetualBooster's algorithm).
|
|
140
|
+
|
|
141
|
+
Subclass `TrainingCallback` to stop on your own condition; `after_iteration`
|
|
142
|
+
sees the round and the evaluation history, and returning `True` stops
|
|
143
|
+
training with the rounds so far:
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
class StopAtTarget(hessboost.TrainingCallback):
|
|
147
|
+
def after_iteration(self, iteration, evals_log):
|
|
148
|
+
return evals_log["valid"]["auc"][-1] > 0.99 # True stops training
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
hessboost.train(
|
|
152
|
+
{"objective": "binary:logistic", "eval_metric": "auc", "max_depth": 4},
|
|
153
|
+
dtrain,
|
|
154
|
+
1000,
|
|
155
|
+
evals=[(dvalid, "valid")],
|
|
156
|
+
callbacks=[StopAtTarget()],
|
|
157
|
+
)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### DataFrames and categorical features
|
|
161
|
+
|
|
162
|
+
pandas and polars column names become feature names, and categorical
|
|
163
|
+
columns (pandas `category`; polars `Enum` and `Categorical`) become native
|
|
164
|
+
categorical features. A category's code is its position in the column's
|
|
165
|
+
categories: a pandas column's or an `Enum`'s declared categories, or a
|
|
166
|
+
polars `Categorical`'s values, sorted (as pandas infers them). The booster
|
|
167
|
+
remembers each column's categories and re-codes a frame passed to `predict`
|
|
168
|
+
(and the other prediction and calibration methods) whose categories are
|
|
169
|
+
ordered differently or include unseen values (which count as missing),
|
|
170
|
+
whichever library the frame is from:
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
import pandas as pd
|
|
174
|
+
|
|
175
|
+
df = pd.DataFrame({"color": pd.Categorical(["red", "blue", "red"] * 100), "size": np.arange(300.0)})
|
|
176
|
+
booster = hessboost.train({}, hessboost.DMatrix(df, label=np.arange(300.0)), 20)
|
|
177
|
+
booster.predict(df)
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
A `DMatrix` is coded once, when it is built, so it must have the features
|
|
181
|
+
of every model or matrix it meets: `predict` and the calibrators check it
|
|
182
|
+
against each model reading it, and `train` checks every `evals` matrix
|
|
183
|
+
against `dtrain` and against `xgb_model`, and `dtrain` against `xgb_model`
|
|
184
|
+
(continued training or refresh). Feature names (where both have them;
|
|
185
|
+
`predict(validate_features=False)` skips them), which features are
|
|
186
|
+
categorical, and each categorical feature's categories, in order, must
|
|
187
|
+
match; a mismatch raises `HessboostError` naming the eval set and the
|
|
188
|
+
feature. Build eval frames with the training frame's categories (for
|
|
189
|
+
example `valid["color"].cat.set_categories(train["color"].cat.categories)`
|
|
190
|
+
in pandas; in polars, an `Enum` of the training categories, since a
|
|
191
|
+
`Categorical` missing some of its values has other categories).
|
|
192
|
+
Codes without recorded categories (numpy data with
|
|
193
|
+
`feature_types=["c", ...]`) are taken to be the other side's codes; only
|
|
194
|
+
which features are categorical is compared, and a model continued on them
|
|
195
|
+
keeps the earlier model's categories. `ConformalizedQuantile.calibrate`
|
|
196
|
+
likewise needs its two models to share their features, and re-codes frames
|
|
197
|
+
to whichever model records categories. The scikit-learn estimators re-code
|
|
198
|
+
every `eval_set` frame to the training frame's categories and, with
|
|
199
|
+
`xgb_model`, the training frame to the earlier model's.
|
|
200
|
+
|
|
201
|
+
## scikit-learn
|
|
202
|
+
|
|
203
|
+
The estimators take XGBoost's scikit-learn parameter names, plus
|
|
204
|
+
`callbacks`. Parameters left at `None` keep hessboost's defaults, and
|
|
205
|
+
`params={...}` passes any other training parameter; `fit(..., verbose=True)`
|
|
206
|
+
(or a period) prints rounds live:
|
|
207
|
+
|
|
208
|
+
```python
|
|
209
|
+
from hessboost.sklearn import HessboostClassifier
|
|
210
|
+
|
|
211
|
+
model = HessboostClassifier(
|
|
212
|
+
n_estimators=300, max_depth=4, learning_rate=0.1, early_stopping_rounds=20
|
|
213
|
+
)
|
|
214
|
+
model.fit(X_train, y_train, eval_set=[(X_valid, y_valid)])
|
|
215
|
+
model.predict_proba(X_test)
|
|
216
|
+
model.feature_importances_
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
`HessboostRegressor` (multi-target with a 2-D `y`), `HessboostClassifier`
|
|
220
|
+
(any class labels), `HessboostRanker` (`group=` or `qid=`), and
|
|
221
|
+
`HessboostDistributionRegressor` (`dist:*` objectives; `predict` returns
|
|
222
|
+
means, `predict_distribution` the distributions) work with pipelines,
|
|
223
|
+
`clone`, grid search, and pickling, and pass scikit-learn's estimator checks
|
|
224
|
+
(except three documented deviations). `import hessboost` does not import
|
|
225
|
+
scikit-learn; `hessboost.sklearn` needs it.
|
|
226
|
+
|
|
227
|
+
## Model files
|
|
228
|
+
|
|
229
|
+
| Method | Formats |
|
|
230
|
+
|---|---|
|
|
231
|
+
| `save_model(path, format=None)` | by extension: `.json` native JSON, `.ubj` XGBoost UBJSON, anything else native binary; or `format="binary" \| "json" \| "xgboost-json" \| "xgboost-ubjson"` |
|
|
232
|
+
| `Booster(path_or_bytes)`, `load_model(...)` | any of the four, or a LightGBM 4.x text model (`format="lightgbm"`, import only), detected from the content (`ModelFormatError` if it looks like none of them) |
|
|
233
|
+
| `save_raw(format="binary")` | the same formats as bytes |
|
|
234
|
+
| `pickle` / `copy` | native binary plus feature names, categories, and `best_score` |
|
|
235
|
+
|
|
236
|
+
The native binary format is compressed, checksummed, and lossless; files
|
|
237
|
+
load in subsequent releases. A LightGBM model
|
|
238
|
+
(`lightgbm.Booster.save_model`) predicts LightGBM's values for inputs with
|
|
239
|
+
missing values as `NaN` and categorical features as non-negative codes;
|
|
240
|
+
models with no exact equivalent raise `ModelFormatError`:
|
|
241
|
+
|
|
242
|
+
```python
|
|
243
|
+
booster.save_model("model.ubj") # a file XGBoost loads; .json for native JSON
|
|
244
|
+
loaded = hessboost.Booster("model.ubj") # format detected from the content
|
|
245
|
+
early = booster[:10] # the first 10 boosting iterations, as a Booster
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Modern modeling
|
|
249
|
+
|
|
250
|
+
### Conformal intervals
|
|
251
|
+
|
|
252
|
+
`SplitConformal` wraps one single-output model in `f(x) ± Q`, where `Q` is
|
|
253
|
+
the calibration set's quantile of `|y - f(x)|` — finite-sample `1 - alpha`
|
|
254
|
+
coverage for exchangeable rows:
|
|
255
|
+
|
|
256
|
+
```python
|
|
257
|
+
from hessboost.conformal import SplitConformal
|
|
258
|
+
|
|
259
|
+
cal = SplitConformal.calibrate(booster, X_cal, y_cal, alpha=0.1)
|
|
260
|
+
lower, upper = cal.predict_interval(X_test).T
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
`ConformalizedQuantile` instead adjusts a quantile band `[q_lo(x), q_hi(x)]`
|
|
264
|
+
by its calibration quantile, so it also tightens a band that over-covers.
|
|
265
|
+
The band comes from two single-quantile models (`calibrate`), two outputs
|
|
266
|
+
of one multi-quantile model (`calibrate_outputs`), or a `dist:*` model's
|
|
267
|
+
central quantiles (`calibrate_distribution`):
|
|
268
|
+
|
|
269
|
+
```python
|
|
270
|
+
from hessboost.conformal import ConformalizedQuantile
|
|
271
|
+
|
|
272
|
+
band = hessboost.train(
|
|
273
|
+
{"objective": "reg:quantileerror", "quantile_alpha": [0.05, 0.95]},
|
|
274
|
+
hessboost.DMatrix(X_train, y_train),
|
|
275
|
+
200,
|
|
276
|
+
)
|
|
277
|
+
cqr = ConformalizedQuantile.calibrate_outputs(band, X_cal, y_cal, alpha=0.1)
|
|
278
|
+
lower, upper = cqr.predict_interval(X_test).T # >= 90% coverage, finite-sample
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### Distributional boosting
|
|
282
|
+
|
|
283
|
+
A `dist:*` objective fits a predictive distribution per row instead of a
|
|
284
|
+
point. `predict_distribution` returns a `Distributions` object whose
|
|
285
|
+
summaries are vectorized over rows:
|
|
286
|
+
|
|
287
|
+
```python
|
|
288
|
+
dist = hessboost.train({"objective": "dist:normal"}, hessboost.DMatrix(X_train, y_train), 300)
|
|
289
|
+
d = dist.predict_distribution(X_test)
|
|
290
|
+
means, stds = d.mean(), d.std()
|
|
291
|
+
lower, upper = d.interval(0.9).T
|
|
292
|
+
ll, score = d.log_prob(y_test), d.crps(y_test)
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Virtual ensembles
|
|
296
|
+
|
|
297
|
+
A model trained with `posterior_sampling` (SGLB: `langevin` noise plus
|
|
298
|
+
`model_shrink_rate`) carries its own posterior ensemble: `count` members
|
|
299
|
+
rebuilt exactly from its model shrinkage, member-major (`(count, rows)` for
|
|
300
|
+
single-output models), with each member's iteration count alongside:
|
|
301
|
+
|
|
302
|
+
```python
|
|
303
|
+
sglb = hessboost.train({"posterior_sampling": True}, hessboost.DMatrix(X_train, y_train), 1000)
|
|
304
|
+
members, iterations = sglb.predict_virtual_ensembles(X_test, 10)
|
|
305
|
+
u = sglb.predict_uncertainty(X_test, 10) # u.mean, u.knowledge, u.data, u.total
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
`predict_uncertainty` decomposes the ensemble à la CatBoost: knowledge
|
|
309
|
+
(epistemic) uncertainty rises off the training data. Plain regression has
|
|
310
|
+
only `mean` and `knowledge` (`data`/`total` are `None`); `dist:*` and
|
|
311
|
+
classification models get the full decomposition.
|
|
312
|
+
|
|
313
|
+
### Online updates
|
|
314
|
+
|
|
315
|
+
`OnlineModel` keeps a trained model with its training data and updates both
|
|
316
|
+
in place as rows arrive or must be forgotten. `Exact()` retrains, so every
|
|
317
|
+
update equals `hessboost.train` on the updated data bit for bit;
|
|
318
|
+
`Approximate(tolerance)` (default, `0.1`) keeps splits that still rank near
|
|
319
|
+
the top and is faster for small changes. A refused, stopped, or interrupted
|
|
320
|
+
(Ctrl-C) update changes nothing:
|
|
321
|
+
|
|
322
|
+
```python
|
|
323
|
+
from hessboost.online import Approximate, OnlineModel
|
|
324
|
+
|
|
325
|
+
online = OnlineModel.train(
|
|
326
|
+
{"tree_method": "hist", "max_depth": 6},
|
|
327
|
+
hessboost.DMatrix(X_train, y_train),
|
|
328
|
+
100,
|
|
329
|
+
Approximate(0.1),
|
|
330
|
+
)
|
|
331
|
+
report = online.update(hessboost.DMatrix(X_new, y_new), deletions=[3, 17])
|
|
332
|
+
online.model.predict(X_test) # online.data: the updated training rows
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
The report counts kept nodes, regrown subtrees, and refreshed rows
|
|
336
|
+
(`UpdateReport`); `OnlineModel.from_model` resumes from a saved `Booster`
|
|
337
|
+
and its training data. Updates need `hist` depth-wise trees without sampling
|
|
338
|
+
or constraints and unweighted data.
|
|
339
|
+
|
|
340
|
+
### Explainable boosting machines
|
|
341
|
+
|
|
342
|
+
`{"booster": "ebm"}` trains a cyclic GA2M with outer bags, FAST pairs, and
|
|
343
|
+
per-bag early stopping. Every term's piecewise-constant shape function is
|
|
344
|
+
readable from the model (`NumericAxis` edges or `CategoricalAxis` codes,
|
|
345
|
+
plus a missing cell per axis); intercept plus shapes is the margin:
|
|
346
|
+
|
|
347
|
+
```python
|
|
348
|
+
from hessboost import ebm
|
|
349
|
+
|
|
350
|
+
model = hessboost.train({"booster": "ebm"}, hessboost.DMatrix(X_train, y_train), 50)
|
|
351
|
+
shapes = ebm.shape_functions(model)
|
|
352
|
+
shapes.intercept, shapes.terms[0].values
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
A Boulevard EBM (`{"booster": "ebm", "ebm_boulevard": True}`) additionally
|
|
356
|
+
supports confidence bands on its shapes via
|
|
357
|
+
`hessboost.inference.EbmInference.term_bands`.
|
|
358
|
+
|
|
359
|
+
### Boulevard inference
|
|
360
|
+
|
|
361
|
+
Boulevard boosting (`{"booster": "boulevard"}`) samples trees with dropout
|
|
362
|
+
so the ensemble converges to a kernel ridge posterior, whose leaf kernel
|
|
363
|
+
gives asymptotic confidence, prediction, and reproduction intervals for
|
|
364
|
+
`f(x)`. Refit the leaves on independent rows first (`honest_refit`), fit
|
|
365
|
+
the kernel over those rows, then query any rows:
|
|
366
|
+
|
|
367
|
+
```python
|
|
368
|
+
from hessboost.inference import BoulevardInference, honest_refit
|
|
369
|
+
|
|
370
|
+
trained = hessboost.train(
|
|
371
|
+
{"booster": "boulevard", "eta": 0.8, "boulevard_dropout": 0.5, "subsample": 0.8},
|
|
372
|
+
hessboost.DMatrix(X_struct, y_struct),
|
|
373
|
+
200,
|
|
374
|
+
)
|
|
375
|
+
model = honest_refit(trained, X_values, y_values) # leaves from independent rows
|
|
376
|
+
inference = BoulevardInference.fit(model, X_values, y_values, holdout=X_cal, holdout_label=y_cal)
|
|
377
|
+
lower, upper = inference.confidence_intervals(X_test, alpha=0.05).T # for f(x)
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
The intervals are conditional on the tree structures: nominal for
|
|
381
|
+
low-dimensional smooth signals after an honest refit, under-covering
|
|
382
|
+
elsewhere (see the crate's `inference` docs). `Booster.boulevard` records
|
|
383
|
+
how the model was trained.
|
|
384
|
+
|
|
385
|
+
### Diffusion models
|
|
386
|
+
|
|
387
|
+
`hessboost.diffusion` fits nonparametric `p(y | x)` for scalar or vector
|
|
388
|
+
labels (multimodal, skewed, heavy-tailed) by conditional diffusion or flow
|
|
389
|
+
matching with GBDT score models, after Treeffuser and DiffGBM. `sample`
|
|
390
|
+
returns `(rows, n_samples, outputs)` draws, deterministic per seed and step
|
|
391
|
+
count (`n_steps=` overrides the model's); `mean`, `quantiles`, and `crps`
|
|
392
|
+
summarize them:
|
|
393
|
+
|
|
394
|
+
```python
|
|
395
|
+
from hessboost.diffusion import DiffusionModel, DiffusionParams, crps, quantiles
|
|
396
|
+
|
|
397
|
+
flow = DiffusionModel.fit(DiffusionParams.flow_matching(), X_train, y_train)
|
|
398
|
+
draws = flow.sample(X_test, 200, seed=0) # (rows, 200, outputs) float32
|
|
399
|
+
bands = quantiles(draws, [0.05, 0.5, 0.95]) # (rows, 3, outputs)
|
|
400
|
+
scores = crps(draws, y_test) # (rows, outputs)
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
`DiffusionParams` is a frozen dataclass tree with presets `default()`,
|
|
404
|
+
`treeffuser()`, and `flow_matching()`; its `training` mappings are XGBoost
|
|
405
|
+
parameters, as `train` reads them. Models save with
|
|
406
|
+
`to_bytes(format="binary")` / `save(path, format="binary")` (`"binary"` or
|
|
407
|
+
`"json"`) and load with `from_bytes(data, format="auto")` /
|
|
408
|
+
`load(path, format="auto")`, or pickle (which also keeps feature names and
|
|
409
|
+
categories). `fit` releases the GIL but cannot be interrupted: Ctrl-C takes
|
|
410
|
+
effect once it returns.
|
|
411
|
+
|
|
412
|
+
### Synthetic tabular data
|
|
413
|
+
|
|
414
|
+
`hessboost.diffusion.forest` fits ForestFlow / ForestDiffusion models of
|
|
415
|
+
whole rows (optionally per class of a label) with per-noise-level GBDTs.
|
|
416
|
+
`sample` draws synthetic rows as a `ForestSamples` (`values`, plus `labels`
|
|
417
|
+
for a class-conditional model); `sample_for_labels` draws one row per given
|
|
418
|
+
label:
|
|
419
|
+
|
|
420
|
+
```python
|
|
421
|
+
from hessboost.diffusion.forest import ForestModel, ForestParams
|
|
422
|
+
|
|
423
|
+
forest = ForestModel.fit(ForestParams.forest_diffusion(), X_with_nans)
|
|
424
|
+
synthetic = forest.sample(1000, seed=0) # .values (1000, columns), .labels None
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
The diffusion variant also imputes missing values, keeping the observed
|
|
428
|
+
entries (flow models refuse). Values are in the data's own coding:
|
|
429
|
+
|
|
430
|
+
```python
|
|
431
|
+
filled = forest.impute(X_with_nans, n_imputations=5) # (5, rows, columns)
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
`ForestParams` has presets `forest_flow()` (the defaults) and
|
|
435
|
+
`forest_diffusion()`; its `training` mappings are XGBoost parameters, and
|
|
436
|
+
models save and load like `DiffusionModel`s.
|
|
437
|
+
|
|
438
|
+
### GPU prediction
|
|
439
|
+
|
|
440
|
+
On macOS, `Booster.to_gpu()` lays the model out for batch prediction on
|
|
441
|
+
Metal: the forest uploads once, and each call predicts bit-identically to
|
|
442
|
+
`Booster.predict` (values or raw margins), faster from roughly a few
|
|
443
|
+
thousand row-trees upward:
|
|
444
|
+
|
|
445
|
+
```python
|
|
446
|
+
from hessboost import GpuModel
|
|
447
|
+
|
|
448
|
+
gpu = booster.to_gpu()
|
|
449
|
+
probabilities = gpu.predict(X_test)
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Compact models
|
|
453
|
+
|
|
454
|
+
`Booster.to_compact()` packs the trees default prediction uses into
|
|
455
|
+
hessboost's bit-packed `HBTD` format (*Boosted Trees on a Diet*), which
|
|
456
|
+
predicts bit-identical values and margins in a fraction of the size;
|
|
457
|
+
training with `toad_penalty_feature`/`toad_penalty_threshold` shrinks it
|
|
458
|
+
further. `Booster.size_report()` compares the two formats:
|
|
459
|
+
|
|
460
|
+
```python
|
|
461
|
+
from hessboost import CompactModel
|
|
462
|
+
|
|
463
|
+
compact = booster.to_compact()
|
|
464
|
+
compact.save_model("model.hbtd")
|
|
465
|
+
predictions = CompactModel("model.hbtd").predict(X_test)
|
|
466
|
+
print(booster.size_report().compression_ratio)
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### Validation folds
|
|
470
|
+
|
|
471
|
+
`hessboost.folds` builds `(train_rows, test_rows)` splits for `cv` or custom
|
|
472
|
+
loops: shuffled `k_fold` (what `cv` uses by default), `forward_chaining`
|
|
473
|
+
expanding windows with a purged `gap`, and `purged_forward` (timestamped
|
|
474
|
+
rows, purged by each row's own label window, for overlapping or irregular
|
|
475
|
+
horizons):
|
|
476
|
+
|
|
477
|
+
```python
|
|
478
|
+
from hessboost import folds
|
|
479
|
+
|
|
480
|
+
splits = folds.forward_chaining(dtrain.num_row(), 4, gap=24)
|
|
481
|
+
result = hessboost.cv({"max_depth": 4}, dtrain, 100, folds=splits)
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### Ordered target statistics
|
|
485
|
+
|
|
486
|
+
`hessboost.target_stats.OrderedTargetEncoder` replaces categorical columns
|
|
487
|
+
with CatBoost-style ordered target means: a training row's encoding never
|
|
488
|
+
sees its own label. `label=` supplies the target for a multi-target matrix
|
|
489
|
+
or a class's 0/1 indicator. In `cv`, `target_stats=` fits the encoder on
|
|
490
|
+
each fold's training rows only, so no held-out label reaches an encoding:
|
|
491
|
+
|
|
492
|
+
```python
|
|
493
|
+
from hessboost.target_stats import OrderedTargetEncoder
|
|
494
|
+
|
|
495
|
+
encoder = OrderedTargetEncoder(seed=7)
|
|
496
|
+
dtrain_encoded, stats = encoder.fit_transform(dtrain, ["city"])
|
|
497
|
+
booster = hessboost.train({"max_depth": 4}, dtrain_encoded, 100)
|
|
498
|
+
predictions = booster.predict(stats.transform(X_test))
|
|
499
|
+
result = hessboost.cv({"max_depth": 4}, dtrain, 100, target_stats=["city"], target_encoder=encoder)
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### Extra training options
|
|
503
|
+
|
|
504
|
+
Every hessboost training option (`path_smooth`, `extra_trees`,
|
|
505
|
+
`linear_tree`, `grow_policy="symmetric"`, `use_quantized_grad`,
|
|
506
|
+
`pos_bagging_fraction`, `neg_bagging_fraction`, `bagging_by_query`, the
|
|
507
|
+
`dist:*` objectives and their `dist_gradient`, `rank:xendcg`, ...) is a
|
|
508
|
+
`params` key. XE-NDCG's keyed per-round random stream differs from
|
|
509
|
+
LightGBM's `rank_xendcg` stream.
|
|
510
|
+
|
|
511
|
+
## Differences from XGBoost's Python package
|
|
512
|
+
|
|
513
|
+
- Errors: `hessboost.HessboostError` (a `ValueError`) for refused inputs,
|
|
514
|
+
with subclasses `InvalidDataError` (data content: labels outside the
|
|
515
|
+
objective's domain, negative weights, bad groups or bounds; the message
|
|
516
|
+
names the input and any eval set), `IncompatibleModelError` (a model the
|
|
517
|
+
parameters or data do not match: continued training, refresh, slicing)
|
|
518
|
+
and `ModelFormatError` (model files); invalid or conflicting parameters
|
|
519
|
+
raise `HessboostError` itself. `TypeError` for wrong types.
|
|
520
|
+
Unsupported parameters are refused, including `verbosity`; `missing`
|
|
521
|
+
belongs to `DMatrix`.
|
|
522
|
+
- `TrainingCallback.after_iteration(iteration, evals_log) -> bool` sees the
|
|
523
|
+
round and the evaluation history, not the model (XGBoost's also gets the
|
|
524
|
+
booster and has `before_training`/`after_training` hooks); returning
|
|
525
|
+
`True` stops training with the rounds so far. `hessboost.cv` has no
|
|
526
|
+
callbacks and finishes its folds before Ctrl-C takes effect.
|
|
527
|
+
- `custom_metric(predictions, labels, weights)` returns a float and is named
|
|
528
|
+
by the function's `__name__` (XGBoost passes a `DMatrix` and returns
|
|
529
|
+
`(name, value)`). `obj(margins, dtrain)` matches XGBoost; the model then
|
|
530
|
+
predicts margins from a zero intercept (or `base_score`). `obj` replaces
|
|
531
|
+
`objective`, which `params` must then not set, and `num_class` is the
|
|
532
|
+
custom objective's output count (XGBoost's custom-softmax convention;
|
|
533
|
+
default: one per label column).
|
|
534
|
+
- `cv` returns a dict of numpy arrays (`test-<metric>-mean`/`-std`) with
|
|
535
|
+
held-out metrics only; there is no `stratified` or `as_pandas`.
|
|
536
|
+
- `predict` defaults to the iterations through `best_iteration` (XGBoost's
|
|
537
|
+
scikit-learn behavior); pass `iteration_range=(0, 0)` for all. SHAP and
|
|
538
|
+
leaf ranges start at iteration 0; `pred_leaf` defaults to every iteration
|
|
539
|
+
instead, and returns `int32`.
|
|
540
|
+
- On macOS, `Booster.to_gpu()` lays the model out for GPU batch prediction
|
|
541
|
+
on Metal (`GpuModel.predict`, bit-identical to `Booster.predict`; see
|
|
542
|
+
whether a device exists with `GpuModel.available()`).
|
|
543
|
+
- Model files do not store feature names or categories (pickles do).
|
|
544
|
+
- Not available: `DMatrix` from files or `QuantileDMatrix`, `inplace_predict`
|
|
545
|
+
(`predict` takes arrays directly), `Booster.get_dump`/`trees_to_dataframe`
|
|
546
|
+
/`dump_model`, attributes (`set_attr`), plotting, distributed (Dask/Spark)
|
|
547
|
+
and CUDA training, `approx_contribs`, and `strict_shape`. The macOS wheels
|
|
548
|
+
support `device="metal"` (GPU histograms while training).
|
|
549
|
+
|
|
550
|
+
## Development
|
|
551
|
+
|
|
552
|
+
From `python/` in the [repository](https://github.com/brndnmtthws/hessboost),
|
|
553
|
+
with [uv](https://docs.astral.sh/uv/):
|
|
554
|
+
|
|
555
|
+
```sh
|
|
556
|
+
uv sync --locked # build the extension and install dev tools
|
|
557
|
+
uv run --locked pytest
|
|
558
|
+
uv run --locked pyright --verifytypes hessboost --ignoreexternal
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
Lint, format, and type-check all of the repository's Python from its root
|
|
562
|
+
(configuration: `ruff.toml`, `ty.toml`):
|
|
563
|
+
|
|
564
|
+
```sh
|
|
565
|
+
uv run --project python --locked ruff check
|
|
566
|
+
uv run --project python --locked ruff format --check
|
|
567
|
+
uv run --project python --locked ty check
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
## License
|
|
571
|
+
|
|
572
|
+
Apache-2.0.
|
|
573
|
+
|
|
@@ -89,6 +89,17 @@ let result = Trainer::new(¶ms, &dtrain, 1000)
|
|
|
89
89
|
let model = result.model; // predicts with the best iteration
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
+
To ship a self-contained (e.g. static) binary, compile the model file into it;
|
|
93
|
+
it decodes on first use:
|
|
94
|
+
|
|
95
|
+
```rust
|
|
96
|
+
use hessboost::model::EmbeddedModel;
|
|
97
|
+
|
|
98
|
+
static MODEL: EmbeddedModel = EmbeddedModel::new(include_bytes!("model.bin"), ModelFormat::Binary);
|
|
99
|
+
|
|
100
|
+
let preds = MODEL.get()?.predict(&dtest, Iterations::Best)?;
|
|
101
|
+
```
|
|
102
|
+
|
|
92
103
|
Every type and option is in the [API docs](https://docs.rs/hessboost);
|
|
93
104
|
runnable programs live in [`examples/`](examples)
|
|
94
105
|
(`cargo run --release --example <name>`):
|
|
@@ -122,8 +133,10 @@ runnable programs live in [`examples/`](examples)
|
|
|
122
133
|
|
|
123
134
|
[`python/`](python) holds the Python package (`pip install hessboost`):
|
|
124
135
|
`DMatrix`, `train`, `cv`, and `Booster` (taking XGBoost's parameter names),
|
|
125
|
-
scikit-learn estimators, pandas categorical input, and the conformal,
|
|
126
|
-
distributional, tree-diffusion, ForestFlow,
|
|
136
|
+
scikit-learn estimators, pandas and polars categorical input, and the conformal,
|
|
137
|
+
distributional, tree-diffusion, ForestFlow, in-place update, ordered target
|
|
138
|
+
statistics, budget training, and compact model extras
|
|
139
|
+
(on macOS, `Booster.to_gpu()` batch-predicts on the Metal GPU):
|
|
127
140
|
|
|
128
141
|
```python
|
|
129
142
|
import hessboost
|
|
@@ -143,9 +156,10 @@ See [`python/README.md`](python/README.md).
|
|
|
143
156
|
- **Objectives & metrics:** Regression (squared, log, Huber, quantile, expectile),
|
|
144
157
|
binary/multiclass classification, ranking (LambdaMART, XE-NDCG), count, and survival (Cox, AFT),
|
|
145
158
|
plus typed objective and metric APIs and custom loss hooks.
|
|
146
|
-
- **Validation & workflow:** Cross-validation (including purged and forward time-series folds
|
|
147
|
-
|
|
148
|
-
|
|
159
|
+
- **Validation & workflow:** Cross-validation (including purged and forward time-series folds,
|
|
160
|
+
whole-query ranking folds, and per-fold target statistics), early stopping, feature importance,
|
|
161
|
+
SHAP values and interactions, model slicing, and iteration ranges.
|
|
162
|
+
- **Interchange:** Native binary and JSON formats, XGBoost JSON/UBJSON import/export, LightGBM model import, and models embedded in the binary at compile time.
|
|
149
163
|
- **Modern modeling (opt-in):**
|
|
150
164
|
- [Conformal intervals](https://docs.rs/hessboost/latest/hessboost/conformal/): Finite-sample coverage guarantees.
|
|
151
165
|
- [Boulevard inference](https://docs.rs/hessboost/latest/hessboost/inference/): Asymptotic confidence and prediction intervals for `f(x)`.
|
|
@@ -34,6 +34,7 @@ dependencies = ["numpy>=2"]
|
|
|
34
34
|
|
|
35
35
|
[project.optional-dependencies]
|
|
36
36
|
pandas = ["pandas>=2.2"]
|
|
37
|
+
polars = ["polars>=1.0"]
|
|
37
38
|
scikit-learn = ["scikit-learn>=1.6"]
|
|
38
39
|
|
|
39
40
|
[project.urls]
|
|
@@ -49,6 +50,8 @@ test = [
|
|
|
49
50
|
# CI's `pyright --verifytypes` checks the installed wheel's public types.
|
|
50
51
|
"pyright>=1.1.414",
|
|
51
52
|
"pandas>=2.2",
|
|
53
|
+
# abi3-only wheels: test-wheel.sh leaves it out on free-threaded Python.
|
|
54
|
+
"polars>=1.0",
|
|
52
55
|
"scikit-learn>=1.6",
|
|
53
56
|
"scipy>=1.14",
|
|
54
57
|
]
|
|
@@ -88,7 +88,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
|
88
88
|
|
|
89
89
|
[[package]]
|
|
90
90
|
name = "hessboost"
|
|
91
|
-
version = "0.2.
|
|
91
|
+
version = "0.2.2"
|
|
92
92
|
dependencies = [
|
|
93
93
|
"objc2",
|
|
94
94
|
"objc2-foundation",
|
|
@@ -101,7 +101,7 @@ dependencies = [
|
|
|
101
101
|
|
|
102
102
|
[[package]]
|
|
103
103
|
name = "hessboost-python"
|
|
104
|
-
version = "0.2.
|
|
104
|
+
version = "0.2.2"
|
|
105
105
|
dependencies = [
|
|
106
106
|
"hessboost",
|
|
107
107
|
"numpy",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "hessboost-python"
|
|
3
3
|
# Must equal the root crate's version: the wheel version comes from here.
|
|
4
|
-
version = "0.2.
|
|
4
|
+
version = "0.2.2"
|
|
5
5
|
authors = ["Brenden Matthews <brenden@brndn.io>"]
|
|
6
6
|
description = "Python bindings for hessboost"
|
|
7
7
|
edition = "2024"
|