Bike Sharing - Tabular Models (8 architectures + interpretability, Poisson)
Pre-trained models for the
t22000t/bike-sharing-tabular
dataset, covering all
eight architectures from the
tabular-data-modelling-pipeline
with a
Poisson loss matching the count target.
v3 release - adds the full interpretability stack: SHAP
TreeExplainer for the GBMs, Captum Integrated Gradients for the DL
models, per-layer attention for FT-Transformer, residual analysis
for CANN / CANN-GBM, per-row coefficients for LocalGLMnet, and full
distributional outputs (mean, variance, quantiles, VaR) for DRN.
See
INTERPRETABILITY.md and
dashboard_dl_interpretability.html.
Results
All 8 architectures trained with default hyperparameters (no Optuna
tuning), 3-seed ensembles for the DL models, Poisson family + log link.
| Rank | Model | Test Gini | Test MAE | Test RMSE | A/E ratio | n params | Training time |
|---|
| 1 | XGBoost | 0.4975 | 22.9 | 38.65 | 1.007 | 999 trees | 1.2 s |
| 2 | CatBoost | 0.4935 | 29.7 | 45.87 | 1.021 | 583 trees | 3.3 s |
| 3 | CANN-GBM | 0.4876 | 38.99 | 60.18 | 0.954 | 33,201 | 29.5 s |
| 4 | LocalGLMnet | 0.3137 | 118.06 | 166.09 | 0.894 | 11,139 | 27.3 s |
| 5 | CANN | 0.3085 | 120.68 | 168.60 | 0.879 | 33,201 | 29.6 s |
| 6 | DRN | 0.2926 | 3,819.48† | 7,117.12 | 0.047 | 33,396 | 30.6 s |
| 7 | TabM | 0.1628 | 143.12 | 178.55 | 0.942 | 264,414 | 304.4 s |
| 8 | FT-Transformer | 0.1236 | 142.74 | 178.45 | 0.950 | 464,067 | 186.6 s |
| - | Stacked ensemble (NNLS) | 0.4975 | 22.9 | 38.65 | 1.007 | (9 weights) | - |
† DRN has a calibration issue on this dataset: rank-order
discrimination (Gini=0.29) is reasonable but predicted magnitudes are
~20× the actuals (MAE 3819 vs target mean ~190). The model's
distributional output scaling is off. Treat DRN's predictions as
rank-only; do not interpret them on the count scale.
- Test set: 3,470 hourly rows (20% of 17,379)
- Target:
cnt (hourly bike rental count, 1-977)
- Loss: Poisson NLL (
count:poisson for XGBoost, Poisson for CatBoost)
- Link: log
- Random seed: 42
MAE units are bikes. A test MAE of ~23 on a target with median 142 is genuinely useful.
Interpretability (new in v3)
Multiple methods applied side by side. With 17,379 hourly rows the
data is rich enough that all methods agree closely on the dominant
drivers:
| Method | Applies to | What it measures |
|---|
| SHAP TreeExplainer | CatBoost, XGBoost | Per-row Shapley contribution to the model's log-prediction. |
| Native importance (CatBoost / XGBoost) | CatBoost, XGBoost | Loss reduction (CatBoost) / gain (XGBoost). |
| Captum Integrated Gradients | All 6 DL architectures | Gradient-based attribution for continuous features. |
| FT-Transformer attention | FT-Transformer | Per-layer multi-head self-attention weights. |
| CANN / CANN-GBM residual analysis | CANN, CANN-GBM | Distribution of NN's correction to GBM/GLM base. Here mean=0.043, std=0.286 - the NN added a meaningful but not dominant correction. |
| LocalGLMnet coefficients | LocalGLMnet | Per-row linear coefficients (500 rows × 7 continuous features). |
| DRN distributional output | DRN | Mean shape=2.15, CoV=0.97, VaR95=35,446, VaR99=53,159 (units = bike count). |
Cross-method consensus (the high-confidence finding)
Both CatBoost and XGBoost ranked these five features in their
top-5:
| Feature | CatBoost | XGBoost | Interpretation |
|---|
hr (hour of day) | 0.882 | 0.865 | The dominant driver - by a wide margin. Commute peaks (~8am, ~5pm), midday lull, late-night near-zero. |
yr (2011 vs 2012) | 0.232 | 0.221 | Capital Bikeshare expanded significantly between years. The system grew, so all-else-equal demand doubled. |
temp (normalised) | 0.164 | 0.196 | Warmer weather -> more rentals (up to a heat-stress ceiling not captured here). |
workingday | 0.132 | 0.145 | Working days have commute peaks; weekends/holidays have midday peaks. The interaction with hr is strong. |
season | 0.104 | 0.101 | Independent of temp because it carries daylight + cultural-seasonal effects. |
Note that hr dominates so heavily (importance ~5x the next feature)
that any model failing to use it heavily is essentially blind. This
explains why TabM and FT-Transformer underperform on this dataset
despite 17k rows - their attention/aggregation mechanisms appear
to dilute the strong univariate signal in hr.
Full breakdown - per-method top-10 tables, LocalGLMnet coefficient
distributions, sign-stability analysis - is in
INTERPRETABILITY.md. For interactive plots
see
dashboard_dl_interpretability.html.
Files
| File | What it is |
|---|
catboost.cbm | Trained CatBoost (Poisson loss) |
xgboost.json | Trained XGBoost Booster (count:poisson, base_score=log(mean(y))) |
cann_member{0,1,2}.pt | CANN 3-seed ensemble |
cann_gbm_member{0,1,2}.pt | CANN-GBM 3-seed ensemble |
ft_transformer_member{0,1,2}.pt | FT-Transformer 3-seed ensemble |
tabm_member{0,1,2}.pt | TabM 3-seed ensemble |
localglmnet_member{0,1,2}.pt | LocalGLMnet 3-seed ensemble |
drn_member{0,1,2}.pt | DRN 3-seed ensemble |
evaluation_summary.csv | Per-model train/test metrics |
ensemble_weights.json | NNLS weights over the 8 base predictions |
dashboard_dl_models.html | Performance dashboard (Lorenz, calibration, A/P scatter) |
dashboard_dl_interpretability.html | Interpretability dashboard (SHAP, IG, attention, residuals) |
feature_importance.csv | Consolidated importances across CatBoost + XGBoost |
localglmnet_coefficients.csv | LocalGLMnet per-row coefficients (500 rows × 7 continuous features) |
drn_distributional_outputs.csv | DRN per-row distributional moments |
INTERPRETABILITY.md | Human-readable interpretability summary report |
figures/fig_dl_*.png | Standalone publication figures (incl. attention heatmap) |
model_summary.json | Structured run record |
Loading and inference
CatBoost
1from huggingface_hub import hf_hub_download
2from catboost import CatBoostRegressor
3import pandas as pd
4
5path = hf_hub_download("t22000t/bike-sharing-tabular-models", "catboost.cbm")
6model = CatBoostRegressor()
7model.load_model(path)
8
9df = pd.read_csv("hf://datasets/t22000t/bike-sharing-tabular/hour.csv")
10features = [
11 "temp", "atemp", "hum", "windspeed", "hr", "yr", "mnth",
12 "season", "holiday", "weekday", "workingday", "weathersit",
13]
14preds = model.predict(df[features]) # predicted hourly rental count
XGBoost (best overall)
1from huggingface_hub import hf_hub_download
2import xgboost as xgb
3
4path = hf_hub_download("t22000t/bike-sharing-tabular-models", "xgboost.json")
5booster = xgb.Booster()
6booster.load_model(path)
Deep-learning architectures
Each ships as a 3-seed ensemble of PyTorch state-dicts. To reconstruct,
install the pipeline package and load via the matching architecture class:
1git clone https://github.com/timothy22000/tabular_data_modelling_pipeline
2cd tabular_data_modelling_pipeline
3pip install -e ".[all]"
Training configuration
| Setting | Value |
|---|
| Pipeline | tabular-data-modelling-pipeline v0.1.0 |
| Architectures | All 8 (catboost, xgboost, cann, cann_gbm, ft_transformer, tabm, localglmnet, drn) |
| Hyperparameters | Defaults - no Optuna tuning |
| DL ensemble size | 3 seeds per architecture |
| Family / link | Poisson / log |
| XGBoost objective | count:poisson (base_score = log(mean(y))) |
| CatBoost loss | Poisson |
| Train/test split | Random 80/20, seed 42 |
| Cap percentile | 99.9 |
| Hardware | Apple M-series, MPS device for DL |
| Total wall-clock | ~10.7 min |
To reproduce:
1git clone https://github.com/timothy22000/tabular_data_modelling_pipeline
2cd tabular_data_modelling_pipeline
3pip install -e ".[all]"
4python scripts/download_data.py --dataset bike_sharing
5
6OMP_NUM_THREADS=1 python train.py \
7 --config configs/example_bike_sharing.py \
8 --input data/bike_sharing.csv \
9 --skip-tuning --skip-interpretability \
10 --architectures catboost xgboost cann cann_gbm ft_transformer tabm localglmnet drn
(OMP_NUM_THREADS=1 is only needed on macOS arm64.)
Limitations
- No Optuna tuning. Defaults only.
- DRN calibration off. Rank-only on this dataset (see results note).
- FT-Transformer & TabM underperform the GBMs even with 17k rows.
These architectures usually need 50k+ rows + tuning to be competitive
on tabular tasks. Reported here for completeness, not as a recommendation.
- No interpretability artefacts.
--skip-interpretability was set
for wall-clock; re-run without it for Captum attributions and
partial-dependence plots.
- Random split, not chronological. Bike rental data has obvious
seasonality; a date-based split (train on 2011, test on 2012) would
be more realistic.
casual and registered excluded as features (they sum to cnt,
i.e. label leakage).
Intended use
- Demonstrating the pipeline on count/Poisson data alongside the
gamma-family House Prices model collection.
- Baseline for tabular DL research on count regression.
- Teaching Poisson regression with a realistic mid-sized dataset.
Citation
1@article{fanaee2014event,
2 title = {Event labeling combining ensemble detectors and background knowledge},
3 author = {Fanaee-T, Hadi and Gama, Jo{\~a}o},
4 journal = {Progress in Artificial Intelligence},
5 year = {2014}
6}
7
8@software{tabular_data_modelling_pipeline,
9 author = {Mun, Timothy},
10 title = {tabular-data-modelling-pipeline},
11 url = {https://github.com/timothy22000/tabular_data_modelling_pipeline},
12 year = {2026}
13}
Please also cite the individual architecture papers - see the
main repo README.
License
MIT for the model code and pipeline. Underlying dataset under CC BY 4.0.
Related