Skip to main content
ByPrior Labs
The simplest, strongest way to push TabPFN further. TabPFN is strong out of the box. The newest and most powerful way to improve it is Thinking Mode: TabPFN-3-Thinking spends extra compute at fit time to deliver better predictions, enabled with a single flag. You pay the optimisation cost once at fit time, and every prediction afterwards benefits. Thinking mode runs on the hosted API client (tabpfn-client), so this whole notebook uses the client. We try it on two contrasting datasets, one where TabPFN is already near-saturated and one with more headroom, to see where the extra compute pays off most.

Setup

Install, authenticate, and import.

Data Loaders

Two roughly balanced binary datasets. NATICUSdroid is wide (86 features) and already easy for TabPFN; in_vehicle_coupon_recommendation is narrower with more headroom. A single loader handles OpenML’s mixed categorical/numeric frames: categoricals are ordinal-encoded, missing values are filled, and the target is mapped so 1 is the minority class.

Model Helpers

Building the client classifier and scoring. build_classifier returns the hosted API client (every fit runs on it). score_clf reports ranking and threshold metrics side by side.

Thinking mode (TabPFN-3-Thinking)

Spend more compute at fit time, get better predictions. Thinking mode applies test-time compute scaling to TabPFN. Instead of a single forward pass, TabPFN-3-Thinking runs an optimisation at fit time, and every prediction afterwards draws on that work. It is a single flag.
thinking_effort is "medium" or "high"; thinking_metric targets the objective (classification: accuracy, log_loss, roc_auc). See the Thinking mode page for details.
A high-effort fit on these datasets takes a few minutes; the cost is paid once at fit time.

Test Runner

One function to run a configuration, plus helpers to tabulate results. run fits a configuration on the client and scores it; make_results_df adds a relative-improvement column measuring how much of the gap to a perfect score thinking closes against the baseline.

Experiments

Baseline versus thinking mode on each dataset.

NATICUSdroid: a Near-Saturated Baseline

Can thinking squeeze out the last bit of quality? NATICUSdroid classifies Android apps as benign or malicious from 86 binary permission and intent flags (7,491 apps, ~35% malicious). TabPFN is already excellent here out of the box (ROC AUC ~0.99), so the question is whether thinking mode can close any of the small remaining gap. Because the classes are roughly balanced we lead with ROC AUC and track balanced accuracy alongside.

Load the data

The full dataset, with a stratified 75/25 split.

Baseline

Default TabPFN on all 86 features, scored on ROC AUC.

Thinking mode

The same fit, with one extra flag. We optimise roc_auc, a threshold-free measure of ranking quality. Even on a near-saturated baseline, thinking closes a meaningful share of the remaining gap to a perfect score.

Results

NATICUSdroid results

In-Vehicle Coupons: More Headroom

Where thinking mode has more room to work. The in-vehicle coupon dataset asks whether a driver would accept a coupon pushed to their car, given 24 features describing the trip and the offer (12,684 scenarios, ~43% accepted). The baseline leaves more headroom than NATICUSdroid, so thinking has more to gain: it lifts ROC AUC, balanced accuracy, F1 and accuracy together.

Load the data

Baseline

Thinking mode

The lever that moves the needle most here.

Results

In-vehicle coupon results

Takeaways

  • Thinking mode is the simplest, strongest lever. One flag (thinking_effort="high") lifted ROC AUC and every threshold metric on both datasets, with no feature engineering or tuning.
  • The gain scales with headroom. On a near-saturated baseline (NATICUSdroid) the lift is small; with more room (in-vehicle coupons) it is larger. Thinking never hurt ROC AUC here.
  • It runs on the hosted client and the compute is paid once, at fit time. Every prediction afterwards benefits, so reach for it first.