Technical Showcase

Model Validation & Architecture

Return to Demo
Case File

The ML Investigation Journey

Stage 01: Inception

We built a synthetic dataset

We engineered a custom graph generator modeling 5,000 customer accounts and 20,000+ transaction relationships. It simulated structured money-mule behaviors—including victims sending money to intermediaries, who then consolidated funds into hub accounts for final cash-out. This established a labeled ground truth dataset to train our GNN against.

Stage 02: Auditing

First result: 100% accuracy — and we didn't trust it

Our initial GraphSAGE model scored a perfect 100.0% accuracy on the test set. In machine learning, a perfect score is usually a warning sign that the model is cheating rather than learning. We paused the project to conduct a thorough code audit, treating this perfect number with scientific skepticism rather than celebrating.

Stage 03: Discovery

We found two real leaks

Our audit revealed two structural leaks: first, standard random splitting placed some transactions from the same mule ring in the training set and others in the test set, allowing the model to peek at connected answers. Second, our synthetic data generator accidentally linked mules to shared devices, giving the model an unrealistic shortcut to flag fraud without learning transaction graph structures.

Stage 04: Engineering

We fixed both, properly

We refactored the split logic to use component-disjoint splits, holding entire mule rings out together in the test set. We also injected realistic noise, such as legitimate families sharing devices and natural multi-hop transaction patterns. This forced the GNN to learn real transaction topologies instead of relying on metadata shortcuts.

Stage 05: Evaluation

Honest numbers emerged

With the leaks fixed, our tabular baseline (Isolation Forest) scored a weak 64.7% AUC, proving tabular data is insufficient. GraphSAGE scored 99.9% AUC on the clean full graph, and 96.7% AUC under a 35%-edge-masked robustness test. This edge-masked score simulates real-world conditions where transaction visibility is incomplete.

Stage 06: Validation

Independent real-world benchmark validation

We didn't stop at our own synthetic graphs. We validated the GNN on the public IBM AMLSim (HI-Small) benchmark—a NeurIPS 2023 dataset with 56,000 accounts and 6,357 labeled laundering profiles across 8 distinct typologies. The model was evaluated on structure it had never seen before.

Stage 07: Benchmark

Result: 85.5% AUC on unseen laundering patterns

GraphSAGE achieved a strong, believable 85.49% AUC on the IBM AMLSim benchmark. This lower performance on real-world simulated topologies is expected—real-world data has higher complexity and less obvious tells, validating the model's capacity to generalize without overfitting to synthetic patterns.

Stage 08: Determinism

We caught ourselves again — nondeterminism

During a recalibration run, the evaluation scores shifted slightly. Rather than ignoring the variation, we tracked it down to unseeded randomness in PyTorch's execution and Python's default hash ordering. We fixed the random seeds and dictionary sorting across the entire training pipeline to guarantee exact results.

Stage 09: Locked

Final, locked, reproducible result

The model was frozen and verified across three independent training runs. The resulting split hashes and accuracy metrics matched exactly to six decimal places, locking in 85.4943% AUC and 30.7471% F1-score (F1-optimal threshold). These locked parameters represent a fully reproducible, robust, and empirically validated GNN detection engine.

Validation Log

Model Validation Story

Investigation Log: "Catching our own 100% AUC"

  • Initial finding: GraphSAGE model achieved 100% AUC on initial validation.
  • The Leak: We discovered standard random splitting allowed train/test edges to leak structural data between connected nodes.
  • The Fix: Implemented a "ring-based split" using connected components to completely isolate subgraphs.
  • Result: Model maintained robustness, proving it wasn't just memorizing edges.

Baseline vs GraphSAGE (Synthetic)

Isolation Forest (Baseline)64.7% AUC
GraphSAGE (Full Graph)99.9% AUC
GraphSAGE (35% Edge-Masked)96.7% AUC

Independent Real-World Validation

IBM AMLSim (HI-Small) - NeurIPS 2023 Benchmark
56K nodes, 6,357 labeled laundering accounts

MetricFull GraphEdge-Masked
AUC (ROC)85.49%84.13%
F1 (Youden's J)27.39%27.71%
F1 (Optimal Sweep)30.75%30.34%

HONEST DISCLOSURE: The interactive live demo runs on a synthetic transaction subgraph to ensure instantaneous responsiveness. The IBM AMLSim validation numbers reported above were run independently offline on the real 5M-edge dataset.

Architecture Map

Architecture & Roadmap

Current Demo Stack

Next.js UI (React + Tailwind)
↓ HTTP REST / JSON ↓
FastAPI ML Service (Python)
↓ Local Inference ↓
PyTorch GraphSAGE Model

Production ArchitectureNOT IN DEMO

Google Pub/Sub
Cloud Storage
BigQuery (Feature Store)
Vertex AI (GraphSAGE Inference)
Cloud Run (UI)
Gemini API (Forensics)

Future Roadmap

1. Temporal Graph SupportMigrate from static GraphSAGE to TGN (Temporal Graph Networks) for sequence-aware evasion detection.
2. Vertex AI MigrationDeploy the model endpoints to Vertex AI for elastic scaling instead of local FastAPI processes.
3. Automated SAR FilingIntegrate directly with FinCEN's BSA E-Filing batch API via secure Cloud Functions.