Judge a Transaction by the Company It Keeps — Somya Rai & MD Sharique, EXL

Read the talk

Judge a Transaction by the Company It Keeps

Somya Rai and MD Sharique explain how EXL adds graph embeddings to XGBoost for fraud detection—and why preserving transaction neighborhoods, preventing leakage and keeping graph work off the request path matter as much as the model.

From a talk by Somya Rai and MD Sharique

At a glance

Ideas worth remembering

  • Graph embeddings add neighborhood information to XGBoost. The reported 27–33% relative detection gains compare the combined system with a tuned tabular baseline at matched alert rates.

  • Sampling must preserve useful connectivity: retain selected users’ histories, keep legitimate transactions from fraud-associated users as hard negatives, and balance training batches downstream.

  • Monthly graph separation, earlier-timestamp aggregation, target exclusion and training-only preprocessing address different leakage routes.

  • Mean, maximum and standard deviation preserve different neighborhood signals; maximum pooling keeps a single suspicious neighbor from disappearing into an average.

  • Caching removes graph-sized work from each request, but memory and freshness remain constraints. User-and-merchant embeddings reduce the stated cache from 60 GB to 2–3 GB; the final reported latency is 3.1 milliseconds at P99.

The same purchase, two very different scores

An online purchase scores 0.04 when the model sees its amount, merchant, merchant category code, device, time of day and the rest of its 198 engineered features. Give the model access to the transaction’s neighborhood, without changing the feature row, and the score becomes 0.91. Somya Rai opens EXL’s example with this discrepancy: links to recently flagged fraud change how an otherwise ordinary purchase looks. The comparison asks a concrete question: what information becomes visible when the model can inspect connections between transactions?

The transaction scores 0.04 alone; with three of its four graph neighbors flagged for fraud, the score shown is 0.91.Open full source frame
The transaction scores 0.04 alone; with three of its four graph neighbors flagged for fraud, the score shown is 0.91.

The answer depends on the portfolio. Physical point-of-sale transactions have a reported natural fraud rate of roughly 0.05%, or one in 2,000, with much of the signal in the card’s own transaction velocity. Online transactions have a 0.6% fraud rate—12 times higher—and more signal in merchants and neighboring activity. Those different base rates and patterns lead to separate models for the two portfolios.

Both models face the same operational constraint: analysts can review only the highest-scoring 0.5% to 1.5% of transactions. Ranking more real fraud into that fixed slice matters more than improving an overall discrimination score alone. At a fixed number of alerts, catching more fraud also makes the analyst queue more precise. The model must do that without increasing scoring latency.

0:040:34
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:04 · section reference included

Add neighborhood information to the existing classifier

More tabular engineering had already produced diminishing returns. For point-of-sale transactions, expanding 40 raw attributes to 87 engineered features moved true positive rate from 35.5% to 36.6% after feature selection and leakage checks. Nearly 200 engineered features produced about a one-point improvement online. Rai interprets this as an information ceiling in their existing pipeline: transformations of a row and its card history keep reusing the same underlying evidence.

A merchant that became suspicious 40 minutes ago or a velocity chain spanning cards introduces a different input: relationships between rows. A graph neural network gathers neighboring hidden states, reduces a variable-size neighbor set to a fixed-width vector, and combines that vector with the node’s own state through learned weights. Stacking two layers lets a transaction’s representation incorporate both immediate neighbors and neighbors two steps away.

The deployment keeps XGBoost as the classifier. The GNN supplies embeddings that become additional inputs to the gradient-boosted model: “We did not replace XGBoost. We fed it.” The reported comparison is therefore XGBoost alone against XGBoost with graph embeddings, at matched alert rates and evaluation windows, with the same underlying features available to both.

Making that addition useful requires decisions before and after training. Sampling must raise the representation of rare fraud without deleting the neighborhoods that explain it. Graph construction must prevent future information and labels from entering the inputs. Explanations must connect a score to evidence an analyst can investigate. Serving must fit a millisecond budget. Rai also reports a post-launch improvement from rolling-window training and edge time decay, without quantifying that iteration’s separate contribution.

2:042:34
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

2:04 · section reference included

Sample users without hollowing out their histories

MD Sharique begins the implementation with soft fraud-rate targets: 0.5% for the point-of-sale portfolio and 6% online, about ten times each portfolio’s natural rate. The targets are soft because enforcing a precise class ratio by deleting individual legitimate transactions would also delete their edges. The sampled graph could retain the fraud labels while losing the context needed to learn from them.

The preservation rule works at the user level: selected users retain their complete transaction histories. A user associated with fraud keeps legitimate transactions too, providing hard negatives that help the model distinguish suspicious behavior from ordinary behavior by the same person. Fraud users remain uncapped. Balanced batch sampling inside the trainer addresses the remaining class imbalance.

Neighborhood size is the practical check on whether this sampling has changed the learning problem. Sharique reports an average training-time user degree of roughly 11.5 to almost 14 in the point-of-sale portfolio, matching inference-time neighborhoods. Across the 12 tested months, the reported stability matters because a model trained on artificially sparse histories would learn from a different neighborhood structure than the one it encounters when scoring real transactions.

6:276:57
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

6:27 · section reference included

Make time and entity history part of graph construction

Each calendar month becomes a disjoint graph. A transaction connects to its user and merchant, with a five-hop follows chain back through its recent transaction history. No edge crosses a month boundary. This separates monthly data partitions structurally; timestamp restrictions then determine which information a transaction may aggregate within its graph.

The leakage controls address four different routes by which an evaluation could become too easy:

  • Future information: a transaction aggregates only neighbors with earlier timestamps.
  • Split contamination: disjoint monthly graphs prevent graph paths from crossing training, validation and test partitions.
  • Target information: the fraud flag remains the prediction target; it is never a feature or an edge.
  • Preprocessing information: scalers and vocabularies are fitted on training-month data, then frozen for later use.

The model uses 202 features across three node types: 73 user features, 109 transaction features and 20 merchant features. Of the transaction features, 32 are derived fraud features. These provide behavioral context alongside the graph’s relational context:

  • Entity history—10 features: past transaction count, days since last activity, and statistics such as the mean, standard deviation and maximum of the last five amounts establish a user or merchant baseline.
  • Risk aggregates—8 features: an amount Z-score against that history, recent-versus-past ratios and transactions per day describe departures from the entity’s own behavior.
  • Velocity and time—14 features: counts and amounts over five-minute, one-hour and 24-hour windows, distinct counterparties over the last day, seconds since the previous transaction and country-change rate capture bursts or implausible movement.

The combination answers two separate questions. Edges identify whom a transaction connects to. Historical and temporal features describe how those entities are behaving relative to their own normal activity. A connection to a merchant and an unusual burst of activity at that merchant carry complementary information.

8:298:59
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

8:29 · section reference included

Keep the suspicious neighbor from disappearing into the mean

GraphSAGE samples a fixed, recency-biased set of neighbors at each hop, preventing a very large merchant neighborhood from dominating the messages. It aggregates those neighbors, combines the result with the node’s own vector and produces an embedding over two layers. The learned object is the aggregation function rather than a separate fixed embedding for every known node, allowing new users and merchants to receive representations without retraining.

Why concatenate mean, maximum and standard deviation instead of averaging alone? Sharique’s example gives a transaction four neighbors: three with scores around 0.1 and one linked to a fraud ring at 0.92. The mean falls to roughly 0.3, while the maximum remains 0.92. Averaging weakens the very pattern the model needs to preserve: one dangerous connection among several ordinary ones.

With three neighbor scores near 0.1 and one at 0.92, mean pooling yields 0.32 while max pooling retains 0.92.Open full source frame
With three neighbor scores near 0.1 and one at 0.92, mean pooling yields 0.32 while max pooling retains 0.92.

The three statistics expose different properties of the same neighborhood:

  • Mean: the neighborhood’s overall level of activity or signal.
  • Maximum: a strong individual signal that could disappear in an average.
  • Standard deviation: disagreement within the neighborhood, distinguishing a uniformly ordinary group from one containing an outlier.

All three are invariant to neighbor ordering and produce a fixed-size aggregate regardless of neighborhood size. The statistical operations introduce no learned parameters of their own; the combined aggregate then passes through learned weights.

Embedding width also has a measured stopping point in this application. A 64-dimensional representation slightly underfits; 128 dimensions gives the preferred validation result. Moving to 256 dimensions costs more GPU resources without improving performance, with validation gains flattening and overfitting beginning beyond 128. Increasing representation size does not recover useful information indefinitely.

11:0911:39
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

11:09 · section reference included

Compare fraud detection inside the same alert budget

The reported detection gains are easiest to read side by side. True positive rate measures the share of actual fraud detected; relative lift divides the increase by the baseline rate.

PortfolioXGBoost TPRGNN + XGBoost TPRRelative lift
Point of sale36%48%33%
Online48%61%27%

The point-of-sale comparison explicitly uses a 0.5% alert rate. The online comparison is also described as using matched alert rates, although its precise rate is not stated in this results passage. These are portfolio-specific results against the team’s tuned baseline.

The financial quantities need to remain distinct. Rai describes approximately $65 million in projected annualized incremental fraud capture across the portfolios. Sharique later reports $5.6 million captured at an 83% capture rate for point of sale, and $35.4 million at 71% online. The recording does not reconcile those amounts with the annualized projection or define the denominator of the capture percentages. They should therefore remain separately reported quantities, rather than being added together or presented as realized savings. The higher online fraud rate helps explain why that portfolio contributes most of the projected opportunity.

At the stated alert rates, GNN + XGBoost raises TPR from 36.6% to 48.7% for physical POS and from 48.3% to 61.5% online.Open full source frame
At the stated alert rates, GNN + XGBoost raises TPR from 36.6% to 48.7% for physical POS and from 48.3% to 61.5% online.
4:3413:43
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

13:43 · section reference included

Turn a high score into linked evidence

Subgraph attribution examines which relationships contributed to a flagged result. Across 200 flagged cases in each channel, transaction-to-transaction velocity edges had reported mean importance of 0.94 for point of sale and 0.62 online. They were the leading evidence in all 200 point-of-sale cases. Merchant edges had higher importance online—0.19 versus 0.04 for point of sale—consistent with the different signal patterns introduced at the start.

For an analyst, the useful change is from a bare score of 0.91 to a score supported by three linked transactions in the last 40 minutes. The analyst can inspect those transactions rather than reconstruct the entire case. The importance values describe this attribution sample; they are not percentages of all fraud caused by each edge type.

That evidence serves several operational purposes:

  • Documented rationale: financial institutions need explanations for automated decisions within regulatory and model-risk processes.
  • Investigation speed: specific links give analysts something to verify, reducing the temptation to ignore or rubber-stamp an unexplained score.
  • Model debugging: changing attribution patterns can reveal reliance on a spurious or weakening signal before aggregate performance visibly deteriorates.
  • Training feedback: explanations can help analysts assess borderline cases and supply more useful labels for later training.
14:3915:09
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

14:39 · section reference included

Move graph-sized work out of the request path

The first serving design computes graph representations offline. A GPU-sharded, layer-wise GraphSAGE forward pass processes the graph in destination-node batches. Sharique describes it as numerically equivalent to a full-graph forward pass while keeping each batch within a few gigabytes across multiple GPUs. Per-layer representations for users, merchants and recent transactions go into a low-latency embedding store; each user’s last five transactions also sit in a ring buffer.

What crosses from offline computation into online scoring? Cached neighbor states let a new transaction reuse prior graph work. At request time, an assembly step retrieves those states and applies exponential recency weighting matched to training. The service then runs only the new transaction’s two-layer forward pass and the XGBoost classifier. It builds no graph and performs no neighbor sampling during the request, so request work does not grow with the full graph.

Small runtime decisions matter at this scale. The service pins math-library thread pools to one before loading the heavy libraries; Sharique reports a reduction from 30 milliseconds to one millisecond from that change. Startup warmup avoids making the first real request pay initialization costs. The implementation described is a single in-memory process, with a distributed cache presented as a later scaling option through the same interface.

Cached states connect offline graph computation to a small online forward pass

Offline GraphSAGEOffline — GPU-sharded, layer-wise computation in destination-node batches.
Representation cacheStored state — Per-layer user, merchant and recent-transaction states; last five transactions per user in a ring buffer.
Incoming transactionOnline — The new transaction being scored.
Assemble neighbor statesOnline — Retrieve cached states and apply training-matched exponential recency weighting.
New transaction forwardOnline — Compute only this transaction’s two-layer representation.
XGBoost scoreOnline — Use the graph representation in the existing classifier.
This is the initial transaction-node serving design. The cache carries computed representations into scoring; the incoming transaction supplies the new work.
Read the diagram as text
  • Offline GraphSAGE. Offline — GPU-sharded, layer-wise computation in destination-node batches.
  • Representation cache. Stored state — Per-layer user, merchant and recent-transaction states; last five transactions per user in a ring buffer.
  • Incoming transaction. Online — The new transaction being scored.
  • Assemble neighbor states. Online — Retrieve cached states and apply training-matched exponential recency weighting.
  • New transaction forward. Online — Compute only this transaction’s two-layer representation.
  • XGBoost score. Online — Use the graph representation in the existing classifier.
  • Offline GraphSAGE → Representation cache: Store per-layer representations.
  • Representation cache → Assemble neighbor states: Retrieve neighbor states.
  • Assemble neighbor states → New transaction forward: Supply cached neighborhood information.
  • Incoming transaction → New transaction forward: Supply the new transaction’s state.
  • New transaction forward → XGBoost score: Supply graph embedding.
16:4717:17
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

16:47 · section reference included

Predict on an edge to shrink the cache

Caching every transaction creates a second bottleneck. At production scale, the initial design needs roughly 60 GB of representations and expensive high-memory serving. Freshness also matters: with a one-day embedding lag, the reported true positive rate falls from 48% to 44%. A fast lookup is less useful when the stored neighborhood has fallen behind the activity it is meant to describe.

The proposed correction changes what receives an embedding. Predicting on the transaction edge allows the system to precompute user and merchant embeddings without retaining a representation for every transaction. The stated footprint falls to 2–3 GB, roughly 20 times smaller, and fits the same CPU class used for the accompanying XGBoost model. Sharique says Nvidia independently recommended the approach and expected performance comparable to the node model. That expectation does not establish a measured recovery of the four-point detection loss from stale embeddings.

Where does the remaining request time go? Preprocessing, cache lookup and the XGBoost head each take fractions of a millisecond. The two-layer GNN forward pass is the largest component at 1.61 milliseconds. The reported end-to-end latency is 2.3 milliseconds at the median and 3.1 milliseconds at P99, within the stated 3–4 millisecond service-level agreement. That breakdown identifies the GNN computation as the next useful optimization target.

The two-layer GNN forward pass takes 1.61 ms, while preprocessing, cache lookup and XGBoost each take a fraction of a millisecond; the slide reports 2.3 ms p50 and 3.1 ms p99 end-to-end.Open full source frame
The two-layer GNN forward pass takes 1.61 ms, while preprocessing, cache lookup and XGBoost each take a fraction of a millisecond; the slide reports 2.3 ms p50 and 3.1 ms p99 end-to-end.

The closing optimization options follow that measured bottleneck: recompile or quantize the GNN forward pass if more headroom becomes necessary. The practical design has already moved full-graph computation offline, bounded online work to a new transaction and reduced the set of entities requiring cached representations. Further latency work can focus on the computation still dominating the request.

18:3419:04
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

18:34 · section reference included

Read the complete timestamped transcript
  1. 0:04

    Hi, I'm Somya Rai, VP of AI Engineering. What we see here are two score, same transaction both the times. On the left, a single online purchase where we look at the amount spent, who is the merchant, MCC code, device type, what time of the day, and with one ninety-eight features by the time we are done engineering. And it scores zero point zero four, comfortably under any threshold we would alert on. As far as we are concerned, this one looks clean. On the right,

  2. 0:34

    same transaction, same feature vector. Not one byte of that row is different. The only thing that we change is what model is allowed to look at, the neighborhood it sits in. Three of the four transactions, a user, a merchant, and two other transactions were flagged fraud within the last hour. Now the score is zero point nine one. So the signal was never in the row, it was in the edges. Therefore, fraud isn't a property of a transaction, it is a property of the neighborhood it sits in.

  3. 1:04

    Let me describe the shape of the problem, because it is two problems wearing one name. Physical transaction at the merchant point of sale roughly has zero point zero five percent natural fraud rate. That is one in two thousand. These are tight, low noise signal and fraud largely resides in the card's own transaction velocity. Whereas online transactions have zero point six percent of the fraud rate, twelve times higher, with higher volume, noisier, and far more of it of the signal sits in the merchant and the neighbor context.

  4. 1:34

    These two portfolios have a different base rate and a different signal geometry. Therefore, in practice, two models, not one. And here is the constraint that makes this as an engineering problem, not... and not just a modeling one. The alert budget is fixed. Analysts review the top zero point five to one point five percent of the score transaction. That's it. So the area under the curve isn't just the objective we care about, rather the precision at the fixed K. To be worth anything, a model has to move a

  5. 2:04

    real fraud into that slice and do it at the same latency. So the obvious question here is: Why not just build a better XGBoost model? We did. Physical point of sale, we went from the forty raw attributes to eighty-seven engineered features. After selection and the leakage checks, the true positive rates moves from thirty-five point five to thirty-six point six. And for the online transaction, same story. Nearly two hundred engineered features, and we c-- we pick up about a point. So

  6. 2:34

    you know, two to five times the feature surface, one point of TPR. Now, that's not a tuning failure, right? That's ceiling. Because every feature we engineered is just a function of the same row and the same card's own history. We are projecting the information we already had. Tabular features answers one question, "What does this transaction look like?" They cannot answer the second one, "Who is it connected to, and what are they doing right now?" Rates sharing a device, velocity chains across card, a merchant

  7. 3:04

    went... that went bad forty minutes ago. This lives in edges between the rows, and a model that sees one row at a time is blind to it by design, no matter how many columns we add to it. Okay. So here's the mental model for the rest of the talk. A graph neural network does not learn a node from its own feature. It learns from its, its neighborhood. One layer, three operations. First, gather. We pull in each neighbor's hidden states across the tight

  8. 3:34

    edges, such as transaction to user, transaction to merchant. Aggregate. We collapse that neighbor set, which is, you know, a different size for every node, one into a fixed-width vector, and we do it with a permutation invariant function. Which function we pick mattered way more than we expected, and Sharique is going to come back to that. Third, update. We concatenate that aggregate with the node's own state, push it through learned weights, and then we stack it twice. So every transaction knows about its neighbors

  9. 4:04

    and its neighbor's neighbor before the classifiers ever sees it. So does these results hold up? Yes, it does. And I want to be precise about what's being compared. We did not replace XGBoost. We fed it. The GNN produces the embeddings. These embeddings goes into the same gradient boosted model, and that's what gets scored. So XGBoost alone versus XGBoost plus the graph is what we are comparing at. So the three numbers that we would like to highlight, first is twenty-seven to thirty percent--

  10. 4:34

    thirty-three percent relative lift in the true positive rate over a tuned XGBoost baseline using the same alert rate, same evaluation window, and same features available to both the models. Second, approximately sixty-five million dollars projected annualized incremental fraud capture across the two card portfolios. And third, the three millisecond P99 in production. So this talk is just not about the numbers. It's about how we got here. Four decisions and order

  11. 5:04

    matters. First, in the foremost, sampling. Fraud is one in two thousand, so we cannot train a raw distribution. We have to lift the fraud rate, but this is not a tabular data set where the rows are independent. Every negative we drop takes its edges with it. Downsample the easy way, we keep the labels, but lose the neighborhood that makes them worth anything. So holding a soft target fraud rate without really breaking the connectivity was the key. Second, graphing features.

  12. 5:34

    Building it leakage safe, which is harder than it sounds when your edges carry timestamps plus thirty-two derived features created to detect fraud. The third, explainability. An analyst won't action a number. This is a regulated work where the score has to come with an evidence, so or it does not ship. And serving at three milliseconds, two thing got us here, the aggregation method and the pivot from the node level prediction to edge level. Then at the end, one iteration that we validated

  13. 6:04

    after launch was creating and training the, training the model at a rolling window plus an edge time decay approach, and this moved the numbers again. With this, I would like to hand it over to Sharique to get into the nuts and bolts of how did we create the graphs, how did we optimize the same, and what were the engineering decisions that we have taken in order to make this model more optimized.

  14. 6:27

    Hi, I am Mohammed Sharique, Principal AI Architect. This is judge a transaction by the company it keeps. How a graph neural network beat XGBoost by over thirty percent on fraud capture, and how we serve it in three milliseconds. I will walk through the technical build, sampling, graph construction, serving, and explainability. So let's get into it. First decision most teams get wrong is the data sampling. We hold a soft target

  15. 6:57

    fraud rate of point five percent for card-related merchant transactions, about ten times the zero point zero five percent natural fraud rate, and six percent for online transactions, again, about ten times the zero point six percent natural fraud rate. Both far gentle than the aggressive over or under-sampling a tabular pipeline would use. Why? Because every selected user's complete transactional history

  16. 7:27

    stays in the graph. If you trim a genuine user's history to hit a class ratio, you break the connectivity their neighbors depend on, and a fraud user's own genuine transactions stay in too as hard negatives, the most useful example for the decision boundary. If capping ever triggers, only the genuine user's word budget shrinks. Fraud users are never capped. Class imbalance gets handled downstream instead with balanced batch sampling inside the trainer.

  17. 7:58

    Here's the receipt. Average user degree at training time, eleven and a half to almost fourteen for card-related merchant transactions. Matches what the model sees at inference. If training time neighborhood don't match inference time neighborhood, the model learns the wrong thing. It's stable across all twelve months we tested at natural rate of zero point zero five percent and zero point six percent. No vintage drift to correct for.

  18. 8:29

    Second decision, leakage control built into the graph itself, not checked for afterward. Each calendar month is its own disjoint graph. No edge overcrosses the boundary. The transaction is the central node with type stages out to its user and its merchant, plus a five-hop follows chain back to its own recent history. Because months never connect, there's no path for information to leak from one split

  19. 8:59

    into another.

  20. 9:02

    Four properties fall out of that construction. No future leakage. A transaction only ever aggregates neighbors with an earlier timestamp. No train val test leakage because of the disjoined month. No label leakage. The fraud flag is the target, never a feature or an edge. And no distribution leakage. Every scalar and vocabulary is fit on training month only, then frozen. Four for four, verified by construction,

  21. 9:32

    not by post-hoc audit.

  22. 9:37

    One more decision before the architecture. Two hundred two model features across three node types. Seventy-three on the user, a hundred and nine on the transaction, twenty on the merchant. Thirty-two of the transactional features are derived, purpose-built for fraud, added in three waves. Ten entity history features, past transaction count, days since last activity, the mean standard

  23. 10:06

    deviation, and max of the last five amounts. A behavioral baseline per user and merchant. Eight risk aggregates, an amount Z-score against that history, a recent versus past ratio, transactions per day. These flag deviation from the entity's own baseline, not some global threshold. And fourteen true rolling window velocity and temporal features. Five-minute,

  24. 10:36

    one-hour, and twenty-four-hour, uh, transactional counts and amounts, distinct counterparties in the last day, seconds since the last transaction, even a country change rate for impossible travel patterns. Why this matters? The graph tells the model who a transaction is connected to. These derived features tell it how that entity is behaving differently from its own normal. Complementary signals, not redundant

  25. 11:07

    ones.

  26. 11:09

    Under the hood, this is GraphSAGE architecture. Sample, aggregate, combine, embed. Sampling, a fixed recency bias set of neighbors per hop, so one enormous merchant node can't dominate every message. Aggregate, and here's a detail worth pausing on. We don't just average. We concatenate three order invariant statistics: mean, max, and standard

  27. 11:39

    deviation. Combine that with the node's own vector through learned weights, embed a fixed-length vector to hops. It's inductive. We learn that the aggregator weights not a fixed vector per node, so a brand-new user or merchant gets embedded on the fly, no retraining. Why three statistics instead of one? Let me show you

  28. 12:05

    Picture four neighbors of a transaction. Three look completely normal, scores around zero point one. The fourth is tied to a fraud ring, zero point nine two. Average those four together and you get zero point three two. That ring-linked neighbor just got diluted in, into the crowd. Take the max instead, and it comes through untouched, zero point nine two. That's why we don't

  29. 12:35

    rely on mean alone. A single dangerous neighbor among many genuine ones is exactly the pattern fraud rings create, and mean pooling is precisely the operation that would hide it. The standard deviation adds a third view. How much the neighbor disagree with itself. A uniform boring neighborhood looks nothing like one with a live outlier in it, and this cost us nothing extra at

  30. 13:05

    serving time. No additional learned parameters, still a fixed size output no matter how many neighbors a node has.

  31. 13:16

    One quick hyperparameter note. One twenty-eight dimension is the sweet spot. Sixty-four dimension is close, but slightly underfit. Two fifty-six cost more GPU and gives you nothing back. Validation performance flattens past one twenty-eight and then starts to overfit. It's not a philosophical debate, just a sweet.

  32. 13:43

    Now, the actual numbers side by side. For card-related merchant transactions, best XGBoost gets thirty-six percent true positive rate at a fixed zero point five percent alert rate. GNN plus XGBoost gets forty-eight percent. For thirty-three percent relative lift, five point six million dollars captured at an eighty-three percent capture rate. For online transactions,

  33. 14:14

    forty-eight percent up to sixty-one percent. Twenty-seven percent relative lift, thirty-five point four million dollar captured at seventy-one percent. Online transaction is where most of that sixty-five million dollar savings lives, since it runs at twelve times the fraud rate of card-related merchant transactions.

  34. 14:39

    Third decision, explainability. We ran subgraph attribution across two hundred flagged cases in each channel. Transaction-to-transaction velocity edges carry zero point nine four mean importance in card-related transactions, zero point six two in online transactions, and they are the top piece of evidence in all two hundred card present cases. Merchant edges matter

  35. 15:09

    more in online transactions, zero point one nine versus zero point zero four in card present, where fraud writes the card's own velocity rather than the acceptance point. That's the difference between the model says point nine one, and the model says point nine one because of these three linked transaction in the last forty minutes.

  36. 15:38

    Why does this matter so much, specifically in fraud? Four reasons. One, regulatory and model risk management. Financial institutions operate under frameworks that require documented rationale for automated decision. This isn't optional. Two, analyst trust and investigation speed. An unexplained high score gets rubber-stamped or ignored. Edge-level

  37. 16:08

    evidence turns recompute the case from scratch into verified three linked transactions. Three, model debugging. Attribution patterns show us when the model leans on a spurious or decaying signal before performance visibly drops in production. And four, feedback loop quality. When explanation match what an analyst already suspects, they trust the borderline calls enough to label them

  38. 16:38

    correctly, improving the next round of training data. An accurate black box simply doesn't get used.

  39. 16:47

    Now, the real fight, serving these solution in three milliseconds. Offline, we run a memory-bound GPU-sharded layer-wise GraphSAGE forward pass over the entire graph batched by destination node. So it's numerically identical to a full graph forward, just bounded to a few gigabyte at a time across multiple GPUs. Every user, merchant, and recent transaction

  40. 17:17

    gets its per-layer representation cached in a low-latency embedding store. Each user's last five transaction sit in a ring buffer. Online, at request time, a lightweight assembly step reconstructs the neighbor states straight from that cache. No graph build, no sampling, recency weighted by an exponential decay that reproduces training exactly. Then the real-time

  41. 17:47

    scoring services runs only the new transaction's own two-layer forward from those cached states, plus the XGBoost head. Nothing that scales with graph size runs per request. Three small tricks make it fast in practice. We pin math library thread pools to one before the heavy libraries even load. That alone is the difference between thirty milliseconds and

  42. 18:16

    one. We warm the model up at startup, so the first real request isn't slow. And today, it's a single in-memory process. The same interface maps directly into a distributed cache when we need to scale out.

  43. 18:34

    Now, there's a catch. That trick requires caching a representation for every node, including every transaction. At production scale, that's sixty gigabyte, and it needs expensive high memory serving. With a one-day embedding lag in real-time, true positive rate actually drops from forty-eight to forty-four percent. The fix, predict on the edge, not the node. Precompute

  44. 19:04

    embeddings for user and merchants only, never per transaction. That collapses the footprint to two to three gigabytes, about twenty times smaller, cheap enough to run on the same CPU class as the XGBoost model it sits beside. Nvidia independently recommended the same approach and expects it to perform on par with the n-node model. Here's the actual request path. Pre-processing, cache

  45. 19:34

    lookup, and the XGBoost head are all fractions of a millisecond. The GNN's own true two-layer forward is the biggest single piece at one point six one millisecond. End-to-end, two point three millisecond at the median, three point one at P99, comfortably inside our three-to-four millisecond SLA. If we ever need more headroom, that GNN forward is the first thing

  46. 20:04

    we would recompile or quantize.

  47. 20:16

    Thank you for watching. We are both happy to go deeper, sampling, graph construction, explainability, or serving. Reach out anytime. Thank you.