<НА ГЛАВНУЮ

Реализация системы детекции мошенничества с защитой конфиденциальности

Симуляция детекции мошенничества с использованием федеративного обучения без громоздких фреймворков.

Обзор

В этом руководстве мы демонстрируем, как симулировать систему детекции мошенничества с защитой конфиденциальности, используя Федеративное Обучение без тяжелых фреймворков или сложной инфраструктуры. Мы создаем чистую, удобную для ЦП архитектуру, имитирующую десять независимых банков, каждый из которых обучает локальную модель по обнаружению мошенничества на собственных сильно несбалансированных данных о транзакциях.

Координация локальных обновлений

Мы координируем эти локальные обновления через простую агрегацию FedAvg, что позволяет нам улучшать глобальную модель, обеспечивая, что ни одна сырая транзакционная информация не покидает клиента. Кроме того, мы интегрируем OpenAI для поддержки анализа после обучения и составления отчетов по рискам, демонстрируя, как результаты федеративного обучения могут быть переведены в готовые для принятия решения рекомендации.

Настройка окружения

Мы настраиваем среду выполнения и импортируем все необходимые библиотеки для генерации данных, моделирования, оценки и отчетности. Мы также фиксируем случайные числа для обеспечения детерминированности симуляции.

!pip -q install torch scikit-learn numpy openai
 
import time, random, json, os, getpass  
import numpy as np  
import torch  
import torch.nn as nn  
from torch.utils.data import DataLoader, TensorDataset  
from sklearn.datasets import make_classification  
from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler  
from sklearn.metrics import roc_auc_score, average_precision_score, accuracy_score  
from openai import OpenAI
SEED = 7  
random.seed(SEED); np.random.seed(SEED); torch.manual_seed(SEED)
DEVICE = torch.device("cpu")  
print("Устройство:", DEVICE)  

Генерация и разделение данных

Мы генерируем сильно несбалансированный набор данных, похожий на данные по кредитным картам, и разделяем его на обучающую и тестовую выборки. Мы стандартизируем данные на сервере и подготавливаем глобальный тестовый загрузчик для оценки агрегированной модели после каждого раунда федеративного обучения.

X, y = make_classification(
   n_samples=60000,  
   n_features=30,  
   n_informative=18,  
   n_redundant=8,  
   weights=[0.985, 0.015],  
   class_sep=1.5,  
   flip_y=0.01,  
   random_state=SEED
)
X = X.astype(np.float32)  
y = y.astype(np.int64)
X_train_full, X_test, y_train_full, y_test = train_test_split(
   X, y, test_size=0.2, stratify=y, random_state=SEED
)
server_scaler = StandardScaler()
X_train_full_s = server_scaler.fit_transform(X_train_full).astype(np.float32)
X_test_s = server_scaler.transform(X_test).astype(np.float32)
test_loader = DataLoader(
   TensorDataset(torch.from_numpy(X_test_s), torch.from_numpy(y_test)),  
   batch_size=1024,  
   shuffle=False
)

Симуляция поведения Non-IID

Мы симулируем реалистичное поведение неIID за счет разбиения обучающих данных по десяти клиентам, используя распределение Дирихле. Каждый симулируемый банк работает с собственными локально масштабированными данными.

def dirichlet_partition(y, n_clients=10, alpha=0.35):  
   classes = np.unique(y)  
   idx_by_class = [np.where(y == c)[0] for c in classes]  
   client_idxs = [[] for _ in range(n_clients)]  
   for idxs in idx_by_class:  
       np.random.shuffle(idxs)  
       props = np.random.dirichlet(alpha * np.ones(n_clients))  
       cuts = (np.cumsum(props) * len(idxs)).astype(int)  
       prev = 0  
       for cid, cut in enumerate(cuts):  
           client_idxs[cid].extend(idxs[prev:cut].tolist())  
           prev = cut  
   return [np.array(ci, dtype=np.int64) for ci in client_idxs]

Определение и обучение модели

Мы определяем нейросеть, используемую для обнаружения мошенничества, вместе с утилитами для обучения и оценки. Локальная оптимизация обеспечивает эффективные обновления клиентских моделей.

class FraudNet(nn.Module):
   def __init__(self, in_dim):  
       super().__init__()
       self.net = nn.Sequential(
           nn.Linear(in_dim, 64),  
           nn.ReLU(),  
           nn.Dropout(0.1),  
           nn.Linear(64, 32),  
           nn.ReLU(),  
           nn.Dropout(0.1),  
           nn.Linear(32, 1)
       )
   def forward(self, x):
       return self.net(x).squeeze(-1)

Процесс Федеративного Обучения

Мы организуем процесс федеративного обучения, итеративно обучая локальные модели клиентов и агрегируя их параметры с помощью FedAvg, оценивая глобальную модель после каждого раунда.

for r in range(1, ROUNDS + 1):
   client_weights, client_sizes = [], []
   for cid in range(NUM_CLIENTS):
       local = FraudNet(X_train_full.shape[1])
       set_weights(local, global_weights)
       train_local(local, client_loaders[cid][0], LR)
       client_weights.append(get_weights(local))
       client_sizes.append(len(client_loaders[cid][0].dataset))
   global_weights = fedavg(client_weights, client_sizes)
   set_weights(global_model, global_weights)
   metrics = evaluate(global_model, test_loader)
   print(f"Раунд {r}: {metrics}")

Генерация отчетов о рисках с OpenAI

Мы преобразуем результаты в сжатые аналитические отчеты с помощью OpenAI. Результаты резюмируют производительность, риски и рекомендованные следующие шаги для поддержки принятия решений.

if OPENAI_API_KEY:
   os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY
   client = OpenAI()
   resp = client.responses.create(model="gpt-5.2", input=prompt)
   print(resp.output_text)

Таким образом, мы продемонстрировали надежный метод реализации федеративного обнаружения мошенничества, который является одновременно конфиденциальным и применимым в реальных сценариях.

🇬🇧

Switch Language

Read this article in English

Switch to English