Technical Showcase
Model Validation & Architecture
The ML Investigation Journey
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.
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.
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.
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.
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.
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.
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.
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.
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.
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)
Independent Real-World Validation
IBM AMLSim (HI-Small) - NeurIPS 2023 Benchmark
56K nodes, 6,357 labeled laundering accounts
| Metric | Full Graph | Edge-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.