Разработка GNN для детекции мошенничества в графе транзакций
Транзакции — по природе реляционные: каждая транзакция связывает отправителя и получателя. Граф транзакций несёт информацию, которую табличные модели не видят. GNN (Graph Neural Networks) эксплуатируют эту структуру напрямую.
Почему GNN для антифрода
Классические подходы (GBM, логистическая регрессия) работают с признаками отдельной транзакции. Но мошенники действуют в сети: кардеры работают через посредников, money mule сети структурированы иерархически, синдикаты координируют активность.
Пример: мошенническая транзакция, изолированно рассматриваемая, ничем не отличается от легитимной (сумма нормальная, время нормальное, merchant нормальный). Но если посмотреть на 2-hop neighbourhood — соседние узлы являются известными мошенниками. GNN захватывает этот сигнал автоматически.
Архитектура GNN для fraud detection
Построение графа
Узлы: карты, аккаунты, merchants, IP-адреса, устройства. Рёбра: транзакции + связи между сущностями (shared device, shared IP).
Гетерогенный граф (heterogeneous graph): разные типы узлов и рёбер. Требует Heterogeneous GNN (HAN, RGCN) или Knowledge Graph подходов.
Message Passing
Ядро GNN — итерационный обмен информацией между соседними узлами:
import torch
from torch_geometric.nn import SAGEConv, GATConv, HeteroConv
from torch_geometric.data import HeteroData
class FraudGNN(torch.nn.Module):
def __init__(self, in_channels, hidden_channels, out_channels):
super().__init__()
self.conv1 = HeteroConv({
('card', 'transacts', 'merchant'): SAGEConv(in_channels, hidden_channels),
('card', 'shares_device', 'card'): GATConv(in_channels, hidden_channels, heads=4),
('merchant', 'receives', 'card'): SAGEConv(in_channels, hidden_channels),
}, aggr='sum')
self.conv2 = HeteroConv({...})
self.classifier = torch.nn.Linear(hidden_channels, 2)
def forward(self, x_dict, edge_index_dict):
x_dict = self.conv1(x_dict, edge_index_dict)
x_dict = {key: F.relu(x) for key, x in x_dict.items()}
x_dict = self.conv2(x_dict, edge_index_dict)
return self.classifier(x_dict['card'])
Temporal GNN
Транзакции имеют временные метки — важно учитывать: паттерн "normal behaviour сегодня" может быть аномалией три месяца назад. TGN (Temporal Graph Networks) с memory modules для хранения истории каждого узла.
Работа с дисбалансом классов
Фрод — 0.1–1% транзакций. Специфичные техники для графовых данных:
- GraphSMOTE: oversample minority class в embedding space, генерируя новые узлы
- Class-weighted loss: inversely proportional to class frequency
- Imbalanced sampling: при mini-batch sampling включать пропорционально больше positive examples
Производительность в production
Проблема: inference GNN требует neighborhood lookup — при каждом запросе нужно загружать N-hop neighbourhood из БД. Для real-time сценариев (payment authorization):
Stale feature caching: pre-computed node embeddings обновляются каждые N минут, inference — instant lookup.
Mini-batch inference: для batch scoring (e.g., EOD reconciliation) — полный граф processing.
Approximate neighbourhood: для latency-sensitive scenarios — ограничение глубины до 2 hops, sampling соседей.
Latency P99:
- Stale embeddings: <10ms
- Full 2-hop inference: 50–200ms
- Full 3-hop inference: 500ms–2s
Сравнение с baseline
| Метод | AUC-ROC | Precision@5% | F1 |
|---|---|---|---|
| Logistic Regression | 0.76 | 0.31 | 0.41 |
| XGBoost (tabular) | 0.87 | 0.52 | 0.58 |
| GNN (2-hop) | 0.93 | 0.71 | 0.69 |
| GNN + temporal | 0.95 | 0.78 | 0.74 |
Gain от GNN наиболее значителен для organized fraud (networks, syndicates) — именно там граф-информация наиболее ценна.
Explainability
GNN-объяснения через GNNExplainer / Attention weights (GAT). Для каждой флагированной транзакции: какие соседние узлы и рёбра наиболее влияли на решение. Необходимо для compliance и ручных reviews.







