В этом руководстве мы покажем, как симулировать систему обнаружения мошенничества с сохранением конфиденциальности, используя федеративное обучение без тяжёлых фреймворков или сложной инфраструктуры. Мы создадим простую, оптимизированную для CPU настройку, которая имитирует десять независимых банков, каждый из которых обучает локальную модель обнаружения мошенничества на своих собственных несбалансированных данных транзакций.
Настройка среды выполнения и импорт библиотек
Мы устанавливаем среду выполнения и импортируем все необходимые библиотеки для генерации данных, моделирования, оценки и отчётности. Мы также фиксируем случайные начальные значения и конфигурацию устройства, чтобы обеспечить детерминированность и воспроизводимость нашей федеративной симуляции на CPU.
«`python
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.modelselection import traintest_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import rocaucscore, averageprecisionscore, 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:», DEVICE)
«`
Генерация данных
Мы генерируем сильно несбалансированный набор данных, похожий на данные о мошенничестве с кредитными картами, и разделяем его на обучающие и тестовые наборы. Мы стандартизируем данные на стороне сервера и готовим глобальный тестовый загрузчик, который позволяет нам последовательно оценивать агрегированную модель после каждого федеративного раунда.
«`python
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)
Xtrainfull, Xtest, ytrainfull, ytest = traintestsplit(
X, y, testsize=0.2, stratify=y, randomstate=SEED
)
server_scaler = StandardScaler()
Xtrainfulls = serverscaler.fittransform(Xtrain_full).astype(np.float32)
Xtests = serverscaler.transform(Xtest).astype(np.float32)
test_loader = DataLoader(
TensorDataset(torch.fromnumpy(Xtests), torch.fromnumpy(y_test)),
batch_size=1024,
shuffle=False
)
«`
Дирихле-разбиение данных
Мы моделируем реалистичное не-IID поведение, разбивая обучающие данные на десять клиентов с помощью распределения Дирихле. Затем мы создаём независимые загрузчики на уровне клиента, обеспечивая работу каждого симулированного банка с собственными локально масштабированными данными.
«`python
def dirichletpartition(y, nclients=10, alpha=0.35):
classes = np.unique(y)
idxbyclass = [np.where(y == c)[0] for c in classes]
clientidxs = [[] for in range(n_clients)]
for idxs in idxbyclass:
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]
NUM_CLIENTS = 10
clientidxs = dirichletpartition(ytrainfull, NUM_CLIENTS, 0.35)
«`
Определение модели
Мы определяем нейронную сеть, используемую для обнаружения мошенничества, а также служебные функции для обучения, оценки и обмена весами. Мы реализуем лёгкие локальные оптимизации и вычисление метрик, чтобы поддерживать эффективность и простоту рассуждений на стороне клиента.
«`python
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. Мы оцениваем глобальную модель после каждого раунда, чтобы отслеживать сходимость и понимать, как коллективное обучение улучшает производительность обнаружения мошенничества.
«`python
def fedavg(weights, sizes):
total = sum(sizes)
return [
sum(w[i] * (s / total) for w, s in zip(weights, sizes))
for i in range(len(weights[0]))
]
ROUNDS = 10
LR = 5e-4
globalmodel = FraudNet(Xtrain_full.shape[1])
globalweights = getweights(global_model)
for r in range(1, ROUNDS + 1):
clientweights, clientsizes = [], []
for cid in range(NUM_CLIENTS):
local = FraudNet(Xtrainfull.shape[1])
setweights(local, globalweights)
trainlocal(local, clientloaders[cid][0], LR)
clientweights.append(getweights(local))
clientsizes.append(len(clientloaders[cid][0].dataset))
globalweights = fedavg(clientweights, client_sizes)
setweights(globalmodel, global_weights)
metrics = evaluate(globalmodel, testloader)
print(f»Round {r}: {metrics}»)
«`
Генерация отчёта о рисках мошенничества
Мы преобразуем технические результаты в краткий аналитический отчёт с помощью внешней языковой модели. Мы безопасно принимаем API-ключ с клавиатуры и генерируем ориентированные на принятие решений инсайты, которые суммируют производительность, риски и рекомендуемые следующие шаги.
«`python
OPENAIAPIKEY = getpass.getpass(«Enter OPENAIAPIKEY (input hidden): «).strip()
if OPENAIAPIKEY:
os.environ[«OPENAIAPIKEY»] = OPENAIAPIKEY
client = OpenAI()
summary = {
«rounds»: ROUNDS,
«numclients»: NUMCLIENTS,
«final_metrics»: metrics,
«clientsizes»: [len(clientloaders[c][0].dataset) for c in range(NUM_CLIENTS)],
«clientfraudrates»: [float(clientdata[c][1].mean()) for c in range(NUMCLIENTS)]
}
prompt = (
«Write a concise internal fraud-risk report.\n»
«Include executive summary, metric interpretation, risks, and next steps.\n\n»
+ json.dumps(summary, indent=2)
)
resp = client.responses.create(model=»gpt-5.2″, input=prompt)
print(resp.output_text)
«`
В заключение мы показали, как реализовать федеративное обучение с нуля в записной книжке Colab, оставаясь при этом стабильным, интерпретируемым и реалистичным. Мы наблюдали, как экстремальная неоднородность данных на стороне клиентов влияет на сходимость и почему тщательная агрегация и оценка имеют решающее значение в условиях обнаружения мошенничества. Мы также расширили рабочий процесс, сгенерировав автоматизированный отчёт для группы риска, продемонстрировав, как аналитические результаты могут быть преобразованы в готовые к принятию решения инсайты.
1. Какие методы используются для генерации несбалансированных данных, имитирующих транзакции с мошенничеством?
В статье используется метод `make_classification` из библиотеки `sklearn.datasets` для генерации сильно несбалансированного набора данных, похожего на данные о мошенничестве с кредитными картами.
2. Как обеспечивается конфиденциальность данных при использовании федеративного обучения?
Каждый из десяти симулированных банков обучает локальную модель обнаружения мошенничества на своих собственных данных. При этом данные не передаются централизованно, что позволяет сохранить конфиденциальность.
3. Какие метрики используются для оценки производительности модели обнаружения мошенничества?
Для оценки производительности модели используются следующие метрики:
* ROC AUC (площадь под кривой ошибок);
* средняя точность (average precision score);
* точность (accuracy score).
4. Какие преимущества даёт использование федеративного обучения для обнаружения мошенничества?
Федеративное обучение позволяет:
* обучать модель на распределённых данных без необходимости их централизованного сбора;
* сохранять конфиденциальность данных каждого клиента;
* улучшать производительность обнаружения мошенничества за счёт коллективного обучения.
5. Какие вызовы могут возникнуть при использовании федеративного обучения для обнаружения мошенничества и как они решаются в статье?
В статье решается проблема экстремальной неоднородности данных на стороне клиентов. Для этого используется распределение Дирихле для моделирования реалистичного не-IID поведения и разбиения обучающих данных на десять клиентов. Тщательная агрегация и оценка параметров локальных моделей также имеют решающее значение для обеспечения сходимости и улучшения производительности обнаружения мошенничества.