Skip to main content
ByKürşat Kaya
A bank has 200,000 customers and wants to know which of them will make a particular kind of transaction in the coming period. It is important for the bank to put the right customers at the top of a list, because the list is what the business acts on. A campaign reaches the first 1%, 5% or 20% of it, and everyone further down is never contacted. The practical question is which model produces the best list for the campaign budgets the bank selects. This notebook fits an XGBoost baseline and TabPFN-3.5 on the Santander Customer Transaction Prediction dataset, then runs TabPFN-3.5-Thinking twice, once optimizing ROC AUC and once average precision. It compares the four models the way a campaign would: by how many transactors each list reaches at selected campaign budgets, and by the simulated net value of a campaign at each of those budgets.

Setup

Install the client, XGBoost and the other dependencies. In Colab, add TABPFN_TOKEN to Secrets; elsewhere, use your usual client authentication.

The data

We use the BeyondArena copy of the Kaggle training set: 200,000 customers, a binary target, and 200 anonymized numeric features. BeyondArena adds two indicator columns per feature that encode whether a value is unique in the dataset, a pattern the competition’s top entries relied on, which brings the width to 600 columns. The features have no names and no documented meaning, so there is nothing to engineer by hand. Because the features are anonymized, we compare the models without domain-specific feature engineering. BeyondArena publishes fixed splits. We take the first fold of the first repetition: 133,333 customers to train on and 66,667 held out. Credit: Santander Bank via Kaggle, used under the competition rules.

What to measure

A campaign does not act on the whole ranking. It contacts the top of it, down to a budget, so we evaluate every model at four selected campaign budgets: the top 1%, 5%, 10% and 20% of customers. At each budget we report:
  • Customers contacted and transactors captured, as counts.
  • Precision: the share of contacted customers who transact.
  • Lift: precision divided by the 10% base rate, that is, how many times better the list does than contacting customers at random.
  • Net value of the simulated campaign, under the cost and value assumptions set further down.
We also report ROC AUC, average precision, and log-loss. ROC AUC, the dataset’s own objective, measures ranking quality everywhere. Average precision weights the top of the list, where campaigns operate. Log-loss measures whether the probabilities are calibrated.

TabPFN-3.5

Every TabPFN model in this notebook is pinned to TabPFN-3.5 with create_default_for_version, so TabPFN-3.5 and TabPFN-3.5-Thinking share the same checkpoint and a change in the API’s default model does not change the comparison. On the API the fit itself takes a few seconds; the time below is mostly uploading 133,000 rows.

Baseline: XGBoost

We include XGBoost as a conventional tabular baseline. We use shallow trees and a small learning rate, settings that suit many weak, independent features, and fit once with them fixed. Nothing is tuned on the held-out customers, so the comparison stays fair.

TabPFN-3.5-Thinking with two objectives

Thinking mode changes what happens at fit time. Instead of a single forward pass, the server runs an optimization over the training data against the metric named in thinking_metric, then serves the result for every later prediction. We compare roc_auc with average_precision to test whether optimizing for the top of the ranking improves small campaigns. "roc_auc" rewards a good ranking everywhere in the list; "average_precision" rewards getting the top of the list right, which is the only part a small campaign ever sees. We fit one model for each objective using the same “micro” effort level. thinking_effort controls the fit-time optimization budget; available levels depend on the client version and account access. On this dataset, each “micro” fit takes approximately 5 minutes.

Ranking quality

The chart puts the table on a common scale: each bar is a model’s improvement over XGBoost, in percent. For log-loss, where lower is better, the bar is the reduction.
Ranking quality Both TabPFN-3.5-Thinking objectives produce the same whole-list results: ROC AUC 0.9074 and average precision 0.6477, compared with 0.8951 and 0.6025 for TabPFN-3.5. XGBoost trails all TabPFN variants, with ROC AUC 0.8872 and average precision 0.5880. Relative to TabPFN-3.5, TabPFN-3.5-Thinking increases average precision from 0.6025 to 0.6477.

Campaign assumptions

To turn a ranking into money we need two numbers, both set in the cell below:
  • Value per transaction: what one transaction is worth to the bank. Default €100.
  • Cost per contact: what one call, email or mailing costs. Default €2.
The net value of contacting the top k customers of a list is net value = (transactors captured × value per transaction) − (customers contacted × cost per contact). These defaults are illustrative, not Santander’s figures. Change them to your own and rerun the cells below. With them, a contact breaks even once 2% of the contacted customers transact (cost ÷ value). This is a simulation based on predicted outcomes, not causal uplift. It counts every contacted customer who transacts as a transaction the campaign won. In practice some of them would have transacted without being contacted, so the real value of a campaign is lower and has to be measured with a randomized control group. The numbers also cover only the 66,667 held-out customers, a third of the customer base. Use them to compare models, not as a forecast of campaign revenue.
TabPFN-3.5-Thinking produces the highest simulated value at every campaign budget. The two TabPFN-3.5-Thinking objectives are within a handful of transactors of each other at every budget, for example 639 and 636 in the top 1%, so neither objective has a meaningful edge here. At the 10% budget, TabPFN-3.5-Thinking with ROC-AUC optimization produces €384,666 in simulated value, compared with €366,166 for TabPFN-3.5 and €355,766 for XGBoost. Under these assumptions, XGBoost’s opportunity cost is €28,900. At 20%, that gap grows to €32,000.

The value of following TabPFN-3.5-Thinking

What does the better ranking add up to? Each bar shows simulated net-value uplift relative to XGBoost at the same campaign budget: how much more a campaign that contacts the top of the model’s list is worth than the same campaign run from XGBoost’s list. We use the ROC AUC run of TabPFN-3.5-Thinking; the average precision run is within a few transactors of it. TabPFN-3.5-Thinking’s campaign is worth 6.8–8.1% more than XGBoost’s at the 5%, 10% and 20% budgets, compared with 1.7–2.9% for TabPFN-3.5. At the top 20% that is €501,734 against €469,734 for XGBoost. These figures cover the 66,667 held-out customers, a third of the customer base, and assume the same €100 value and €2 cost per contact as above.
The value of following TabPFN-3.5-Thinking To illustrate why even a relatively small model improvement can matter at scale, we extrapolate the held-out results to a portfolio of two million customers. Under the same assumptions, TabPFN-3.5-Thinking would generate approximately €867,000 more simulated net value than XGBoost at a 10% campaign budget. The extrapolation is linear: it assumes the wider portfolio looks like the held-out customers.
The value of following TabPFN-3.5-Thinking

What this means for targeting

TabPFN-3.5-Thinking captures more transactors and produces the highest simulated net value at all four tested campaign budgets. At a 10% budget, it produces €384,666 on the 66,667 held-out customers: €18,500 more than TabPFN-3.5 and €28,900 more than XGBoost. The Thinking objective makes little practical difference in this experiment. Optimizing ROC AUC or average precision changes the number of captured transactors by no more than 13 at any tested budget. Here, most of the improvement comes from using Thinking rather than selecting between these two objectives. At larger scale, a small per-customer improvement can become material. If the held-out results scaled linearly to two million customers, the 10% campaign would produce approximately €867,000 more simulated value with Thinking than with XGBoost. This extrapolation assumes the same transaction rate, model performance, €100 transaction value, and €2 contact cost. It is a propensity-based simulation, not an estimate of causal campaign impact.

Takeaways

  • TabPFN-3.5-Thinking produces the highest simulated campaign value at every tested budget.
  • At a 10% budget, Thinking adds €18,500 over TabPFN-3.5 and €28,900 over XGBoost on the held-out customers.
  • Under the same assumptions, the advantage over XGBoost would correspond to approximately €867,000 across a two-million-customer portfolio.
  • ROC AUC and average-precision optimization give nearly identical results here; enabling Thinking matters more than choosing between the two objectives.