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 optimiseroc_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
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
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.