Views
No views yet
Result: Test accuracy = 0.8083 ± 0.0058 (mean over 15 random seeds). The ensemble beats every individual tuned model and has the lowest variance.
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 |
| Model | Val acc | Test acc |
|---|---|---|
| XGBoost | 0.8106 | 0.8060 |
| LightGBM | 0.8119 | 0.8065 |
| CatBoost | 0.8151 | 0.8051 |
| Ensemble | — | 0.8074 |
results.json for the full set. Highlights:1import pickle, numpy as np
2from huggingface_hub import hf_hub_download
3from datasets import load_dataset
4from sklearn.preprocessing import LabelEncoder
5from sklearn.model_selection import train_test_split
6from sklearn.metrics import accuracy_score
7
8# Load the 3-model ensemble (dict of fitted classifiers)
9path = hf_hub_download("AurelPx/bank-marketing-gbdt-ensemble", "ensemble.pkl")
10ens = pickle.load(open(path, "rb")) # {"XGBoost":..., "LightGBM":..., "CatBoost":...}
11
12# Reproduce the seed-42 test split
13df = load_dataset("inria-soda/tabular-benchmark", "clf_num_bank-marketing", split="train").to_pandas()
14X = df.drop(columns=["Class"]).values.astype("float32")
15y = LabelEncoder().fit_transform(df["Class"].values)
16_, Xte, _, yte = train_test_split(X, y, test_size=0.21, random_state=42, stratify=y)
17
18# Soft-voting prediction
19proba = np.mean([m.predict_proba(Xte)[:, 1] for m in ens.values()], axis=0)
20print("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}
}