Paper · 2021-06-06 · cs.LG
Tabular Data: Deep Learning is Not All You Need
Benchmarks four recent deep models for tabular data (TabNet, NODE, DNF-Net, 1D-CNN) against XGBoost on 11 datasets under one Bayesian tuning protocol. XGBoost usually wins and tunes in fewer iterations. An ensemble of the deep models with XGBoost is best (author-reported 2.32% mean relative deterioration, vs 3.34% for XGBoost).
Ensemble learningHyperparameter optimizationGradient-boosted decision treestabular-databenchmarkensemblesgradient-boosting
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Spreadsheet-style data, with one row per record and one column per feature, is the most common kind of data in industry. For years the go-to tool has been a family of tree-based models such as XGBoost. Several research groups have proposed neural networks built for this kind of data and claimed they beat the trees. Each of those papers tested on its own choice of datasets and tuned its own models, so it was hard to know who was right.
The authors ran a fair test. They took four of the proposed networks and XGBoost, trained all of them on eleven datasets, and tuned each one with the same search budget. XGBoost was usually the most accurate single model, and it was much quicker to tune. The best result came from combining the neural networks with XGBoost in one ensemble.
The practical message is that a tree model is a strong default for tabular data, and that adding neural networks to it can help. The authors caution that eleven datasets cannot cover all tabular problems.
TL;DR
- Compares four deep models for tabular data (TabNet, NODE, DNF-Net, 1D-CNN) with XGBoost on 11 datasets, using one tuning protocol §1 §3.1.
- XGBoost usually outperformed the deep models on datasets that were not in the papers that proposed them §3.2 tab. 2 tab. 3.
- XGBoost needed fewer hyperparameter-search iterations to plateau §3.2 fig. 2.
- An ensemble of the deep models and XGBoost gave the best mean relative result, 2.32% (author-reported) tab. 3.
Problem
Deep networks were proposed for tabular data and some were reported to beat gradient-boosted decision trees §1. Those comparisons used different datasets and different amounts of tuning, and some models lacked open-source code, so the claims could not be checked against each other §1. The paper asks two questions: whether the recent deep models are more accurate, especially on datasets that were not in their original papers, and how long training and hyperparameter search take compared with XGBoost §1.
The authors state that no single model is best for every problem (the "no free lunch" principle) and that their dataset selection cannot cover all tabular data §1.
Method
This is a benchmark study, not a new model. The four deep models are taken from their original papers and evaluated under a common protocol. Steps as the paper performs them:
- Models. Four deep models are compared: TabNet, NODE, DNF-Net and 1D-CNN. Each is described in §2.1 with its key idea (sparse feature masks for TabNet, differentiable oblivious trees for NODE, soft DNF blocks for DNF-Net, and a 1D convolutional stack for 1D-CNN) §2.1. XGBoost is the baseline §2 §3.2.
- Datasets. Eleven datasets are used. Nine come from the TabNet, DNF-Net and NODE papers, and two are Kaggle datasets that no earlier paper used §3.1.1 tab. 1. Each dataset is split as in its original paper §3.1.1 app. B.
- Standardization. Each feature is standardized to zero mean and unit variance, with statistics from the training split only §3.1.1.
- Tuning. Each model is tuned with Hyperopt's Bayesian optimization for 1,000 steps per dataset. The selection criterion is the smallest validation loss. The starting values come from the original paper, and the search spaces are in app. B §3.1.2.
- Training. Deep models use Adam with no learning-rate schedule, following the original implementations. The batch size is tuned per dataset. Training stops after 100 consecutive epochs without validation improvement §3.1.2 app. B.
- Evaluation. Each tuned configuration is run with four seeds, and test results are reported as mean ± standard error of the mean §3.1.2 tab. 2. Classification is scored with cross-entropy and regression with squared error, as the caption states (see Pitfalls) §3.1.2 tab. 2.
- Significance. Friedman's test at the 95% level compares the models §3.1.2 §3.2.
- Ensemble. Five models are combined: TabNet, NODE, DNF-Net, 1D-CNN and XGBoost §2.2. Two combination rules are given, a uniform mixture (eq. 1) and a weighted average whose weights come from validation loss (eq. 2) §2.2 eq. 1 eq. 2.
- Ensemble subsets. Subsets of members are chosen by validation loss, by per-example uncertainty, or at random. Choosing by validation loss worked best on Shrutime §3.2 fig. 1.
- Cost. Compute cost is measured by the number of hyperparameter-search iterations until performance plateaus, because the authors judge wall-clock time unfair across software implementations §3.2 fig. 2.
The combination rules as written:
p(y|x) = \sum_{k=1}^{K} p_{\theta_m}(y|x, \theta_m) eq. 1
p(y|x) = \sum_{k=1}^{K} l^{\text{val}}_k \, p_{\theta_m}(y|x, \theta_m) eq. 2
Here l^{\text{val}}_k is the validation loss of the k-th model §2.2. The text calls these weights the "normalized validation loss", but the formula does not normalize them (see Pitfalls) §2.2.
The subset procedure in pseudocode. The paper does not give an algorithm environment, so this follows the text §3.2:
# Ensemble prediction, validation-loss weighted [§2.2] [eq. 2]
# Input: models (K trained models), x, val_losses (K,)
# Output: class probabilities p(y|x)
def ensemble_predict(models, x, val_losses):
# Weight each model by its validation loss, as eq. 2 is written
weights = val_losses
# Weighted sum of the per-model predictive distributions
probs = sum(
weights[k] * models[k].predict_proba(x)
for k in range(len(models))
)
return probs# Subset ordering by validation loss [§3.2] [fig. 1]
# Input: models (K trained models), val_losses (K,)
# Output: models ordered best first
def order_by_validation_loss(models, val_losses):
# Lower validation loss comes first; this ordering performed best [§3.2]
order = sorted(range(len(models)), key=lambda k: val_losses[k])
return [models[k] for k in order]Hyperparameter search, one dataset and one model §3.1.2 app. B:
# Tuning loop, one model on one dataset [§3.1.2] [app. B]
# Input: train, valid splits; search space
# Output: configuration with the smallest validation loss
def tune(train, valid, space):
# Start from the configuration of the original paper [§3.1.2]
best_config = initial_config_from_original_paper()
best_loss = evaluate(best_config, train, valid)
# Bayesian search for 1,000 steps [§3.1.2]
for step in range(1000):
# Propose a configuration from the search space [app. B]
config = propose(space, history)
# Stop after 100 epochs with no validation improvement [§3.1.2]
loss = evaluate(config, train, valid, patience=100)
if loss < best_loss:
best_loss = loss
best_config = config
return best_configHyperparameters
Fixed settings and split rules. Search spaces for each model follow in the next table.
| Name | Value | Where | Notes |
|---|---|---|---|
| Optimizer (deep models) | Adam, no learning-rate schedule | §3.1.2 | Other models: not stated |
| Tuning method | Hyperopt, Bayesian optimization | §3.1.2 | Exact algorithm (e.g. TPE) not stated |
| Tuning budget | 1,000 steps per dataset | §3.1.2 | Per model and dataset |
| Selection criterion | smallest validation loss | app. B | |
| Starting configuration | from the original paper | §3.1.2 | |
| Tuned hyperparameters | 4 to 10 per model | app. B | Text says "6-9"; see Pitfalls |
| Batch size | tuned; choices {512, 1024, 2048, 4096, 8192} | app. B | Not all models list it |
| Early stopping patience | 100 consecutive epochs | §3.1.2 app. B | Applied to all models |
| Seeds | four per tuned configuration | §3.1.2 | |
| Random-split repetitions | three random partitions | §3.1.2 | Text: random splits use three partitions, otherwise four seeds |
| Input standardization | zero mean, unit variance | §3.1.1 | Statistics from training split |
| Categorical encoding | not stated | §3.1.1 | Datasets are said to contain categorical features |
| Significance test | Friedman, 95% level | §3.1.2 | Pairwise procedure not stated; text quotes p<0.005 §3.2 |
| Split 80/20 (train/val) | Epsilon, YearPrediction, MSLR, Shrutime, Blastchar | app. B | |
| Split 70/10/20 (train/val/test) | Eye, Gesture, Year | app. B | "Year" is ambiguous; see Pitfalls |
| Split Rossmann | 2014 for train and validation (100k held out), 2015 for test | app. B | Preprocessing follows CatBoost paper app. B |
| Split Higgs | 500k of training held out; retrained on full training after tuning | app. B | |
| Split Forest Cover Type | dataset authors' train/validation/test split | app. B | |
| Split Gas | not stated | app. B | Not listed in either split rule |
Search spaces, as written in the appendix. "Log-uniform [a, b]" is a log-scale uniform draw, and "Discrete uniform" draws integers app. B:
| Model | Hyperparameter | Search space app. B |
|---|---|---|
| CatBoost | Learning rate | Log-uniform [e^-5, 1] |
| CatBoost | Random strength | Discrete uniform [1, 20] |
| CatBoost | Max size | Discrete uniform [0, 25] |
| CatBoost | L2 leaf regularization | Log-uniform [1, 10] |
| CatBoost | Bagging temperature | Uniform [0, 1] |
| CatBoost | Leaf estimation iterations | Discrete uniform [1, 20] |
| XGBoost | Number of estimators | Uniform [100, 4000] |
| XGBoost | Eta | Log-uniform [e^-7, 1] |
| XGBoost | Max depth | Discrete uniform [1, 10] |
| XGBoost | Subsample | Uniform [0.2, 1] |
| XGBoost | Colsample bytree | Uniform [0.2, 1] |
| XGBoost | Colsample bylevel | Uniform [0.2, 1] |
| XGBoost | Min child weight | Log-uniform [e^-16, e^5] |
| XGBoost | Alpha | Uniform choice of {0, log-uniform [e^-16, e^2]} |
| XGBoost | Lambda | Uniform choice of {0, log-uniform [e^-16, e^2]} |
| XGBoost | Gamma | Uniform choice of {0, log-uniform [e^-16, e^2]} |
| NODE | Learning rate | Log-uniform [e^-5, 1] |
| NODE | Num layers | Discrete uniform [1, 10] |
| NODE | Total tree count | Choice of {256, 512, 1024, 2048} |
| NODE | Tree depth | Discrete uniform [4, 9] |
| NODE | Tree output dim | Discrete uniform [1, 5] |
| NODE | Learning rate (second entry) | Log-uniform [e^-4, 0.5] |
| NODE | Batch size | Uniform choice of {512, 1024, 2048, 4096, 8192} |
| TabNet | Learning rate | Log-uniform [e^-5, 1] |
| TabNet | Feature dim | Discrete uniform [20, 60] |
| TabNet | Output dim | Discrete uniform [20, 60] |
| TabNet | N steps | Discrete uniform [1, 8] |
| TabNet | BN epsilon | Uniform [e^-5, e^-1] |
| TabNet | Relaxation factor | Uniform [0.3, 2] |
| TabNet | Batch size | Uniform choice of {512, 1024, 2048, 4096, 8192} |
| DNF-Net | Number of formulas | Discrete uniform [256, 2048] |
| DNF-Net | Feature selection beta | Discrete uniform [1e^-2, 2] |
| DNF-Net | Learning rate | Log-uniform [e^-4, 0.5] |
| DNF-Net | Batch size | Uniform choice of {512, 1024, 2048, 4096, 8192} |
| 1D-CNN | Hidden layer sizes | Discrete uniform [100, 4000] |
| 1D-CNN | Number of layers | Discrete uniform [1, 6] |
| 1D-CNN | Learning rate | Log-uniform [e^-4, 0.5] |
| 1D-CNN | Batch size | Uniform choice of {512, 1024, 2048, 4096, 8192} |
Results
Author-reported. Setup: 11 tabular datasets tab. 1, each model tuned with the same protocol, four seeds, test results as mean ± SEM §3.1 §3.2. Hardware and wall-clock times: not stated. Lower is better in tab. 2 and tab. 3.
- Mean relative deterioration (lower is better): the deep-model ensemble with XGBoost scored 2.32%. XGBoost scored 3.34%, the simple classical ensemble 3.15%, and the single deep models 7.56% (1D-CNN) to 14.21% (NODE). The ensemble without XGBoost scored 6.91% tab. 3.
- Unseen datasets: XGBoost outperformed the deep models on 8 of the 11 datasets that the deep models' own papers did not use, with p<0.005 §3.2.
- Ensemble subsets: of the three subset orderings, averaging by validation loss was best, and three models were near-optimal on Shrutime. Random ordering was the worst §3.2 fig. 1.
- Search cost: on Shrutime, XGBoost reached good performance in fewer hyperparameter-search iterations than the deep models. The authors report XGBoost training as more than an order of magnitude faster, without figures §3.2 fig. 2.
- Replication claim: the authors say their results on each model's original datasets matched the original papers §3.2.
Per-dataset results (mean ± SEM, test set). Bold marks the best entry per row, as in the paper. Rossmann and YearPrediction are reported as MSE, the other rows as cross-entropy × 100 tab. 2:
| Dataset | XGBoost | NODE | DNF-Net | TabNet | 1D-CNN | Simple Ensemble | Deep Ensemble w/o XGBoost | Deep Ensemble w XGBoost |
|---|---|---|---|---|---|---|---|---|
| Rossmann | 490.18 ± 1.19 | 488.59 ± 1.24 | 503.83 ± 1.41 | 485.12 ± 1.93 | 493.81 ± 2.23 | 488.57 ± 2.14 | 489.94 ± 2.09 | 485.33 ± 1.29 |
| CoverType | 3.13 ± 0.09 | 4.15 ± 0.13 | 3.96 ± 0.11 | 3.01 ± 0.08 | 3.51 ± 0.13 | 3.19 ± 0.18 | 3.52 ± 0.10 | 2.99 ± 0.08 |
| Higgs | 21.62 ± 0.33 | 21.19 ± 0.69 | 23.68 ± 0.83 | 21.14 ± 0.20 | 22.33 ± 0.73 | 22.46 ± 0.38 | 22.41 ± 0.54 | 22.34 ± 0.81 |
| Gas | 2.18 ± 0.20 | 2.17 ± 0.18 | 1.44 ± 0.09 | 1.92 ± 0.14 | 1.79 ± 0.19 | 2.36 ± 0.13 | 1.98 ± 0.13 | 1.69 ± 0.10 |
| Eye | 56.07 ± 0.65 | 68.35 ± 0.66 | 68.38 ± 0.65 | 67.13 ± 0.69 | 67.9 ± 0.64 | 58.72 ± 0.67 | 69.28 ± 0.62 | 59.43 ± 0.60 |
| Gesture | 80.64 ± 0.80 | 92.12 ± 0.82 | 86.98 ± 0.74 | 96.42 ± 0.87 | 97.89 ± 0.82 | 89.45 ± 0.89 | 93.50 ± 0.75 | 78.93 ± 0.73 |
| YearPrediction | 77.98 ± 0.11 | 76.39 ± 0.13 | 81.21 ± 0.18 | 83.19 ± 0.19 | 78.94 ± 0.14 | 78.01 ± 0.17 | 78.99 ± 0.11 | 76.19 ± 0.21 |
| MSLR | 55.43 ± 0.02 | 55.72 ± 0.03 | 56.83 ± 0.03 | 56.04 ± 0.01 | 55.97 ± 0.04 | 55.46 ± 0.04 | 55.59 ± 0.03 | 55.38 ± 0.01 |
| Epsilon | 11.12 ± 0.03 | 10.39 ± 0.01 | 12.23 ± 0.04 | 11.92 ± 0.03 | 11.08 ± 0.06 | 11.07 ± 0.04 | 10.95 ± 0.01 | 11.18 ± 0.01 |
| Shrutime | 13.82 ± 0.19 | 14.61 ± 0.10 | 16.8 ± 0.09 | 14.94 ± 0.13 | 15.31 ± 0.16 | 13.61 ± 0.14 | 14.69 ± 0.11 | 13.10 ± 0.15 |
| Blastchar | 20.39 ± 0.21 | 21.40 ± 0.25 | 27.91 ± 0.17 | 23.72 ± 0.19 | 24.68 ± 0.22 | 21.18 ± 0.17 | 24.25 ± 0.22 | 20.18 ± 0.16 |
Average relative performance on each model's unseen datasets, geometric mean tab. 3 (lower is better):
| Model | Average relative performance (%) |
|---|---|
| XGBoost | 3.34 |
| NODE | 14.21 |
| DNF-Net | 11.96 |
| TabNet | 10.51 |
| 1D-CNN | 7.56 |
| Simple Ensemble | 3.15 |
| Deep Ensemble w/o XGBoost | 6.91 |
| Deep Ensemble w XGBoost | 2.32 |
Datasets tab. 1:
| Dataset | Features | Classes | Samples | Source | Paper of origin |
|---|---|---|---|---|---|
| Gesture Phase | 32 | 5 | 9.8k | OpenML | DNF-Net |
| Gas Concentrations | 129 | 6 | 13.9k | OpenML | DNF-Net |
| Eye Movements | 26 | 3 | 10.9k | OpenML | DNF-Net |
| Epsilon | 2000 | 2 | 500k | PASCAL Challenge 2008 | NODE |
| YearPrediction | 90 | 1 | 515k | Million Song Dataset | NODE |
| Microsoft (MSLR) | 136 | 5 | 964k | MSLR-WEB10K | NODE |
| Rossmann Store Sales | 10 | 1 | 1018k | Kaggle | TabNet |
| Forest Cover Type | 54 | 7 | 580k | Kaggle | TabNet |
| Higgs Boson | 30 | 2 | 800k | Kaggle | TabNet |
| Shrutime | 11 | 2 | 10k | Kaggle | New dataset |
| Blastchar | 20 | 2 | 7k | Kaggle | New dataset |
Paper vs code
No official code. Searched: the arXiv abstract page (no code link); GitHub repository search for the title and key phrases, for the authors' names, and for the authors' personal account (its repositories were only partly visible, and none named this work); no official repository was found. The only match for the title is a third-party course replication, which is excluded.
The paper states that the deep models follow "the original implementations" §3.1.2. Which implementation and version each model used is not stated.
Pitfalls
- Metric naming conflicts. Section 3.1.2 says regression is reported as RMSE, but the Table 2 caption and the Training paragraph say MSE. The caption also says cross-entropy values are multiplied by 100, so they are not raw cross-entropy §3.1.2 tab. 2.
- Abstract vs body. The abstract says XGBoost outperforms the deep models "across the datasets". Section 3.2 says 8 of 11 unseen datasets, and Table 2 shows TabNet ahead of XGBoost on Rossmann, CoverType and Higgs §3.2 tab. 2.
- Relative-performance figures. The text gives 3.4% (XGBoost), 11.8% (DNF-Net) and 7.5% (1D-CNN). Table 3 gives 3.34, 11.96 and 7.56. The text also calls XGBoost second best, but Table 3 places the Simple Ensemble (3.15%) ahead of it §3.2 tab. 3.
- Averaging set unclear. The caption says "unseen datasets", and the text says "all its unseen datasets (geometric mean)". It is not stated which datasets are averaged for XGBoost and the classical ensemble, which have no paper of origin §3.2 tab. 3.
- Ensemble weights. Eq. 2 uses the validation loss directly as the weight, not a normalized one, even though the text says "normalized". Read literally, models with higher loss get larger weights. The text says low-loss models are favoured when ordering subsets, so the intent is probably the opposite. The implementation is not given; choose and state one §2.2 eq. 2 §3.2.
- Eq. 1 index. The sum runs over k but the summand is written with θ_m. Read it as a sum over the K members §2.2 eq. 1.
- Ensemble members not fully defined. The classical ensemble is XGBoost, SVM and CatBoost §3.2. The membership of "Deep Ensemble w/o XGBoost" is not stated explicitly, and the combination rule (eq. 1 or eq. 2) used for either ensemble in Table 2 is not stated §3.2 tab. 2.
- Uncertainty measure undefined. Subset selection by per-example uncertainty names no measure ("some uncertainty measure") §3.2.
- Hyperparameter counts. The text says 6 to 9 main hyperparameters per model. The appendix lists 6 (CatBoost), 10 (XGBoost), 7 (NODE), 7 (TabNet), 4 (DNF-Net) and 4 (1D-CNN) §3.1.2 app. B.
- Duplicate NODE learning rate. NODE lists two learning-rate ranges, [e^-5, 1] and [e^-4, 0.5]. Which one applies is not stated app. B.
- Library names. Several XGBoost and CatBoost parameters have names such as "Eta", "Max size" and "Random strength". The paper does not map them to library arguments or state the library versions app. B.
- Hyperopt algorithm. The paper says Bayesian optimization with Hyperopt, but not which Hyperopt estimator was used. Results may depend on it, and the authors say so §3.1.2 §3.2.
- Split conflicts. The appendix puts "Year" in both the 80/20 list and the 70/10/20 list. Gas has no split rule. Whether the datasets other than Rossmann and Higgs are retrained on the full training set after tuning is not stated app. B.
- Repetition count. Section 3.1.2 says random splits use three partitions and others four seeds, while the Table 2 caption says four training runs. Whether random-split datasets get 3 × 4 runs or 3 runs is not stated §3.1.2 tab. 2.
- Significance threshold. Section 3.1.2 sets the level at 95% (p < 0.05). The results text quotes p < 0.005 §3.1.2 §3.2. The pairwise procedure after the omnibus Friedman test is not named §3.1.2.
- Categorical features. Section 3.1.1 says some datasets have categorical features. The encoding is not described, and the features and classes columns of tab. 1 do not separate categorical from numerical §3.1.1 tab. 1.
- Cost claims are not measured. The "more than an order of magnitude" runtime gap comes with no numbers. The iteration-count comparison is shown only for Shrutime §3.2 fig. 2.
- Hardware and software not stated. No GPU, CPU, library versions or training times are given, so the runtime comparison cannot be reproduced §3.1.2 §3.2.
- Limited sample. The authors note that eleven datasets cannot represent all tabular data §1. The 1D-CNN model was designed for a Kaggle competition dataset that the authors did not use, so its "unseen" status is by construction §2.1 §3.1.1.
- Author-reported. All numbers come from the authors' own runs, with no independent replication and no code to rerun.
Lineage
- Builds on: XGBoost §2, CatBoost and SVM for the classical ensemble §3.2, Hyperopt for tuning §3.1.2, Friedman's test for significance §3.1.2.
- Compared against, not carded here: TabNet, NODE, DNF-Net and 1D-CNN §2.1. The 1D-CNN is the Kaggle solution by Baosenguo, cited as a GitHub repository §2.1.
- Superseded by: not stated in this wiki.
Source and license
Adapted from “Tabular Data: Deep Learning is Not All You Need” by Ravid Shwartz-Ziv, Amitai Armon (arXiv:2106.03253), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors.