| --- |
| license: apache-2.0 |
| library_name: synthefy-nori |
| pipeline_tag: tabular-regression |
| tags: |
| - tabular |
| - tabular-regression |
| - tabular-foundation-model |
| - in-context-learning |
| - synthetic-data |
| - pytorch |
| --- |
| |
| <p align="center"> |
| <img src="synthefy_nori_banner.png" alt="Nori" width="100%"> |
| </p> |
|
|
| # Nori |
|
|
| **Nori** is a tabular foundation model for **regression** via in-context |
| learning (ICL). Given a few labeled rows as context, it predicts on new query rows in a |
| **single forward pass**, with no task-specific training or fine-tuning. The model is |
| trained **entirely on synthetic data**. |
|
|
| - **Documentation:** https://docs.synthefy.com/nori/ |
| - **Repository:** https://github.com/Synthefy/synthefy-nori |
| - **Library:** `pip install synthefy-nori` |
| - **Checkpoint:** `nori.pt` (this repo) |
| - **Parameters:** ~5.9M |
| - **License:** Apache-2.0 |
|
|
| ## Results |
|
|
| Mean and median R² of the base model across 96 regression tasks from three |
| public benchmark suites (single H200, up to 50K context rows per dataset): |
|
|
| | Suite | Datasets | Mean R² | Median R² | |
| |-------|---------:|--------:|----------:| |
| | TabArena | 13 | 0.8117 | 0.8757 | |
| | TALENT | 72 | 0.7569 | 0.8802 | |
| | OpenML | 11 | 0.6373 | 0.5856 | |
| | **Overall** | **96** | **0.7506** | **0.8702** | |
|
|
| Large-N / long-context tables (common in TabArena) are the current focus of the |
| large-table training stages. These numbers are reproducible end-to-end with one |
| command — see [Reproducing these numbers](https://github.com/Synthefy/synthefy-nori#reproducing-these-numbers). |
|
|
| > **Thinking** is an inference-time reasoning extension that improves these |
| > numbers further. Details are forthcoming. |
|
|
| ## Usage |
|
|
| ```bash |
| pip install synthefy-nori |
| ``` |
|
|
| ```python |
| from sklearn.datasets import load_diabetes |
| from sklearn.model_selection import train_test_split |
| from synthefy_nori import NoriRegressor |
| |
| X, y = load_diabetes(return_X_y=True) |
| X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) |
| |
| model = NoriRegressor() # downloads these weights from the Hub on first use |
| model.fit(X_train, y_train) # "fit" just stores the labeled rows as context |
| pred = model.predict(X_test) # predictions in a single forward pass, no training |
| ``` |
|
|
| It uses a GPU when one is available and falls back to CPU. A one-shot helper skips the |
| object entirely: |
|
|
| ```python |
| from synthefy_nori import predict |
| pred = predict(X_train, y_train, X_test, task="regression") |
| ``` |
|
|
| `predict` follows the `TabPFNRegressor.predict` contract: pass `output_type="mean"` |
| (default), `"median"`, or `"mode"` to choose the point estimate drawn from the model's |
| predictive distribution. |
|
|
| To run from a local checkpoint instead of the Hub default, pass a path: |
|
|
| ```python |
| model = NoriRegressor(model_path="path/to/checkpoint.pt") |
| ``` |
|
|
| This checkpoint is **public**: the first inference call downloads and caches it |
| automatically, with no token and no access request. A Hugging Face token (read scope) |
| is only worth setting if you hit anonymous download rate limits — provide it via |
| `export HF_TOKEN=hf_...`, `hf auth login`, or `NoriRegressor(token="hf_...")`. |
|
|
| ## How it works |
|
|
| ### Architecture |
|
|
| A **FeaturesTransformer (~5.9M parameters)** that alternates two kinds of attention: |
|
|
| - **Feature attention** learns relationships between columns. |
| - **Sample attention** learns relationships between rows (context and query). |
| - **In-context learning**: predictions condition on labeled context rows, with no |
| gradient updates at inference. |
|
|
| Key config: 16 transformer layers, embed_dim 128, hidden 384, 2 heads, the **v2-lite** |
| block (SwiGLU + RMSNorm + pre-norm), features grouped in pairs (`features_per_group=2`), |
| with **column-specific y-aware** feature attention. Features are encoded with RBF |
| embeddings; missing values are handled natively via learned mask embeddings. The |
| regression head predicts a full distribution over 999 quantiles (pinball loss). |
| |
| ### Synthetic data |
| |
| The model never sees real data during training. Its capability comes from a diverse |
| synthetic data generator covering real-world tabular regimes: |
| |
| - **Structural Causal Models (SCM)**: hierarchical DAGs with 8 edge-function types |
| (MLP, decision tree, piecewise-linear, polynomial, periodic, RBF, log/exp, conv1d). |
| - **Regression priors**: 9 target families (dense/sparse linear, GAM, interactions, |
| random MLP, random tree, radial/RBF, Fourier features, chained trigonometric). |
| - **Realism augmentations**: discretized features, noise features, correlated blocks, |
| structural missingness, label noise. |
| - **Learnability filter**: an ExtraTrees signal-quality filter rejects unlearnable |
| datasets so training compute is spent on learnable tasks. |
| |
| Training runs entirely on synthetic data and **trains to completion** — there is no |
| real-data validation in the loop, so no benchmark data is needed to train and no eval |
| signal influences checkpoint selection. See the |
| [training guide](https://github.com/Synthefy/synthefy-nori/blob/main/docs/training.md) |
| for the full curriculum recipe. |
| |
| ## Intended use & limitations |
| |
| - **Intended for** small-to-medium tabular regression where in-context learning is |
| attractive (no per-task training). |
| - **Limitations:** the current gap vs the best baselines is on **large-N / long-context** |
| TabArena datasets; dense O(N²) sample attention bounds practical context size. Very large |
| tables are the focus of the large-table training stages. |
| |
| ## Citation |
| |
| ```bibtex |
| @software{synthefy_nori_2026, |
| title = {Nori: A Tabular Foundation Model Trained on Synthetic Data}, |
| author = {Synthefy}, |
| year = {2026}, |
| url = {https://github.com/Synthefy/synthefy-nori} |
| } |
| ``` |
| |
| ## License |
| |
| Apache-2.0. See |
| [LICENSE](https://github.com/Synthefy/synthefy-nori/blob/main/LICENSE) and |
| [NOTICE](https://github.com/Synthefy/synthefy-nori/blob/main/NOTICE). |
| |