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. Nomin_gain_to_splithyperparameter 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0625ee65d993b3d3129611dbefc4aaacbf6682e6c831da101df2d48f86eeb216
|
|
| MD5 |
01ef29399d8ea1c16053e881aebad71e
|
|
| BLAKE2b-256 |
acad53c50b0563e3ca51bae4628f1bfa03e96bc38aee48ddb1d9cfc6376f3dba
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c3a8aa0604d796263f7a85806430d61b902c6a18466dc7e36418ada87153be89
|
|
| MD5 |
0f04a3adbfaaa6232b4b479f8ed9f37e
|
|
| BLAKE2b-256 |
5f8f197965c4b1a08b94095158a3a31a8f75ea59737a159be7562a269a6f2f28
|