Downloads · 30 days
0
AurelPx/bank-marketing-gbdt-ensemble
bank-marketing-gbdt-ensemble is a tabular classification model from AurelPx. Use it for the tabular classification task on the model card, and read the license before you ship it in a product. It is set up for sklearn. The card lists the license as mit.
A soft-voting ensemble of three gradient-boosted tree models (XGBoost + LightGBM + CatBoost), each hyperparameter-tuned with Optuna (200 trials), following the exact evaluation protocol of Grinsztajn et al., NeurIPS 2…
Downloads · 30 days
0
Access
Public
Updated Jun 3, 2026
Repo size
14.6 MB
Likes
0
Public
Click a slice to open those files.
.pkl7.3 MB · 100%
From the Hugging Face model README
A soft-voting ensemble of three gradient-boosted tree models (XGBoost + LightGBM + CatBoost), each hyperparameter-tuned with Optuna (200 trials), following the exact evaluation protocol of Grinsztajn et al., NeurIPS 2022 ("Why do tree-based models still outperform deep learning on tabular data?", arXiv:2207.08815).
Result: Test accuracy = 0.8083 ± 0.0058 (mean over 15 random seeds). The ensemble beats every individual tuned model and has the lowest variance.
This is a trained ensemble: ~600 GBDT models were trained during the Optuna search (200 trials × 3 algorithms), plus refits across 15 seeds.
inria-soda/tabular-benchmark, config clf_num_bank-marketingClass, balanced 50/50| Rank | Model | Test Accuracy |
|---|---|---|
| 🥇 1 | Ensemble (XGB+LGBM+Cat) | 0.8083 ± 0.0058 |
| 🥇 1 | CatBoost | 0.8083 ± 0.0062 |
| 3 | XGBoost | 0.8079 ± 0.0058 |
| 4 | LightGBM | 0.8075 ± 0.0066 |
The ensemble matches the best single model (CatBoost) on the mean and wins on stability (lowest std) : the expected, robust outcome of post-hoc ensembling (consistent with TabArena 2025).
| Model | Val acc | Test acc |
|---|---|---|
| XGBoost | 0.8106 | 0.8060 |
| LightGBM | 0.8119 | 0.8065 |
| CatBoost | 0.8151 | 0.8051 |
| Ensemble | — | 0.8074 |
See results.json for the full set. Highlights:
import pickle, numpy as np
from huggingface_hub import hf_hub_download
from datasets import load_dataset
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Load the 3-model ensemble (dict of fitted classifiers)
path = hf_hub_download("AurelPx/bank-marketing-gbdt-ensemble", "ensemble.pkl")
ens = pickle.load(open(path, "rb")) # {"XGBoost":..., "LightGBM":..., "CatBoost":...}
# Reproduce the seed-42 test split
df = load_dataset("inria-soda/tabular-benchmark", "clf_num_bank-marketing", split="train").to_pandas()
X = df.drop(columns=["Class"]).values.astype("float32")
y = LabelEncoder().fit_transform(df["Class"].values)
_, Xte, _, yte = train_test_split(X, y, test_size=0.21, random_state=42, stratify=y)
# Soft-voting prediction
proba = np.mean([m.predict_proba(Xte)[:, 1] for m in ens.values()], axis=0)
print("Ensemble test accuracy:", accuracy_score(yte, (proba > 0.5).astype(int))) # ~0.807
@inproceedings{grinsztajn2022why,
title={Why do tree-based models still outperform deep learning on typical tabular data?},
author={Grinsztajn, L{\'e}o and Oyallon, Edouard and Varoquaux, Ga{\"e}l},
booktitle={NeurIPS Datasets and Benchmarks Track},
year={2022}
}