Skip to main content

GBDT with absolute-threshold screening split selection, accelerated by fused Triton kernels.

Project description

Screening Boosted Trees

Gradient-boosted decision trees where each candidate split is scored by an absolute relevance value derived from the screening transform introduced in "Screening Is Enough" (Nakanishi 2026).

Instead of selecting the relatively best split among all candidates, a node with max(ρ) == 0 emits no split at all — becoming a leaf without an external min_gain_to_split heuristic. The acceptance threshold is learnable.

Install

pip install ibu-boost          # NumPy reference only
pip install "ibu-boost[triton]" # + GPU Triton kernels (CUDA)

Windows GPU: installs triton-windows automatically — same API as upstream Triton.

Quick start

from ibu_boost import ScreeningBooster
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
import numpy as np

X, y = fetch_california_housing(return_X_y=True)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2, random_state=0)

model = ScreeningBooster(
    n_estimators=100, learning_rate=0.1, max_depth=6,
    tree_type="oblivious",   # CatBoost-style symmetric splits
    device="cuda",           # requires [triton] extra
)
model.fit(X_tr, y_tr.astype("float32"))
preds = model.predict(X_te)
rmse = float(np.sqrt(np.mean((y_te - preds) ** 2)))
print(f"RMSE: {rmse:.4f}")
print(f"Mean accept_rate: {model.mean_accept_rate():.1%}")

GPU performance (RTX 4060 Ti, California Housing, 100 rounds)

Backend Train time Speedup RMSE
CPU (NumPy) 5.34 s 1x 0.5286 ± 0.0039
CUDA (Triton) 1.70 s 3.15x 0.5286 ± 0.0039

Kernel-level speedup (N=65536, F=8, B=255): 51x over NumPy. RMSE is numerically identical across backends.

Screening transform

raw_gain  = G_L²/(H_L+λ) + G_R²/(H_R+λ) − G_total²/(H_total+λ)
norm_gain = raw_gain / H_total          # N-invariant normalisation
s         = 1 − exp(−norm_gain / τ)    # bounded similarity ∈ [0, 1)
ρ         = max(1 − r·(1−s), 0)²       # Trim-and-Square

Parameters τ = exp(s_w) + ε and r = exp(s_r) + 1 are stored as log-scale scalars (ScreeningParams). They will become learnable in a future release.

Key features

  • Absolute split rejection: max(ρ) == 0 → node becomes leaf automatically. No min_gain_to_split hyperparameter required.
  • Oblivious tree mode (tree_type="oblivious"): CatBoost-style symmetric splits — all nodes at a depth share one (feature, bin). Fast GPU aggregation.
  • Non-oblivious mode (tree_type="non_oblivious"): each node independently selects its best split (standard GBDT structure).
  • Missing value handling: XGBoost-style learned default direction per split.
  • Binary classification (objective="binary"): log-loss with sigmoid output.
  • Screening diagnostics: model.mean_accept_rate() shows fraction of splits accepted — a real-time indicator of over/under-rejection.
  • ScreeningParamSearch: K-fold grid search over (s_w, s_r).
  • Triton GPU kernels: fused histogram scatter + screening transform; batched multi-node dispatch; full GPU pipeline (X/g/h pre-loaded, on-device normalisation).

Parameters

ScreeningBooster(
    n_estimators   = 100,          # boosting rounds
    learning_rate  = 0.1,
    max_depth      = 6,
    min_samples_leaf = 20,
    num_bins       = 255,          # quantile bins per feature
    params         = ScreeningParams(s_w=-2.0, s_r=-6.0, lam=1.0),
    tree_type      = "oblivious",  # or "non_oblivious"
    objective      = "regression", # or "binary"
    device         = "cpu",        # or "cuda"
)

Milestones

Milestone Status
M0: NumPy reference + Triton skeleton
M1: Single regression tree + diagnostics
M2: Triton numerical consistency + LightGBM/XGBoost benchmark
M3: Oblivious tree + binary classification
M4: h normalisation + ScreeningParamSearch (K-fold grid tuner)
M5: Missing value handling (XGBoost-style default direction)
M6: Triton GPU kernels (histogram + screening fused)
M7: Batched multi-node GPU dispatch + full GPU pipeline (3.15x E2E)
Phase 2: Learnable (s_w, s_r) via differentiable surrogate 🔜

License

MIT © 2026 ibusan100

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ibu_boost-0.1.0.tar.gz (37.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ibu_boost-0.1.0-py3-none-any.whl (30.9 kB view details)

Uploaded Python 3

File details

Details for the file ibu_boost-0.1.0.tar.gz.

File metadata

  • Download URL: ibu_boost-0.1.0.tar.gz
  • Upload date:
  • Size: 37.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.8

File hashes

Hashes for ibu_boost-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0625ee65d993b3d3129611dbefc4aaacbf6682e6c831da101df2d48f86eeb216
MD5 01ef29399d8ea1c16053e881aebad71e
BLAKE2b-256 acad53c50b0563e3ca51bae4628f1bfa03e96bc38aee48ddb1d9cfc6376f3dba

See more details on using hashes here.

File details

Details for the file ibu_boost-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: ibu_boost-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 30.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.8

File hashes

Hashes for ibu_boost-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c3a8aa0604d796263f7a85806430d61b902c6a18466dc7e36418ada87153be89
MD5 0f04a3adbfaaa6232b4b479f8ed9f37e
BLAKE2b-256 5f8f197965c4b1a08b94095158a3a31a8f75ea59737a159be7562a269a6f2f28

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page