SynthForge SynthForge SynthForge IO

Reproducible benchmarks

We run SynthForge against the open-source CTGAN baseline (a GAN-based tabular synthesizer from the SDV project) on two canonical public datasets (UCI Adult and Credit Card Default), across statistical fidelity, ML utility, privacy, and constraint conformance. The raw JSON powering this page is published alongside it. We run these ourselves and publish the raw results so you can check every number.

Last run: 2026-05-05T18:57:11.295000+00:00 ยท raw results.json

How to read these numbers

SynthForge is schema-driven, not data-fitted. For each dataset we hand-author a schema from the public data dictionary and never show the generator the real CSV. CTGAN trains on the real data. The benchmark exists to measure that asymmetry, not to hide it.

So the fidelity and utility tables below are where a trained model wins, and it does. The privacy and constraint tables are where a generator that never saw the data wins: it cannot memorise rows it never read, and every row it emits satisfies the schema by construction.

A higher DCR means synthetic rows are far from real ones. An NNDR near 1 means no synthetic row hugs one specific real row. A validity rate of 1.000 means every row passed every range and enum constraint.

Headline

Four numbers per dataset, SynthForge against CTGAN. Constraint validity and privacy distance are where a generator that never saw the data wins. Fidelity and utility are where a model trained on it does.

adult

MetricSynthForgeCTGAN
Constraint validity1.0000.729
DCR p518.7880.278
Fidelity (overall)0.5170.881
LogReg TSTR0.6850.889

credit

MetricSynthForgeCTGAN
Constraint validity1.0001.000
DCR p57.2450.380
Fidelity (overall)0.6450.940
LogReg TSTR0.5130.705

adult

Constraint conformance

SynthesizerValidity rate
synthforge1.000
ctgan0.729

Privacy

SynthesizerDCR p5 (normalised)NNDR (median)
synthforge18.7880.998
ctgan0.2780.951

ML utility (TSTR vs TRTR, AUC)

SynthesizerLogReg TRTRLogReg TSTRGBM TRTRGBM TSTR
synthforge0.9020.6850.9160.668
ctgan0.9020.8890.9160.891

Statistical fidelity

SynthesizerOverallColumn shapesColumn pair trends
synthforge0.5170.5730.461
ctgan0.8810.8960.866

credit

Constraint conformance

SynthesizerValidity rate
synthforge1.000
ctgan1.000

Privacy

SynthesizerDCR p5 (normalised)NNDR (median)
synthforge7.2450.971
ctgan0.3800.915

ML utility (TSTR vs TRTR, AUC)

SynthesizerLogReg TRTRLogReg TSTRGBM TRTRGBM TSTR
synthforge0.7160.5130.7800.485
ctgan0.7160.7050.7800.756

Statistical fidelity

SynthesizerOverallColumn shapesColumn pair trends
synthforge0.6450.6820.609
ctgan0.9400.9190.960

Run history

Every benchmark run is appended here so you can see how the numbers change over time. We rerun whenever the generator changes meaningfully, or on a schedule. One run so far; future runs append below.

adult

Date Fidelity (overall) TSTR (LogReg AUC) DCR (privacy) Integrity
Run date SFCTGAN SFCTGAN SFCTGAN SFCTGAN
2026-05-05 0.517 0.881 0.685 0.889 18.788 0.278 1.000 0.729

credit

Date Fidelity (overall) TSTR (LogReg AUC) DCR (privacy) Integrity
Run date SFCTGAN SFCTGAN SFCTGAN SFCTGAN
2026-05-05 0.645 0.940 0.513 0.705 7.245 0.380 1.000 1.000

Full per-run reports: results-history.json.

Methodology

What we measure

FamilyMetricDirection
Statistical fidelity SDMetrics QualityReport: overall, column shapes, column pair trends higher = better
ML utility TSTR (Train-Synthetic-Test-Real) and TRTR AUC, for logistic regression and gradient boosting higher = better; closer TSTR-to-TRTR is the meaningful signal
Privacy DCR (5th-percentile distance to closest record, normalised by intra-real median) and NNDR (median nearest-neighbour distance ratio) DCR higher = better; NNDR closer to 1 = better
Constraint conformance Fraction of synthetic rows that satisfy all schema constraints (range, enum membership) higher = better

The caveat about schema authoring, and how to read the privacy numbers, are at the top of the page.

What we run

Both synthesizers produce a synthetic dataset of the same size as the real dataset, then every metric is run on the (real, synthetic) pair.

Datasets

Reproducibility

What we explicitly do not measure (and why)

Want to inspect the raw numbers? Download results.json. The field-type catalog and these result snapshots are also staged as an MIT package under github.com/synthforgeio/benchmarks (MIT; field catalog + results). Full harness source is still private; reach out at support@synthforge.io to review methodology.