AML GNN ablation
Run the four-arm GraphSAGE ablation over the transfer graph and read the result.
pragmatiq is an independent implementation inspired by the PRAGMA paper (arXiv 2604.08649) and is not affiliated with or endorsed by Revolut.
This is the hands-on runbook for pragmatiq's AML graph extension (our addition, not in the paper). See that page for why; here is how to run it.
Build a run with transfers + AML labels
pip install -e .
pragmatiq synth generate --out data/aml --n-users 12000 --n-workers 8 \
--config configs/data/synthetic.yaml # produces transfers.parquet + labels/aml.parquet
pragmatiq tokenize data/aml --out data/aml/tok
pragmatiq pretrain data/aml/tok --name aml --model-size smallRun the ablation
pragmatiq gnn data/aml/tok --run runs/aml \
--transfers data/aml/transfers.parquet \
--aml-label data/aml/labels/aml.parquet \
--epochs 150This trains four setups and reports held-out ROC-AUC (mean ± std over seeds): (a) a probe on isolated embeddings, (b) GraphSAGE + pragmatiq features, (c) GraphSAGE + hand-crafted features, (d) a logistic control on the hand-crafted features with no graph.
Read it
The gated claim is relational recovery — (c) 0.670 ≫ (a) 0.498: the
transfer graph carries multi-hop AML signal an isolated per-user embedding cannot see, and
message passing adds over the same features without a graph ((c) > (d) 0.604). The honest
limitation is that the learned per-user embedding adds only a little ((b) 0.554) and does
not beat hand-crafted features ((b) < (c)) — recovering the laundering signal in a learned
representation is the open challenge. The full discussion is on the
concept page and in the
04_aml_gnn notebook.