0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

重みを更新しないテーブル基盤モデル「TabPFN-3」を試してみた

0
Last updated at Posted at 2026-05-29

はじめに

これまでテーブルデータを扱う際は、主に 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() で止まるので、先に済ませておきます。

  1. ux.priorlabs.ai で登録(またはログイン)する

  2. Licenses タブで TabPFN-3 のライセンスに同意

DF198446-5F4D-463B-B0ED-412C6F455CB5.jpeg

  1. API Key を発行してコピーする

59EED41A-91DA-4378-8FF7-52B7EA3A6560_1_201_a.jpeg

  1. その鍵を環境変数 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 を超えるか)で、workclassoccupation などのカテゴリ列と、いくつかの列に欠損を含みます。陽性率は約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)

tabpfn_sweep.png

  • 無調整・前処理なしで 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 ばかり使っていましたが、選択肢のひとつとして覚えておきたいモデルだと感じました。


参考

おまけ

今回使用した実験用リポジトリです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?