Differences From Upstream
This page summarizes the main ways in which OmniGBDT differs from the original GBDT-MO package and repository workflow.
Packaging and distribution
Compared with the upstream repository, OmniGBDT:
replaces the old
make.shand manual shared-library workflow with standard Python packagingbundles the native library inside the Python package
keeps
load_lib(path=None)for advanced or compatibility workflowsadds wheel automation for Linux, macOS, and Windows
Python API additions
OmniGBDT adds several public Python-facing features on top of the native core:
public callback hooks for custom gradients, Hessians, metrics, and Python-side early stopping through
train(..., objective=..., eval_metric=..., maximize=...)public
deterministicparameter for fixed-thread CPU repeatability on the same platformoptional sklearn-compatible wrappers for
SingleOutputGBDTandMultiOutputGBDTdirect interoperability with sklearn tooling such as permutation importance
Modeling behavior and defaults
The current OmniGBDT fork also differs from the original package in a few modeling-oriented areas:
regression wrappers now default to
num_rounds=200,lr=0.05,max_bins=128, andearly_stop=15leaving
base_scoreunset now enables automatic regression mean initializationMultiOutputGBDTaccepts either one scalarbase_scoreor one value per output column
These changes are intended to provide stronger out-of-the-box regression accuracy on the examples bundled with the fork, including the financial benchmark in Examples.
Native behavior adjustments
Most changes in the fork remain packaging and Python-API changes, but a small number of native-code adjustments are also present:
stricter
min_samplesenforcement during split scoringsafe child-node materialization after a split
proper root-leaf fallback when no valid split exists
gain-thresholding through
gammathat now applies consistently at the root and deeper nodesdeterministic split selection for fixed-thread CPU repeatability
As a result, same-seed runs are not guaranteed to match older buggy runs exactly. Trees may differ because invalid small-child splits are filtered earlier and the resulting control flow changes accordingly.
For the original project, benchmark figures, experiment scripts, and research context, please refer to: