Features and Feature Stores — Where Fraud ML Is Actually Won

Ask practitioners where fraud detection quality comes from and the answer is uniform: not the model — the features. Velocities, histories, graph signals, and their freshness carry the signal; the model just reads it. And ask where production fraud ML fails and the answer is equally uniform: the gap between how features were computed in training and how they're computed at serving time. This post covers both — the feature families that catch fraud, and the feature-store discipline that keeps them honest.

Post 2 chose the engines; this post builds their fuel system — the infrastructure layer that is, in practice, most of a fraud platform’s engineering.

The feature families that carry the signal

Point-in-time correctness: the silent killer

Training features have a property serving can’t violate: each training row must contain the feature values as they were at that transaction’s moment — not as they are now. Compute “cards per device, last 24h” from today’s data for a six-month-old training transaction and the feature includes the future — often including the fraud outcome itself laundered through a velocity count. The model trains brilliantly, validates brilliantly, and collapses in production, because in production the future is unavailable. This is label leakage via feature time-travel, and it is the most common serious failure in applied fraud ML. The defense is architectural, not vigilant: features are defined once with explicit event-time semantics, training sets are built by point-in-time joins (as-of lookups against feature history, never against current state), and the same definition drives both paths — which is precisely the job description of a feature store.

The feature store: one definition, two speeds

The feature store pattern — the infrastructure fraud teams built before the industry named it — solves training/serving skew by construction: declare each feature once (entity, aggregation, window, event-time source); the platform materializes it twice — an offline path (batch, over history, supporting as-of joins for training) and an online path (streaming, serving current values in single-digit milliseconds from a hot key-value tier) — from the same definition, so skew becomes a platform bug rather than a per-feature recurring accident. The remaining engineering is honesty between the paths: parity checks continuously compare online values against offline recomputation (the shadow-read discipline of zdm-04, applied to features); freshness SLOs per feature make staleness visible (a velocity feature’s value is its freshness); and feature lifecycle — versioned definitions, owners, usage tracking, deprecation — because feature sprawl has the same sediment dynamics as rule sprawl, with the added cost that every serving-path feature spends milliseconds of post 1’s budget. Features are the asset; the store is what keeps the asset from quietly becoming fiction.

The takeaway: fraud signal lives in features — second-fresh velocities (streaming aggregates with metering-grade discipline), entity histories, precomputed graph neighborhoods, and composed upstream scores — and fraud ML’s characteristic failure lives in training/serving skew, above all feature time-travel leaking the future into training rows. The cure is the feature store pattern: single event-time definitions materialized offline (as-of joins) and online (millisecond serving) from the same source, held honest by parity checks, freshness SLOs, and lifecycle discipline. Win the features and the model is easy; lose point-in-time correctness and no model can save you.

Key takeaways

Further reading

Sources & References