Alert Escalation Casebook
Alert Escalation Casebook
Fintech track · Team E4E01139 · train / test alerts

Escalation hides in relative amounts

We explored 10 million transactions behind 20,000 monitoring alerts. The clearest escalation signal is a customer whose cash moves at high amounts compared with their own bank transfers. Raw amounts hide it, because every customer has a different scale.

Cross-validated ROC-AUC
Transactions explored
Escalation rate
Hypotheses tested
30+

Escalation rate by the cash-vs-bank contrast

Alerts in ten equal groups, lowest to highest mean(cash in) − mean(bank out), measured within each customer.

In 30 seconds

1

Obvious signals don't work. Volume, cash and international share, timing and the final-hour activity are nearly identical for escalated and dismissed alerts.

2

Relative amounts do. Cash that is large compared with the same customer's bank transfers is the strongest escalation marker in the data.

3

It helps triage. Reviewing the riskiest 30% of alerts first catches of escalations, as many as a random order.

§1 · Approach

Turn each alert's history into a profile, then rank

Each alert owns hundreds of transaction rows, but a model needs one row per alert. Most of the work is deciding how to summarize a customer's history so that escalated and dismissed alerts separate.

We explored first, built features for every pattern the exploration suggested, and kept only what improved cross-validated AUC. We built two models on different feature sets; both reached the same conclusion, and the submission averages them.

§2 · Dataset

20,000 alerts and the 10 million transactions behind them

Train alerts
Test alerts
Transactions
Median per alert
History window
180days
ColumnMeaningValues
signal_idAlert identifier, links alerts to transactionsSG_000001 …
signal_sanasiAlert date
eskalatsiyaTarget: 1 escalated, 0 dismissedtrain only
tranzaksiya_vaqtiTransaction timestampto the second
kirim_chiqimDirectionkirim (in) · chiqim (out)
tranzaksiya_turiTransaction typekarta (card) · bank_otkazmasi (bank transfer) · naqd (cash) · xalqaro (international)
miqdor_indeksiStandardized transaction size−2.9 to 6.7, roughly a scaled log amount

Quality checks

  • No missing values or duplicates; every alert has transactions.
  • Train and test alert IDs don't overlap.
  • Every alert has 180 days of history up to its alert date and nothing from later days. A few rows (0.06%) are stamped on the alert date itself; they are equally common for escalated and dismissed alerts (17.4% vs 17.1% escalation), so they carry no signal. Model A keeps them and Model B drops them.
  • Train and test look alike: a classifier trying to tell them apart scores 0.49 AUC (chance).
  • No shortcuts: IDs, dates, timestamps and shared transactions carry no signal (≈ 0.50 AUC).

Transaction mix by type and direction

All train transactions, in millions.

kirim (in)chiqim (out)
76% of transactions are incoming. Cash is 6% and international 0.5% of rows.
§3 · Target

About one alert in six is escalated, steadily over two years

of 14,000 training alerts () were escalated. The classes are imbalanced but not extremely, which is why we measure ranking quality (ROC-AUC) rather than accuracy: always predicting "dismissed" would already be 83% accurate.

Escalation rate by alert quarter

Share of alerts escalated; the dashed line is the overall rate.

The rate stays between 15.8% and 18.9% with no trend, and the alert date predicts nothing (AUC 0.51). So we validate with random stratified folds rather than a time split.
§4 · Transaction history

What 180 days of activity look like

Every history combines a slowly fading stream of everyday activity with a pile-up of transactions in the last minutes before midnight on the day before the alert.

Transactions per alert, by day before the alert

Average transactions per alert per day, days 180 → 2. The final day is left out because its pile-up dwarfs the scale.

DismissedEscalated
Activity thins out as the alert approaches. Escalated customers transact about 6% more throughout, a consistent but weak difference (count AUC 0.53).

The final hour before the alert

Average transactions per alert in each hour before the alert (log scale).

DismissedEscalated
About 39 transactions land in the last hour against 0.04 in an ordinary hour, and the two classes are almost identical (AUC 0.51).

Hour of day

Share of transactions by clock hour.

of all transactions are stamped 23:57–23:59, across every channel. It looks like an end-of-day timestamp clamp in the data rather than customer behavior. Outside it, activity is flat at 4.2% per hour.

Incoming vs outgoing

Average per alert, by outcome.

DismissedEscalated
Escalated customers make slightly more transactions in both directions, but smaller ones. The size gap is widest for outgoing money.

Transaction size by type

Density of miqdor_indeksi.

kartabanknaqdxalqaro
Each type has its own size range: card smallest, then bank and cash, with international the largest.

Every customer has their own scale

Alerts by the average miqdor_indeksi of their own transactions.

Customer averages spread over ±1 unit, as wide as the gap between transaction types. Any raw amount comparison between customers is dominated by this scale. That observation led directly to our key feature family (§5).
§5 · Escalated vs dismissed

Simple behaviours barely differ. Relative amounts do.

We compared escalated and dismissed alerts on every obvious behaviour first. None of them separates the classes well, so we looked inside each customer's own profile.

How escalated alerts differ on simple behaviours

Escalated average relative to dismissed average (percent difference). Hover for values and single-feature AUC.

The largest differences are a few percent, and the best single-feature AUC is 0.55 (largest amount, lower for escalated). Volume, cash share, international share and the final-hour activity are nearly identical.

Behavioral fingerprint: raw vs within-customer amounts

Standardized difference (escalated − dismissed) of each alert's average amount per direction × type. Relative means minus that customer's overall average.

Raw amountRelative to customer
Raw amounts are lower for escalated alerts almost everywhere: they are simply smaller customers. Once each customer's scale is removed, cash-in and card flip to higher while bank transfers stay clearly lower. Escalation is about the mix of amounts, not their size.

Escalated customers move cash in at high amounts relative to their own bank transfers. Measured within the customer, this contrast is the strongest single predictor in the data.

cash-in vs bank-out = mean(miqdor | kirim, naqd) − mean(miqdor | chiqim, bank_otkazmasi) cash vs bank score = [mean(naqd) − mean(karta)] − [mean(bank_otkazmasi) − mean(karta)]

Escalation rate by feature decile

Alerts in ten equal groups by each feature. Dashed line: overall rate, 17.2%.

The raw feature spans 11–23%. The within-customer contrast spans 10–27% and rises almost steadily from the lowest group to the highest.
§6 · Features motivated by the EDA

From observation to feature

What we sawFeature family we builtEffect on CV AUC
Customers differ in scale by ±1 unit (§4)Within-customer contrasts: each direction × type average minus the customer's own average or another channel+0.016 · largest gain
Types differ sharply in size and role (§2, §4)Count, share, mean, max and money for each of the 8 direction × type cellscore baseline
Means can hide where amounts clusterPer-cell quantiles, spread, skew; amount histogramssmall, near noise
Behavior might change before an alertStatistics over the last 1h, 6h, 1d, 7d, 30d, 90d vs baseline≈ 0
A pile-up of transactions right before the alert (§4)Final-hour size, duration, gaps, mix, amounts vs history≈ 0
Classic money-laundering patternsSame-day pass-through, in→out chains, gaps, monthly trend≈ 0

Where the model finds its signal

Share of LightGBM split gain by feature family (Model A).

Within-customer contrasts are a third of the features but carry 55% of the gain. Our compact second model (Model B) ranks the same kind of feature highest, e.g. "cash-in high end vs the customer's typical amount".
§7 · Model and validation

Two complementary models, one ensemble

Model A (1,084 features)

LightGBM, CatBoost and XGBoost with shallow trees (7 leaves, at least 100 alerts per leaf, strong regularization). 5-fold stratified CV repeated over 5 seeds with early stopping; 25 fold models per algorithm. AUC 0.655.

Model B (201 features)

LightGBM, 7 leaves × 300 trees, on direction × type statistics plus within-customer normalization, averaged over 5 seeds. AUC 0.653. The two agree on about 91% of their ranking, so averaging reduces each one's errors.

Cross-validated AUC by step

Out-of-fold ROC-AUC. Axis starts at 0.60.

Within-customer contrasts gave the biggest jump. Averaging the two models adds a stable +0.002 at every mix from 30/70 to 70/30.

Escalation rate by predicted risk

Out-of-fold predictions in ten equal groups. Dashed line: overall rate.

The riskiest tenth escalates at , the safest tenth. Reviewing the top 30% first would catch of escalations.

Validation

  • Out-of-fold scores only: every prediction comes from a model that never saw that alert.
  • Stable: model seeds move the score by ±0.0006, and folds agree within the expected noise.
  • No train/test shift (adversarial AUC 0.49), no transactions from after the alert date, and no identifiers used as features. Model A also includes the alert's month and weekday, which carry no signal on their own (AUC 0.51).
  • Test predictions average 17.3%, matching the training escalation rate of 17.2%.
  • Reproducible: one Jupyter notebook rebuilds the submitted file from the five original competition files (≈ 25 minutes, fixed seeds).
§8 · What it means for the monitoring unit

Review the riskiest alerts first

An AUC is abstract. In practice the model ranks the day's alerts so that specialists see the most likely escalations first. Drag the slider to choose how much of the queue to review.

Escalations caught
In random order
Share escalated among reviewed
Model rankingRandom order
Computed on out-of-fold predictions for the 14,000 training alerts, so every alert was scored by a model that never saw it. The ranking works best at the top of the queue, which is where review time is scarcest.
§9 · How far can it go?

We searched for a hidden pattern and found none

Synthetic data sometimes hides a sharp planted pattern that pushes AUC far above 0.65. In total we tested more than thirty ideas; these are the most important.

HypothesisTestBest AUC
Rare planted transactionsScore each transaction, flag each alert by its most suspicious one0.537
Hidden amount/type/time pocket~200 cells of amount range × type × time before alert0.556
Pass-through / layeringMoney in, ~same amount out within 1–72 hours0.538
Templates or batchesNearest-neighbour alerts; neighbours by ID and date0.506
Timestamp artefactsSeconds, minutes, weekday, end-of-day clamp0.508
Other model typesNeural network over raw transactions; linear and additive models; likelihood ratios0.646

Model AUC by length of customer history

Out-of-fold AUC in five equal groups of alerts, by transactions in the 180 days.

If precision were the limit, alerts with 1,000+ transactions would score much higher. They don't, so a large part of each escalation decision depends on information outside the transaction table. The practical ceiling for this data is around 0.66.
§10 · Conclusion

What we learned

  • The data is clean. Each alert has 180 days of prior history and nothing from later days, and train and test match, so cross-validation is a trustworthy guide.
  • Obvious triggers don't separate the classes. Volume, cash and international share, time of day and the final-hour pile-up look the same for escalated and dismissed alerts.
  • Relative amounts carry the signal. Cash inflows that are large compared with the same customer's bank transfers are the strongest escalation marker. Removing each customer's scale is what makes it visible.
  • Two different models agree. Built on different feature sets, both reached about 0.655 and rely on the same key features. Averaged, they reach , and the riskiest 10% of alerts escalate 3.5× as often as the safest 10%.
  • The ceiling is in the data. We found no leak, template or planted pattern, and accuracy doesn't improve with longer histories. Gains came from better features, not bigger models.

In one sentence: escalation is predicted less by how much money moves than by how a customer's cash compares with their own bank transfers.