A comprehensive toolkit and benchmark for tabular data learning, featuring 35+ deep methods, more than 10 classical methods, and 300 diverse tabular datasets.
Python
862
390 commits
updated Sep 4, 2026
Welcome to TALENT, a benchmark with a comprehensive machine learning toolbox designed to enhance model performance on tabular data. TALENT integrates advanced deep learning models, classical algorithms, and efficient hyperparameter tuning, offering robust preprocessing capabilities to optimize learning from tabular datasets. The toolbox is user-friendly and adaptable, catering to both novice and expert data scientists.
TALENT offers the following advantages:
If you use any content of this repo for your work, please cite the following bib entries:
@article{ye2024closerlookdeeplearning,
title={A Closer Look at Deep Learning on Tabular Data},
author={Han-Jia Ye and
Si-Yang Liu and
Hao-Run Cai and
Qi-Le Zhou and
De-Chuan Zhan},
journal={arXiv preprint arXiv:2407.00956},
year={2024}
}
@article{JMLR:v26:25-0512,
author = {Si-Yang Liu and
Hao-Run Cai and
Qi-Le Zhou and
Huai-Hong Yin and
Tao Zhou and
Jun-Peng Jiang and
Han-Jia Ye},
title = {Talent: A Tabular Analytics and Learning Toolbox},
journal = {Journal of Machine Learning Research},
year = {2025},
volume = {26},
number = {226},
pages = {1--16},
url = {http://jmlr.org/papers/v26/25-0512.html}
}
pip install -U "tabfm[pytorch]".RunResult exposes a uniform predict_proba/predict_labels interface regardless of whether the underlying method natively returns logits or probabilities. Bundled checkpoints are now resolved via importlib.resources so methods work from any working directory.TALENT integrates an extensive array of 30+ deep learning architectures for tabular data, including but not limited to:
pip install -U 'tabpfn>=8.0.0'.TabICLRegressor), with native quantile regression. Requires pip install -U 'tabicl>=2.0.0'.pip install -U 'tabpfn>=8.0.0'.pip install -U tabdpt.pip install -U "tabfm[pytorch]"; the upstream model weights use the TabFM Non-Commercial License.🔧 If you want to check the default hyperparameters and hyperparameter search spaces of all methods, please visit:
👉 https://6sy666.github.io/TALENT-Configs/
Install with the newest version through GitHub:
$ pip install git+https://github.com/LAMDA-Tabular/TALENT.git@main --upgrade
Try a demo train_model_deep.py :
from tqdm import tqdm
from TALENT.model.utils import get_deep_args, show_results, tune_hyper_parameters, get_method, set_seeds
from TALENT.model.lib.data import get_dataset
from TALENT.model.lib.evaluation import evaluate
from TALENT.model.method_registry import get_method_spec
if __name__ == '__main__':
loss_list, results_list, time_list = [], [], []
args, default_para, opt_space = get_deep_args()
train_val_data, test_data, info = get_dataset(args.dataset, args.dataset_path)
if args.tune:
args = tune_hyper_parameters(args, opt_space, train_val_data, info)
spec = get_method_spec(args.model_type)
for seed in tqdm(range(args.seed_num)):
args.seed = seed # update seed
set_seeds(args.seed)
method = get_method(args.model_type)(args, info['task_type'] == 'regression')
method.fit(train_val_data, info)
# evaluate() standardizes predict_proba and (for binary tasks) tunes
# the decision threshold on the validation split.
eval_result = evaluate(
method, train_val_data, test_data, info,
model_name=args.evaluate_option,
output_type=spec.output_type,
tune_threshold=True,
)
loss_list.append(eval_result["loss"])
results_list.append(eval_result["metrics"])
metric_name = eval_result["metric_names"]
time_list.append((method.fit_time, method.predict_time))
show_results(args, info, metric_name, loss_list, results_list, time_list)
python train_model_deep.py --model_type MODEL_NAME
For TRC, use integer-encoded categorical features as required by its FT-Transformer backbone:
python train_model_deep.py --model_type trc --cat_policy indices
TRC first trains the backbone for at most --max_epoch epochs, freezes it,
and then trains the representation corrector for at most the same number of
epochs. Ablations and paper hyperparameters are available in
TALENT/configs/default/trc.json; set shift_estimator, space_mapping, or
loss_orth to false to disable the corresponding component.
TALENT also exposes a library-style API alongside the CLI scripts, so you can call methods directly from Python or a Jupyter notebook without manipulating sys.argv:
import TALENT
from TALENT.model.lib.data import get_dataset
train_val, test, info = get_dataset("your_dataset", "./data")
# Single-seed run
result = TALENT.run("tabpfn_v3", train_val, test, info)
print(dict(zip(result.metric_names, result.metrics)))
print("Fit time:", result.fit_time, "Predict time:", result.predict_time)
# Multi-seed run with hyperparameter tuning
result = TALENT.run("catboost", train_val, test, info, tune=True, n_trials=50, seed_num=3)
print("Mean metrics:", dict(zip(result.metric_names, result.metrics_mean)))
print("Std metrics:", dict(zip(result.metric_names, result.metrics_std)))
By default the hyperparameter search optimizes TALENT's historical objective
(validation Accuracy for classification, MAE / RMSE for regression).
Pass tune_metric to optimize any metric that Method.metric reports instead;
the optimization direction is inferred automatically.
# Tune on ROC-AUC (classification) or R2 (regression) rather than the default
result = TALENT.run("catboost", train_val, test, info,
tune=True, n_trials=50, tune_metric="AUC")
from TALENT.model.lib.tuning_metric import supported_tune_metrics
print(supported_tune_metrics())
# ('Accuracy', 'Avg_Recall', 'Avg_Precision', 'F1', 'AUC',
# 'LogLoss', 'Brier', 'ECE', 'R2', 'MAE', 'RMSE')
tune_metric is also exposed on the CLI (--tune_metric AUC). It defaults to
None, which preserves the previous behavior exactly. A few methods optimize an
internal training loss and do not accept it (tabnet, ptarl, tabcaps); use
the default for those.
Introspect or filter methods via the unified registry:
# What does this method need?
spec = TALENT.get_method_spec("tabicl_v2")
print(spec.cat_policy, spec.normalization, spec.supports_regression, spec.supports_hpo)
# List all GPU-only deep methods that support regression
for s in TALENT.list_methods(
architecture=TALENT.Architecture.DEEP,
hardware=TALENT.Hardware.GPU,
supports_regression=True,
):
print(s.name)
Both the CLI scripts and the Python API are backed by the same MethodSpec registry, so adding a new method requires only a single registry entry (see TALENT/model/method_registry.py).
The registry is also the single source of truth for foundation-model training-row caps (train_row_limit): TabPFN 1k, TabPFN v2 / Real-TabPFN / Mitra 10k, TabPFN v2.5 50k, TabICL 500k, TabPFN v3 / TabICL v2 1M, TabDPT / TabFM no registry cap. The cap is applied automatically when fitting; setting config['general']['sample_size'] overrides it for a single run.
For researchers:
Clone this GitHub repository:
git clone https://github.com/LAMDA-Tabular/TALENT
cd TALENT/test
Edit the configs/default/[MODEL_NAME].json and config/opt_space/[MODEL_NAME].json for global settings and hyperparameters.
Run:
python train_model_deep.py --model_type MODEL_NAME
for deep methods, or:
python train_model_classical.py --model_type MODEL_NAME
for classical methods.
For methods like the MLP class that only need to design the model, you only need to:
model/models.model/methods/base.py and override the construct_model() method in the new class.model/method_registry.py by appending a MethodSpec(...) entry. The CLI argparse choices and get_method() are both derived from this registry, so no other dispatcher edits are needed.configs/default/[MODEL_NAME].json and configs/opt_space/[MODEL_NAME].json.For other methods that require changing the training process, partially override functions based on model/methods/base.py. For details, refer to the implementation of other methods in model/methods/.
See our Contribution Guide for more details.
pip install -r requirements.txt
If you want to use TabR, you have to manually install faiss, which is only available on conda:
conda install faiss-gpu -c pytorch
Datasets are available at Google Drive.
Datasets are placed in the project's current directory, corresponding to the file name specified by args.dataset_path. For instance, if the project is LAMDA-TALENT, the data should be placed in LAMDA-TALENT/args.dataset_path/args.dataset.
Each dataset folder args.dataset consists of:
Numeric features: N_train/val/test.npy (can be omitted if there are no numeric features)
Categorical features: C_train/val/test.npy (can be omitted if there are no categorical features)
Labels: y_train/val/test.npy
info.json, which must include the following three contents (task_type can be "regression", "multiclass" or "binclass"):
{
"task_type": "regression",
"n_num_features": 10,
"n_cat_features": 10
}
We provide comprehensive evaluations of classical and deep tabular methods based on our toolbox in a fair manner in the Figure. Three tabular prediction tasks, namely, binary classification, multi-class classification, and regression, are considered, and each subfigure represents a different task type.
We use Accuracy and RMSE as the metrics for classification tasks and regression tasks, respectively. To calibrate the metrics, we choose the average performance rank to compare all methods, where a lower rank indicates better performance, following Sheskin (2003). Efficiency is calculated by the average training time in seconds, with lower values denoting better time efficiency. The model size is visually indicated by the radius of the circles, offering a quick glance at the trade-off between model complexity and performance.
We thank the following repos for providing helpful components/functions in our work:
If there are any questions, please feel free to propose new features by opening an issue or contact the author: Si-Yang Liu (liusy@lamda.nju.edu.cn) and Hao-Run Cai (caihr@lamda.nju.edu.cn) and Qile Zhou (zhouql@lamda.nju.edu.cn) and Jun-Peng Jiang (jiangjp@lamda.nju.edu.cn) and Huai-Hong Yin (yinhh@lamda.nju.edu.cn) and Tao Zhou ([zhout@lamda.nju.edu.cn]) and Han-Jia Ye (yehj@lamda.nju.edu.cn). Enjoy the code.
Thanks LAMDA-PILOT and LAMDA-ZhiJian for the template.
Python
90.1%
HTML
9.0%
A comprehensive toolkit and benchmark for tabular data learning, featuring 35+ deep methods, more than 10 classical methods, and 300 diverse tabular datasets.
Python
862
390 commits
updated Sep 4, 2026
Welcome to TALENT, a benchmark with a comprehensive machine learning toolbox designed to enhance model performance on tabular data. TALENT integrates advanced deep learning models, classical algorithms, and efficient hyperparameter tuning, offering robust preprocessing capabilities to optimize learning from tabular datasets. The toolbox is user-friendly and adaptable, catering to both novice and expert data scientists.
TALENT offers the following advantages:
If you use any content of this repo for your work, please cite the following bib entries:
@article{ye2024closerlookdeeplearning,
title={A Closer Look at Deep Learning on Tabular Data},
author={Han-Jia Ye and
Si-Yang Liu and
Hao-Run Cai and
Qi-Le Zhou and
De-Chuan Zhan},
journal={arXiv preprint arXiv:2407.00956},
year={2024}
}
@article{JMLR:v26:25-0512,
author = {Si-Yang Liu and
Hao-Run Cai and
Qi-Le Zhou and
Huai-Hong Yin and
Tao Zhou and
Jun-Peng Jiang and
Han-Jia Ye},
title = {Talent: A Tabular Analytics and Learning Toolbox},
journal = {Journal of Machine Learning Research},
year = {2025},
volume = {26},
number = {226},
pages = {1--16},
url = {http://jmlr.org/papers/v26/25-0512.html}
}
pip install -U "tabfm[pytorch]".RunResult exposes a uniform predict_proba/predict_labels interface regardless of whether the underlying method natively returns logits or probabilities. Bundled checkpoints are now resolved via importlib.resources so methods work from any working directory.TALENT integrates an extensive array of 30+ deep learning architectures for tabular data, including but not limited to:
pip install -U 'tabpfn>=8.0.0'.TabICLRegressor), with native quantile regression. Requires pip install -U 'tabicl>=2.0.0'.pip install -U 'tabpfn>=8.0.0'.pip install -U tabdpt.pip install -U "tabfm[pytorch]"; the upstream model weights use the TabFM Non-Commercial License.🔧 If you want to check the default hyperparameters and hyperparameter search spaces of all methods, please visit:
👉 https://6sy666.github.io/TALENT-Configs/
Install with the newest version through GitHub:
$ pip install git+https://github.com/LAMDA-Tabular/TALENT.git@main --upgrade
Try a demo train_model_deep.py :
from tqdm import tqdm
from TALENT.model.utils import get_deep_args, show_results, tune_hyper_parameters, get_method, set_seeds
from TALENT.model.lib.data import get_dataset
from TALENT.model.lib.evaluation import evaluate
from TALENT.model.method_registry import get_method_spec
if __name__ == '__main__':
loss_list, results_list, time_list = [], [], []
args, default_para, opt_space = get_deep_args()
train_val_data, test_data, info = get_dataset(args.dataset, args.dataset_path)
if args.tune:
args = tune_hyper_parameters(args, opt_space, train_val_data, info)
spec = get_method_spec(args.model_type)
for seed in tqdm(range(args.seed_num)):
args.seed = seed # update seed
set_seeds(args.seed)
method = get_method(args.model_type)(args, info['task_type'] == 'regression')
method.fit(train_val_data, info)
# evaluate() standardizes predict_proba and (for binary tasks) tunes
# the decision threshold on the validation split.
eval_result = evaluate(
method, train_val_data, test_data, info,
model_name=args.evaluate_option,
output_type=spec.output_type,
tune_threshold=True,
)
loss_list.append(eval_result["loss"])
results_list.append(eval_result["metrics"])
metric_name = eval_result["metric_names"]
time_list.append((method.fit_time, method.predict_time))
show_results(args, info, metric_name, loss_list, results_list, time_list)
python train_model_deep.py --model_type MODEL_NAME
For TRC, use integer-encoded categorical features as required by its FT-Transformer backbone:
python train_model_deep.py --model_type trc --cat_policy indices
TRC first trains the backbone for at most --max_epoch epochs, freezes it,
and then trains the representation corrector for at most the same number of
epochs. Ablations and paper hyperparameters are available in
TALENT/configs/default/trc.json; set shift_estimator, space_mapping, or
loss_orth to false to disable the corresponding component.
TALENT also exposes a library-style API alongside the CLI scripts, so you can call methods directly from Python or a Jupyter notebook without manipulating sys.argv:
import TALENT
from TALENT.model.lib.data import get_dataset
train_val, test, info = get_dataset("your_dataset", "./data")
# Single-seed run
result = TALENT.run("tabpfn_v3", train_val, test, info)
print(dict(zip(result.metric_names, result.metrics)))
print("Fit time:", result.fit_time, "Predict time:", result.predict_time)
# Multi-seed run with hyperparameter tuning
result = TALENT.run("catboost", train_val, test, info, tune=True, n_trials=50, seed_num=3)
print("Mean metrics:", dict(zip(result.metric_names, result.metrics_mean)))
print("Std metrics:", dict(zip(result.metric_names, result.metrics_std)))
By default the hyperparameter search optimizes TALENT's historical objective
(validation Accuracy for classification, MAE / RMSE for regression).
Pass tune_metric to optimize any metric that Method.metric reports instead;
the optimization direction is inferred automatically.
# Tune on ROC-AUC (classification) or R2 (regression) rather than the default
result = TALENT.run("catboost", train_val, test, info,
tune=True, n_trials=50, tune_metric="AUC")
from TALENT.model.lib.tuning_metric import supported_tune_metrics
print(supported_tune_metrics())
# ('Accuracy', 'Avg_Recall', 'Avg_Precision', 'F1', 'AUC',
# 'LogLoss', 'Brier', 'ECE', 'R2', 'MAE', 'RMSE')
tune_metric is also exposed on the CLI (--tune_metric AUC). It defaults to
None, which preserves the previous behavior exactly. A few methods optimize an
internal training loss and do not accept it (tabnet, ptarl, tabcaps); use
the default for those.
Introspect or filter methods via the unified registry:
# What does this method need?
spec = TALENT.get_method_spec("tabicl_v2")
print(spec.cat_policy, spec.normalization, spec.supports_regression, spec.supports_hpo)
# List all GPU-only deep methods that support regression
for s in TALENT.list_methods(
architecture=TALENT.Architecture.DEEP,
hardware=TALENT.Hardware.GPU,
supports_regression=True,
):
print(s.name)
Both the CLI scripts and the Python API are backed by the same MethodSpec registry, so adding a new method requires only a single registry entry (see TALENT/model/method_registry.py).
The registry is also the single source of truth for foundation-model training-row caps (train_row_limit): TabPFN 1k, TabPFN v2 / Real-TabPFN / Mitra 10k, TabPFN v2.5 50k, TabICL 500k, TabPFN v3 / TabICL v2 1M, TabDPT / TabFM no registry cap. The cap is applied automatically when fitting; setting config['general']['sample_size'] overrides it for a single run.
For researchers:
Clone this GitHub repository:
git clone https://github.com/LAMDA-Tabular/TALENT
cd TALENT/test
Edit the configs/default/[MODEL_NAME].json and config/opt_space/[MODEL_NAME].json for global settings and hyperparameters.
Run:
python train_model_deep.py --model_type MODEL_NAME
for deep methods, or:
python train_model_classical.py --model_type MODEL_NAME
for classical methods.
For methods like the MLP class that only need to design the model, you only need to:
model/models.model/methods/base.py and override the construct_model() method in the new class.model/method_registry.py by appending a MethodSpec(...) entry. The CLI argparse choices and get_method() are both derived from this registry, so no other dispatcher edits are needed.configs/default/[MODEL_NAME].json and configs/opt_space/[MODEL_NAME].json.For other methods that require changing the training process, partially override functions based on model/methods/base.py. For details, refer to the implementation of other methods in model/methods/.
See our Contribution Guide for more details.
pip install -r requirements.txt
If you want to use TabR, you have to manually install faiss, which is only available on conda:
conda install faiss-gpu -c pytorch
Datasets are available at Google Drive.
Datasets are placed in the project's current directory, corresponding to the file name specified by args.dataset_path. For instance, if the project is LAMDA-TALENT, the data should be placed in LAMDA-TALENT/args.dataset_path/args.dataset.
Each dataset folder args.dataset consists of:
Numeric features: N_train/val/test.npy (can be omitted if there are no numeric features)
Categorical features: C_train/val/test.npy (can be omitted if there are no categorical features)
Labels: y_train/val/test.npy
info.json, which must include the following three contents (task_type can be "regression", "multiclass" or "binclass"):
{
"task_type": "regression",
"n_num_features": 10,
"n_cat_features": 10
}
We provide comprehensive evaluations of classical and deep tabular methods based on our toolbox in a fair manner in the Figure. Three tabular prediction tasks, namely, binary classification, multi-class classification, and regression, are considered, and each subfigure represents a different task type.
We use Accuracy and RMSE as the metrics for classification tasks and regression tasks, respectively. To calibrate the metrics, we choose the average performance rank to compare all methods, where a lower rank indicates better performance, following Sheskin (2003). Efficiency is calculated by the average training time in seconds, with lower values denoting better time efficiency. The model size is visually indicated by the radius of the circles, offering a quick glance at the trade-off between model complexity and performance.
We thank the following repos for providing helpful components/functions in our work:
If there are any questions, please feel free to propose new features by opening an issue or contact the author: Si-Yang Liu (liusy@lamda.nju.edu.cn) and Hao-Run Cai (caihr@lamda.nju.edu.cn) and Qile Zhou (zhouql@lamda.nju.edu.cn) and Jun-Peng Jiang (jiangjp@lamda.nju.edu.cn) and Huai-Hong Yin (yinhh@lamda.nju.edu.cn) and Tao Zhou ([zhout@lamda.nju.edu.cn]) and Han-Jia Ye (yehj@lamda.nju.edu.cn). Enjoy the code.
Thanks LAMDA-PILOT and LAMDA-ZhiJian for the template.
Python
90.1%
HTML
9.0%