Evidence for privacy and compliance teams

Your first question: Can anyone learn from the synthetic rows whether a person was in my data, or what their values were?

Short answer, from one benchmark run on six public tables: the strongest of four membership attacks reached an AUC of 0.50–0.55 against Ground's rows (0.5 is a coin flip; Ground flags anything above 0.6 for review), synthetic rows were closer to a training row than to an unseen one 47.2%–52.1% of the time (about 50% means no memorisation), and no synthetic row copied a rare real record. These are measured attacks, not a guarantee. A formal guarantee needs differential privacy, which costs fidelity (below).

Membership attacks

Best membership-inference AUC across four attacks

Distance, density ratio (DOMIAS), neighbourhood (Monte Carlo) and classifier attacks; the highest AUC is shown. The line is 0.5, no signal. Ground flags above 0.6. Lower is better.

Best membership-inference AUC across four attacks: the numbers in the chart
DatasetGroundGround (DP ε=3)Ground (DP ε=3, MST)
Adult0.5190.5100.504
Bank0.5120.5020.511
Credit0.5160.5190.554
Telco0.5240.5250.519
Housing0.5160.5210.519
Insurance0.5070.5480.498
True-positive rate at a 1% false-positive rate (the attack's hit rate when it may almost never be wrong)
MeasureValue
TPR at 1% FPR, strongest attackpending first independent run

The report computes TPR at 1% FPR for every attack on every dataset (it flags anything above 5%), but the published benchmark run recorded only the AUC, so the low-false-positive number is pending first independent run. AUC averages over all thresholds and can hide an attack that is very sure about a few people; TPR at low FPR is the number to ask for.

Distance to closest record, copies and inference

Ground and its private variants on each table: DCR share, rare copies, attribute inference and singling out
Dataset, methodDCR shareRare copiesAttribute inferenceSingling out
Adult, Ground50.7%00.0490.008
Adult, Ground (DP ε=3)47.8%00.0100.000
Adult, Ground (DP ε=3, MST)47.2%00.0000.000
Bank, Ground47.9%00.0180.003
Bank, Ground (DP ε=3)48.9%00.0190.008
Bank, Ground (DP ε=3, MST)49.6%00.0400.000
Credit, Ground51.8%00.0630.000
Credit, Ground (DP ε=3)52.1%00.0000.000
Credit, Ground (DP ε=3, MST)51.8%00.0000.026
Telco, Ground52%00.0710.000
Telco, Ground (DP ε=3)50.1%00.0510.013
Telco, Ground (DP ε=3, MST)49.4%00.0000.037
Housing, Ground48.8%00.0800.017
Housing, Ground (DP ε=3)49%00.0000.020
Housing, Ground (DP ε=3, MST)51.9%00.0800.000
Insurance, Ground51.9%00.0000.000
Insurance, Ground (DP ε=3)49.7%00.0640.028
Insurance, Ground (DP ε=3, MST)51.4%00.0000.000
How it was measured
Each table is split 80/20 with seed 7; the synthesizer sees only the 80%. Attacks try to tell those training rows from the unseen 20% using the synthetic rows. DCR share: synthetic rows closer to a training row than to a holdout row (about 50% is ideal, above 60% flags review). Attribute inference and singling out are Anonymeter-style excess risks of training over holdout rows (above 0.1 flags review).
Uncertainty
One run per table with fixed seeds; no confidence intervals. Attack AUCs within a few hundredths of 0.5 are indistinguishable from chance at these sizes.
Scored by
Ground's own report (self-scored). Independent attack implementations are pending first independent run.
Source
apps/web/lib/benchmark-results.json; docs/benchmarks.md

Canary records

The canary audit plants made-up records, refits the same kind of model, and checks whether the output gives them away. It reports the attack AUC on the canaries and an empirical lower bound on ε (Clopper–Pearson 95%). On the public tables: attack AUC pending first independent run, ε lower bound pending first independent run. The audit is part of the report Ground computes for an upload, so your own dataset's report has its own result.

Differential privacy at each ε

ε = 3 (δ = 10⁻⁶) against Ground's default mode: what the formal guarantee costs
DatasetOverall, defaultOverall, Ground (DP ε=3)Detection AUC, Ground (DP ε=3)Overall, Ground (DP ε=3, MST)Detection AUC, Ground (DP ε=3, MST)
Adult94770.82750.83
Bank90641.00650.98
Credit91630.99660.97
Telco92640.98690.92
Housing95750.87760.80
Insurance98800.75820.73

Other values of ε: pending first independent run. At ε = 3 column shapes and the label mix survive, but a classifier can still tell the private rows from real ones (detection AUC near 1 on several tables): the noise breaks fine-grained structure, and rules are off because they can't be learned without spending budget. The schema, including every class of the label, is treated as public and isn't covered by ε.

What happens to your upload

  • Files go from your browser straight to encrypted storage through short-lived signed links; nothing passes through the web app.
  • Names, emails, phones, IDs, card numbers and addresses are detected and replaced with fake values, never modeled.
  • In the default mode every source row is fingerprinted, and a generated row that would reproduce a rare real record is redrawn. (Private mode never reads real rows while generating, so it needs no copy guard.)
  • Raw uploads, and the copies of their rows made for training, are deleted after 30 days by default or on request.
  • When GPU engines are on for a dataset, the modeled columns (never identifiers or personal data) go to Ground's own Modal workspace through short-lived links, and Modal keeps nothing once a job ends. Free text goes there only if you turn on private fine-tuning for it, and the canary audit sends a second copy of the training rows. Those rows can still be personal data in combination (an age, a postcode and a diagnosis).
  • For AI-written text columns, Claude sees only short, scrubbed examples, never your files. Uploads are never used to train AI models.

Next: methods and reproducibility, or read how to evaluate synthetic data quality and privacy.