はじめに
これまでテーブルデータを扱う際は、主に LightGBM や CatBoost などの GBDT 系モデルを使用してきました。
しかし、「そういえばテーブルデータのモデルとして GBDT 以外をほとんど知らないな」と気になりました。
普段から画像や自然言語の分野ではさまざまなアーキテクチャが登場している一方で、テーブルデータについては深く調べる機会があまりありませんでした。
そこで、GBDT 以外にどのような選択肢があるのか調べてみたところ、TabPFN というモデルを見つけました。
TabPFN はテーブルデータ向けの事前学習済み基盤モデルで、Transformer 系のアーキテクチャを採用しています。
特に興味を引かれたのが、fit でモデルのパラメータを更新せずに推論できるという点でした。
この記事では、TabPFN の仕組みをざっくり押さえつつ、実際に動かして性能や使い勝手を検証してみます。
TabPFN とは
TabPFN(Tabular Prior-data Fitted Network) は、ドイツの Prior Labs が開発している、テーブルデータ向けの事前学習済み Transformer モデルです。
手法は Nature に掲載されており、本記事では現行デフォルトの TabPFN-3 を使用します。
仕組みの要点はこうです。
- 合成データで事前学習済みで、推論時に重みは固定。
-
fit()ではパラメータ(重み)を更新せず、学習データを保持するだけ。 -
predict()で「学習データ+予測対象」をまとめて Transformer に入れ、1回の forward pass で予測します。これは大規模言語モデルの few-shot(文脈内学習, In-Context Learning)と同じ発想です。 - ハイパラ探索が基本的に不要で、推論はデータ量しだいで数秒〜数十秒で終わります。
「重みを更新しない=学習データが要らない」ではありません。重み(パラメータ)は更新しませんが、学習データは predict 時に文脈として丸ごと使います(つまり学習データは必須)。
TabPFN は合成データによる大規模な事前学習を通じて、「ラベル付きの表から新しい行を予測する」というタスクそのものを学習しています。
LLM が few-shot の例から、重みを変えずに答えを返すのと同じ要領です。
得意なのは小〜中規模のテーブルデータです(扱えるサイズ感は後述します)。
使う前に: ライセンスと認証
TabPFN-3 をローカルで動かすには、初回にモデル重みのダウンロードが必要で、その際に一度きりのライセンス同意(無料)を求められます。
「入れればすぐ使える」と思っていると最初の fit() で止まるので、先に済ませておきます。
-
ux.priorlabs.ai で登録(またはログイン)する
-
Licenses タブで TabPFN-3 のライセンスに同意
- API Key を発行してコピーする
- その鍵を環境変数
TABPFN_TOKENに設定する(.envに置くなど)
このゲートがかかるのは v3 / v2.5 / v2.6 で、v2は同意もトークンも不要(公開 URL からそのまま落ちてくる)でした。
重みのダウンロードは初回だけで、一度キャッシュされれば以降の推論にトークンは要りません。
なお、これは非商用ライセンスです(研究・社内評価は可)。
製品への組み込みや本番運用などの商用利用には、クラウド API か商用ライセンスが必要みたいです。
試してみる
環境とインストール
実行環境は devcontainer(CUDA 12.6 + Python 3.12、uv 管理)で実行しました。
パッケージは tabpfn を入れるだけです。
# uv を使う場合
uv add tabpfn
# pip を使う場合
pip install tabpfn
データ
UCI Adult (Census Income) を使いました。
約4.9万行・14特徴の二値分類(年収が $50K を超えるか)で、workclass や occupation などのカテゴリ列と、いくつかの列に欠損を含みます。陽性率は約24%とやや不均衡なので、評価は ROC-AUC を中心に見ます。
前処理は書かない
TabPFN は 生の DataFrame(カテゴリ列・欠損を含む)をそのまま受け取れます。
one-hot エンコードもスケーリングも欠損補完も書きません。
エンコードや欠損処理はモデル内部の前処理が引き受けてくれます。
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
from tabpfn import TabPFNClassifier
ds = fetch_openml("adult", version=2, as_frame=True)
X = ds.data # カテゴリ列・欠損を含む生のまま
y = (ds.target == ">50K").astype(int)
X_tr, X_te, y_tr, y_te = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=0
)
clf = TabPFNClassifier(device="cuda") # 既定で TabPFN-3
clf.fit(X_tr, y_tr) # パラメータ更新はせず、データを保持するだけ
proba = clf.predict_proba(X_te)[:, 1] # ここで In-Context Learning の forward pass
print(f"AUC = {roc_auc_score(y_te, proba):.4f}")
これだけで動きます。ハイパラ調整も特徴量エンジニアリングもしていません。
結果
学習データ量を 1,000 → 全量(約3.9万行)まで振って、固定のテストセット(全体の20%)に対する AUC と時間を測りました。
単一の層化分割での測定ですが、参考までに 5-fold でも AUC は ±0.003 程度で安定していました。
| 学習行数 | ROC-AUC | Accuracy | fit | predict |
|---|---|---|---|---|
| 1,000 | 0.9015 | 0.849 | 0.76s | 2.44s |
| 5,000 | 0.9094 | 0.857 | 0.32s | 3.75s |
| 10,000 | 0.9132 | 0.859 | 0.31s | 6.71s |
| 20,000 | 0.9150 | 0.860 | 0.36s | 14.83s |
| 39,073(全量) | 0.9174 | 0.862 | 0.47s | 39.05s |
(GPU: NVIDIA RTX 3060)
- 無調整・前処理なしで AUC 0.90〜0.92。公開されている調整済み LightGBM の Adult 参照スコア(おおよそ 0.92〜0.93)に、ほぼ並ぶ水準です。ベースラインを自分で調整しなくても、この水準の性能が得られるのは印象的でした。
- 学習データを増やすほど AUC は上がる(0.9015 → 0.9174)が、伸びは逓減します。1,000 行でもう 0.90 に乗っており、TabPFN の少ないデータで精度が出せるという強みが現れています。
-
fitは常に一瞬、predictは学習サイズに比例して重くなる(2.4秒 → 39秒)。TabPFN は推論時に学習データ全体を文脈に入れるので、当然この形になります。GBDT とは時間配分が逆です。
ちなみに旧 v2 の目安は「学習データ 〜1万行」でしたが、v3 では全量(約3.9万行)も特別な設定なしで動きました。
Prior Labs は v3 について「最大100万行までスケール」と公称しています(クラウドや大規模版向けの公称値で、今回ローカルで試したのは約3.9万行までです)。
TabPFN の特徴・使いどころ
向いていそうな場面
- 小〜中規模のテーブルデータで、まず手早く強いベースラインが欲しいとき。前処理もチューニングも要らないので、立ち上がりが速い。
- カテゴリ・欠損を含む雑多なデータをそのまま投げたいとき。
- ハイパラ探索のループを回す時間をかけたくないとき。
注意したい点
- 推論コストが学習データ量に比例して増える。大きなデータでオンライン推論を多発する用途では、この特性を念頭に置く必要があります(学習データの間引きや、用途に応じた使い分けを検討)。
- GPU 前提。CPU でも動きますが小規模に限られます。
- ライセンスは非商用(研究・社内評価は可。商用は別ライセンス/クラウド API が必要 — 詳細は前述)。
なお「前処理が要らない」点は確かに快適ですが、近年の GBDT(LightGBM / CatBoost)もカテゴリや欠損をかなり素直に扱えるみたいなので、そこは TabPFN だけというわけではありません。
TabPFN の魅力は無調整での立ち上がりの速さと小〜中規模での強さにあると感じました。
まとめ
GBDT 一辺倒だったところに、TabPFN-3 を選択肢として試しました。
前処理なし・無調整のまま、調整済み LightGBM に肉薄する AUC が出て、しかも fit は一瞬。
小〜中規模のテーブルデータで「とりあえず1本目に出してみる」モデルとして、十分に実用的だと感じます。
一方で、推論コストが学習サイズに比例すること、ライセンス(非商用)や初回のトークン同意といった運用面の前提もあります。
これまでテーブルデータでは GBDT ばかり使っていましたが、選択肢のひとつとして覚えておきたいモデルだと感じました。
参考
- 公式サイト: priorlabs.ai
- GitHub: PriorLabs/TabPFN
- Nature 論文: s41586-024-08328-6
おまけ
今回使用した実験用リポジトリです。


