TabPFN:表格数据基础模型

TabPFN的意思是表格先验数据拟合网络,这是一个基于将模型拟合到 表格数据集的先验而不是单个数据集的思想的基础模型,因此得名。

TabPFN:表格数据基础模型

我首次接触 TabPFN 是通过 ICLR 2023 论文——TabPFN:一秒钟解决小型表格分类问题的 Transformer。该论文介绍了 TabPFN,这是一个专为表格数据集构建的 开源 transformer 模型,这是尚未真正受益于深度学习的领域,其中梯度提升决策树模型仍然占主导地位。

当时,TabPFN 仅支持最多 1,000 个训练样本和 100 个纯数值特征,因此它在实际环境中的应用相当有限。然而,随着时间的推移,有一些增量改进,包括 TabPFN-2,它于 2025 年通过论文引入——使用表格基础模型(TabPFN-2)在小数据上准确预测

无

最近,TabPFN-2.5 发布,该版本可以处理接近 100,000 个数据点和大约 2,000 个特征,这使其相当适用于实际预测任务。我花了很多专业时间处理表格数据集,因此这自然引起了我的兴趣,促使我深入了解更多。在本文中,我提供了 TabPFN 的高级概述,并使用 Kaggle 竞赛进行了快速实施,以帮助您入门。

1、什么是 TabPFN?

TabPFN 代表 Tabular Prior-data Fitted Network(表格先验数据拟合网络),这是一个基于将模型拟合到 表格数据集的先验而不是单个数据集的思想的基础模型,因此得名。

在阅读技术报告时,我发现这些模型有很多有趣的部分。例如,TabPFN 可以以非常低的延迟提供强大的表格预测,通常可与调优的集成方法相媲美,而无需重复的训练循环。

从工作流程的角度来看,也没有学习曲线,因为它通过 scikit-learn 风格的接口自然地融入现有设置。它可以处理缺失值、异常值和混合特征类型,只需最少的预处理,我们将在本文后面的实施中介绍这一点。

2、表格数据基础模型的需求

在深入了解 TabPFN 如何工作之前,让我们首先尝试理解它试图解决的更广泛的问题。

对于表格数据上的传统机器学习,您通常为每个新数据集训练一个新模型。这通常涉及较长的训练周期,并且意味着先前训练的模型不能真正重复使用。

然而,如果我们查看文本和图像的基础模型,它们的想法根本不同。不是从头开始重新训练,而是在许多数据集上进行大量的预训练,然后在大多数情况下,结果模型可以应用于新数据集而无需重新训练。

在我看来,这是模型试图填补表格数据差距的地方,即减少为每个数据集从头开始训练新模型的需求,这看起来是一个有前途的研究领域。

3、TabPFN 训练和推理流程概述

无

TabPFN 利用 上下文学习将神经网络拟合到表格数据集的先验。这意味着,模型不是一次学习一个任务,而是学习表格问题通常如何呈现的一般外观,然后通过单个前向传递使用该知识对新数据集进行预测。以下是 TabPFN 的 Nature 论文的摘录:

TabPFN 利用上下文学习(ICL),这是导致大型语言模型惊人表现的相同机制,生成一个强大的完全学习的表格预测算法。虽然 ICL 最早是在大型语言模型中观察到的,但最近的工作表明,transformer 可以通过 ICL 学习简单算法,如逻辑回归。

流程可以分为三个主要步骤:

3.1 生成合成数据集

TabPFN 将整个数据集视为馈送到网络的单个数据点(或标记)。这意味着它在训练期间需要暴露于非常大量的数据集。因此,训练 TabPFN 从 合成表格数据集开始。为什么是合成数据?与文本或图像不同,没有许多大型且多样化的真实世界表格数据集可用,这使得合成数据成为设置的关键部分。为了说明这一点,TabPFN 2 在 1.3 亿个数据集上进行了训练。

生成合成数据集的过程本身就很有趣。TabPFN 使用高度参数化的 结构因果模型创建具有多样化结构、特征关系、噪声水平和目标函数的表格数据集。通过从该模型采样,可以生成大型且多样化的数据集,每个数据集作为网络的训练信号。这鼓励模型学习许多类型的表格问题的一般模式,而不是过度拟合到任何单个数据集。

3.2 训练

下图取自 Nature 论文,清楚地说明了训练和推理过程。

无

在训练期间,采样一个合成表格数据集并分为 X trainY trainX testY testY test 值被保留,其余部分传递给神经网络,该神经网络输出每个 Y test 数据点的概率分布,如左图所示。

然后根据这些预测分布评估保留的 Y test 值。然后计算 交叉熵损失并更新网络以最小化该损失。这完成了单个数据集的一个反向传播步骤,然后对数百万合成数据集重复此过程。

3.3 推理

在测试时,将训练好的 TabPFN 模型应用于真实数据集。这对应于右图,其中模型用于推理。如您所见,接口与训练期间保持相同。您提供 X trainY trainX test,模型通过单个前向传递输出 Y test 的预测。

最重要的是,测试时不需要重新训练,TabPFN 执行实际上是 零样本推理,在不更新权重的情况下立即产生预测。

3.4 架构

无

TabPFN 架构 | 来源:使用表格基础模型在小数据上准确预测(开放获取文章)

让我们也触及 论文 中提到的模型核心架构。在高级别上,TabPFN 调整 transformer 架构以更好地适应表格数据。不是将表格展平为长序列,模型将表中的每个值视为自己的单位。它使用两阶段注意力机制,首先学习特征在单行内如何相互关联,然后学习相同特征在不同行中的行为。

这种结构化注意力的方式至关重要,因为它匹配表格数据的实际组织方式。这也意味着模型不关心行或列的顺序,这意味着它可以处理比训练的表更大的表。

4、实施

现在让我们演练 TabPFN-2.5 的实施,并将其与原始 XGBoost 分类器进行比较,以提供熟悉的参考点。虽然模型权重可以从 Hugging Face 下载,但使用 Kaggle Notebooks 更直接,因为 模型 在那里 readily 可用,并且 GPU 支持开箱即用于更快的推理。无论哪种情况,在使用之前都需要接受模型条款。将 TabPFN 模型 添加到 Kaggle notebook 环境后,运行以下单元格以导入它。

# 导入模型
import os
os.environ["TABPFN_MODEL_CACHE_DIR"] = "/kaggle/input/tabpfn-2-5/pytorch/default/2"
您可以在随附的 Kaggle notebook 这里 找到完整的代码。

4.1 安装

您可以通过两种方式访问 TabPFN,既可以作为 Python 包在本地运行,也可以作为 API 客户端在云中运行模型:

# Python 包
pip install tabpfn

# 作为 API 客户端
pip install tabpfn-client

4.2 数据集:Kaggle Playground 竞赛数据集

为了更好地了解 TabPFN 在实际环境中的表现,我在几个月前结束的 Kaggle Playground 竞赛中对其进行了测试。任务 使用降雨数据集进行二元预测 需要为测试集中的每个 id 预测降雨概率。评估使用 ROC-AUC 进行,这使得这很适合像 TabPFN 这样的基于概率的模型。训练数据如下所示:

无

训练数据的前几行

4.3 训练 TabPFN 分类器

训练 TabPFN 分类器很简单,遵循熟悉的 scikit-learn 风格接口。虽然传统意义上没有特定任务训练,但启用 GPU 支持仍然很重要,否则推理可能会明显变慢。以下代码片段演练了准备数据、训练 TabPFN 分类器并使用 ROC-AUC 分数评估其性能。

# 导入必要的库
import pandas as pd, numpy as np
from tabpfn import TabPFNClassifier
from sklearn.model_selection import train_test_split

FEATURES = [c for c in train.columns if c not in ["rainfall",'id']]

X = train[FEATURES].copy()
y = train["rainfall"].copy()

# 将给定的训练数据分为训练和验证集

train_index, valid_index = train_test_split(
    train.index,
    test_size=0.2,
    random_state=42
)

x_train = X.loc[train_index].copy()
y_train = y.loc[train_index].copy()

x_valid = X.loc[valid_index].copy()
y_valid = y.loc[valid_index].copy()

#训练 TabPFNClassifier

model_pfn = TabPFNClassifier(device=["cuda:0", "cuda:1"])
model_pfn.fit(x_train, y_train)

# 预测概率
probs_pfn = model_pfn.predict_proba(x_valid)

# 正类概率(class = 1)
pos_probs = probs_pfn[:, 1]

# 指标
print(f"ROC AUC: {roc_auc_score(y_valid, pos_probs):.4f}")

-------------------------------------------------
ROC AUC: 0.8722

接下来让我们训练一个基本的 XGBoost 分类器

4.4 训练 XGBoost 分类器

model_xgb = XGBClassifier(
    objective="binary:logistic",
    tree_method="hist",
    device="cuda",
    enable_categorical=True,
    random_state=42,
    n_jobs=1
)

model_xgb.fit(x_train, y_train)

# 预测概率
probs_xgb = model_xgb.predict_proba(x_valid)

# 正类概率(class = 1)
pos_probs_xgb = probs_xgb[:, 1]

# 指标
print(f"ROC AUC: {roc_auc_score(y_valid, pos_probs_xgb):.4f}")
------------------------------------------------------------
ROC AUC: 0.8515

如您所见,TabPFN 开箱即用地表现相当好。虽然 XGBoost 当然可以进一步调优,但我的意图是比较 基本的原始实现,而不是优化模型。它让我在公共排行榜上排名第 22 位。以下是前 3 名分数以供参考。

无

5、模型可解释性呢?

Transformer 模型本质上不可解释,因此为了理解预测,通常使用事后可解释性技术(如 SHAP(SHapley 加性解释))来分析单个预测和特征贡献。TabPFN 提供了一个专用的 可解释性扩展,它与 SHAP 集成,使得更容易检查和推理模型的预测。要访问该功能,您需要先安装扩展:

# 安装可解释性扩展:
pip install "tabpfn-extensions[interpretability]"

from tabpfn_extensions import interpretability

# 计算 SHAP 值
shap_values = interpretability.shap.get_shap_values(
    estimator=model_pfn,
    test_x=x_test[:50],
    attribute_names=FEATURES,
    algorithm="permutation",
)

# 创建可视化
fig = interpretability.shap.plot_shap(shap_values)
无

左:单个预测中每个特征的 SHAP 值 | 右:数据集中平均 SHAP 特征重要性。为了效率,在验证样本的子集上计算了 SHAP 值。

左图显示了整个数据集中的 平均 SHAP 特征重要性,提供了全局视图,了解哪些特征对模型最重要。右图是 SHAP 摘要(蜂群)图,通过显示每个特征在单个预测中的 SHAP 值,提供更细粒度的视图。

从上图可以看出,云层阳光湿度露点对模型预测的整体影响最大,而风向、压力和温度相关变量等特征的作用相对较小。

重要的是要注意,SHAP 解释了模型学习的关系,而不是物理因果关系。

6、结束语

TabPFN 比我在本文中涵盖的内容要多得多。我个人喜欢的是基本思想以及入门的容易程度。有很多方面我没有在这里涉及,例如 TabPFN 在时间序列预测、异常检测、生成合成表格数据和嵌入提取中的使用。

我特别感兴趣探索的另一个领域是微调,其中这些模型可以适应来自特定领域的数据。也就是说,本文是基于我的第一次实际体验的一个轻松介绍。我计划在未来的文章中更深入地探索这些额外的功能。目前,官方 文档 是深入了解的好地方。


原文链接: Exploring TabPFN: A Foundation Model Built for Tabular Data

汇智网翻译整理,转载请标明出处