新闻详情

新闻详情

首页 / 资讯中心 / 详情

联邦学习信用卡欺诈检测:FedAvg与SMOTE实战指南

发布时间:2026/9/28 8:46:36来源:尧图网络
联邦学习信用卡欺诈检测:FedAvg与SMOTE实战指南
简介这份资源面向计算机、人工智能等专业的在校学生与算法学习者提供一套基于FedAvg联邦学习算法结合SMOTE过采样优化信用卡欺诈交易检测的完整Python项目源码。项目通过构建Server与Clients对象模拟真实场景下服务器与节点间的双向参数传递在保障数据隐私、避免银行间数据共享的前提下提升欺诈检测效果适合作为毕设、课程设计或算法进阶练习。压缩包共8个文件约43.14MB包含5个py源码文件、1个md说明文档、1个png流程图与1个csv数据集分别对应模型定义、服务端与客户端逻辑、数据处理及运行说明。目前已有173人学习。代码均经测试运行成功答辩评审平均分达96分读者可据此理解联邦学习与过采样结合的完整实现思路并在此基础上修改扩展功能。1. 联邦信用卡欺诈检测里FedAvg 加 SMOTE 到底在解决什么信用卡欺诈检测是个典型的极端不平衡二分类问题。真实交易流水里欺诈样本占比通常只有千分之几甚至更低而联邦学习场景下这个问题会更棘手数据分散在多家银行或支付机构手里谁也不能把原始交易明细拿出来共享只能交换模型参数或梯度。FedAvg 作为最经典的联邦聚合算法让各方在本地训练、中心聚合权重天然契合这种合规约束。但把 FedAvg 直接套到欺诈检测上很多人第一次跑完就发现召回率低得离谱——模型几乎把所有样本都判成正常交易。原因不复杂本地数据本身极度不平衡FedAvg 又只是对各方权重做加权平均少数类的梯度信号在平均过程中被进一步稀释。这时候 SMOTE 过采样就派上用场了它在本地训练前对少数类做合成插值把欺诈样本造到合理比例让每个客户端的本地模型先能学到欺诈模式再拿去聚合。这套组合的价值在于既守住了数据不出域的底线又把不平衡带来的召回塌陷补了回来。适合正在做风控建模、联邦学习落地或者被数据不能共享但模型要准卡住的工程师。下面从原理到代码把这条路走通。2. FedAvg 与 SMOTE 的协作机制为什么不能简单叠加2.1 FedAvg 的聚合逻辑与不平衡数据的冲突FedAvg 的核心是每轮通信里各客户端用本地数据跑若干 epoch 得到权重更新服务端按样本量加权平均w_global Σ (n_k / n) * w_k其中 n_k 是第 k 个客户端的样本数n 是总样本数。这个公式隐含一个假设各方数据分布大致同构且各类别贡献均衡。欺诈检测里这个假设直接崩掉——某家银行可能一万条里只有三条欺诈它的本地梯度几乎全被正常样本主导聚合时这点微弱的欺诈信号又被其他客户端平均掉。跑十几轮下来全局模型对少数类的敏感度趋近于零。更麻烦的是客户端漂移。不同机构的欺诈手法、客群、交易渠道差异很大本地模型各自偏向自己的数据分布FedAvg 一平均反而把各自的专长抹平了。这不是调几个超参能解决的得从数据层面先动手。2.2 SMOTE 在本地客户端怎么插值少数类SMOTE 的思路是对每个少数类样本找它的 k 个最近邻少数类样本在两者连线上随机取一点作为新样本x_new x_i λ * (x_j - x_i), λ ∈ [0,1]放到联邦场景SMOTE 必须严格在本地执行绝不能把合成样本或原始少数类样本传到服务端否则就破坏了联邦的隐私前提。每个客户端独立对自己的欺诈样本做过采样合成到某个目标比例后再参与本地训练。这样本地模型先看见足够多的欺诈模式梯度里少数类的分量才不会被淹没。关键参数有三个k 近邻数、采样比例、以及是否配合欠采样。k 一般取 5太小合成样本多样性不足太大容易跨越类别边界造出噪声点。采样比例不建议直接 1:1欺诈检测里把少数类补到占总样本 10%~30% 往往比完全平衡更稳因为过度合成会引入大量边界模糊的伪样本反而拉低精确率。2.3 先 SMOTE 还是先划分训练测试集这是血泪经验里最常见的一个翻车点。很多人图省事先对全量数据 SMOTE 再切分训练测试集结果测试集里混进了合成样本评估指标虚高得离谱上线就露馅。正确顺序永远是先按时间或随机切分训练集和测试集只在训练集上做 SMOTE测试集保持原始不平衡分布。联邦场景下还要多一层每个客户端各自切分自己的训练测试集测试集同样不做过采样这样聚合后的全局模型评估才可信。3. 用 Python 跑通 FedAvg SMOTE 的最小实现3.1 环境准备与依赖安装先把环境搭起来。Python 建议 3.8 以上核心依赖是 numpy、pandas、scikit-learn、imbalanced-learn提供 SMOTE、torch 或 tensorflow 二选一。用 conda 或 venv 都行这里给 pip 的装法# 创建虚拟环境避免污染全局 python -m venv fed_env source fed_env/bin/activate # Windows 用 fed_env\Scripts\activate # 安装核心依赖 pip install numpy pandas scikit-learn imbalanced-learn pip install torch torchvision # 用 PyTorch 做本地模型装完可以用python -c import imblearn; print(imblearn.__version__)验证一下。如果公司网络受限提前配好内网镜像源别在装包上耗时间。vscode 或 pycharm 里把解释器指到这个虚拟环境后面调试方便。3.2 构造非独立同分布的联邦数据划分真实场景拿不到多家银行的数据我们用公开的信用卡欺诈数据集如 Kaggle 的 creditcard.csv模拟。为了贴近联邦的非独立同分布特性按标签和特征做偏斜划分让每个客户端的数据分布不一样import numpy as np import pandas as pd from sklearn.model_selection import train_test_split def split_federated_data(df, n_clients5, test_size0.2, seed42): 把数据切成 n_clients 份模拟非独立同分布的联邦场景 rng np.random.default_rng(seed) # 先切出全局测试集测试集绝不参与过采样 train_df, test_df train_test_split( df, test_sizetest_size, stratifydf[Class], random_stateseed ) # 按欺诈样本比例给客户端排序制造分布差异 client_data [] fraud train_df[train_df[Class] 1].sample(frac1, random_stateseed) normal train_df[train_df[Class] 0].sample(frac1, random_stateseed) fraud_splits np.array_split(fraud, n_clients) normal_splits np.array_split(normal, n_clients) for i in range(n_clients): part pd.concat([fraud_splits[i], normal_splits[i]]) client_data.append(part.sample(frac1, random_stateseed).reset_index(dropTrue)) return client_data, test_df这段代码的关键在stratify保证切分时类别比例一致以及把欺诈样本和正常样本分别拆分再组合让每个客户端的欺诈占比不同。参数n_clients控制客户端数量一般 5 到 10 个足够验证算法test_size留 20% 做全局评估。注意测试集是从原始数据切的没有经过任何过采样这是评估可信度的底线。3.3 本地 SMOTE 过采样与模型训练每个客户端拿到自己的数据后先在训练集上做 SMOTE再喂给本地模型。这里用逻辑回归做演示换成神经网络只需替换模型部分from imblearn.over_sampling import SMOTE from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler def local_train(client_df, global_weightsNone, sampling_ratio0.3, k_neighbors5): 单个客户端的本地训练SMOTE 过采样 逻辑回归 X client_df.drop(columns[Class]).values y client_df[Class].values # 标准化SMOTE 对特征尺度敏感必须先做 scaler StandardScaler() X scaler.fit_transform(X) # 计算目标少数类数量sampling_ratio 控制合成后少数类占比 n_majority (y 0).sum() n_minority (y 1).sum() target_minority int(n_majority * sampling_ratio / (1 - sampling_ratio)) if n_minority 2: return None, scaler # 少数类太少无法插值跳过该客户端 smote SMOTE( sampling_strategy{1: max(target_minority, n_minority)}, k_neighborsmin(k_neighbors, n_minority - 1), random_state42 ) X_res, y_res smote.fit_resample(X, y) model LogisticRegression(max_iter1000) if global_weights is not None: model.coef_ global_weights[coef].copy() model.intercept_ global_weights[intercept].copy() model.classes_ np.array([0, 1]) model.fit(X_res, y_res) return {coef: model.coef_, intercept: model.intercept_}, scaler逻辑说明sampling_ratio是合成后少数类占总样本的目标比例设 0.3 意味着欺诈样本补到 30%比 1:1 更稳。k_neighbors要动态取min(5, n_minority-1)否则少数类样本不足 6 个时 SMOTE 会直接报错。标准化必须在 SMOTE 之前因为 SMOTE 用欧氏距离找近邻特征尺度不统一会让距离失真。返回的scaler要保存下来测试时用同一个 scaler 变换不能重新 fit。3.4 服务端 FedAvg 聚合与全局评估服务端负责收集各客户端权重按样本量加权平均然后下发下一轮def fedavg_aggregate(client_results): 按样本量加权平均各客户端权重 total sum(r[n_samples] for r in client_results) coef sum(r[weights][coef] * r[n_samples] for r in client_results) / total intercept sum(r[weights][intercept] * r[n_samples] for r in client_results) / total return {coef: coef, intercept: intercept} def evaluate_global(weights, test_df, scaler): 在原始不平衡测试集上评估重点看召回率和 AUC from sklearn.metrics import recall_score, roc_auc_score, precision_score X scaler.transform(test_df.drop(columns[Class]).values) y test_df[Class].values model LogisticRegression() model.coef_ weights[coef] model.intercept_ weights[intercept] model.classes_ np.array([0, 1]) pred model.predict(X) prob model.predict_proba(X)[:, 1] return { recall: recall_score(y, pred), precision: precision_score(y, pred), auc: roc_auc_score(y, prob) }聚合时用n_samples加权是 FedAvg 的标准做法样本多的客户端话语权更大。评估阶段一定要在原始测试集上跑重点盯召回率和 AUC精确率在欺诈场景可以适当让步——漏掉一笔欺诈的代价远高于误判一笔正常交易。跑 10 到 20 轮通信观察全局 AUC 是否稳定上升如果震荡剧烈多半是客户端漂移太严重需要降低本地 epoch 数或引入个性化层。4. 联邦欺诈检测的避坑与排查清单4.1 召回率始终上不去现象训练时损失正常下降但全局模型在测试集上召回率长期低于 0.5几乎不识别欺诈。原因通常是本地 SMOTE 比例太低或者聚合轮数不够少数类信号还没积累起来就被平均掉。解决把sampling_ratio从 0.1 提到 0.3 甚至 0.4同时增加本地 epoch 让模型充分学习合成样本如果还不行检查是不是某些客户端欺诈样本少于 2 个导致 SMOTE 被跳过这类客户端要么合并要么单独处理。4.2 合成样本引入大量噪声现象加了 SMOTE 后精确率暴跌误报率飙升模型把很多正常交易判成欺诈。原因是 k 近邻选得太大合成点跨越了类别边界造出一批落在正常样本区域的伪欺诈样本。解决把k_neighbors降到 3 到 5并检查特征里有没有未标准化的量纲差异大的字段另外可以改用 Borderline-SMOTE 或 ADASYN只对边界附近的少数类样本插值减少噪声。4.3 各客户端评估指标差异巨大现象聚合后的全局模型在客户端 A 上 AUC 0.95在客户端 B 上只有 0.6。这是典型的非独立同分布导致的客户端漂移FedAvg 的全局平均抹平了各方特性。解决不要强求一个全局模型打天下可以在全局模型基础上做几轮本地微调FedAvg 加个性化层或者对差异大的客户端提高本地训练权重数据层面检查是不是某家客户端的欺诈手法和其他家完全不同。4.4 测试集指标虚高现象离线评估 AUC 0.99上线后召回率惨不忍睹。九成是先 SMOTE 再切分测试集合成样本泄漏进了评估集。解决严格保证测试集来自原始数据、不经过任何过采样且联邦场景下测试集要么全局统一要么各客户端独立且不参与训练。评估时同时看召回、精确、AUC 三个指标单看 AUC 容易被不平衡数据骗。4.5 通信轮数增加但指标不涨现象跑到 30 轮以后 AUC 卡住不动甚至轻微下降。原因可能是本地过拟合每轮本地 epoch 太多导致客户端权重偏离全局太远聚合时互相抵消。解决把本地 epoch 从 5 降到 1 到 2或者引入学习率衰减也可以加一个全局学习率聚合时做w_global w_global lr * (w_avg - w_global)的平滑更新缓解震荡。5. 让这套方案真正可用的几个进阶技巧把基础版本跑通只是起点真正上线还得处理几个细节。第一个是类别比例的动态调整不同客户端欺诈占比差异很大固定sampling_ratio会让某些客户端合成过度、某些不足。我一般按客户端自身的多数类数量算目标少数类数让每个客户端合成后比例接近但不强求一致保留分布差异反而有助于全局模型泛化。第二个是评估指标的选择。欺诈检测别只看 AUCAUC 在不平衡数据上偏乐观。建议主看召回率Recall和 PR-AUC平均精确率再配合一个业务指标比如每万笔交易的误报数。下面这张表是我常用的参数起点可以直接抄参数建议值说明n_clients5~10客户端数量太少聚合无意义太多通信开销大sampling_ratio0.2~0.4合成后少数类占比别直接 1:1k_neighbors3~5SMOTE 近邻数少数类少时动态取 minlocal_epoch1~3本地训练轮数太大导致客户端漂移comm_rounds10~30通信轮数看指标收敛情况定batch_size256~1024本地训练批大小第三个是灾难性遗忘。联邦学习多轮聚合后模型可能忘掉早期轮次学到的欺诈模式尤其是欺诈手法随时间演变的场景。常见做法是保留一部分历史欺诈样本做回放或者在聚合时给早期全局权重一个小的保留系数。这个坑在长期运行的系统里特别明显短期实验看不出来。最后一个习惯每次改完参数固定随机种子跑三遍取平均别信单次结果。联邦学习本身随机性就大客户端划分、SMOTE 插值、权重初始化都带随机单次跑出来的高指标大概率是运气。我自己踩过最深的坑就是拿一次 AUC 0.97 的结果去汇报复现时怎么都跑不出来后来发现是那次随机划分恰好把易分的欺诈样本都分到了测试集。固定种子、多次平均、保留原始测试集这三条守住结果才敢信。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱 2026/9/28 9:42:31

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱

快速搭建网站的工具怎么选?3个方案省下5万冤枉钱 网站做好了没人访问,这是很多老板最头疼的事。你花大价钱做的官网,设计精美、功能齐全,但打开一看,流量为零,咨询为零。这时候你才意识到,问题不在“做没做”,而在“怎么快速做出来并推向市场”。面…

阅读更多 →
昇腾910B多机分布式推理:从HCCL到MindIE的DeepSeek部署实践 2026/9/28 9:42:24

昇腾910B多机分布式推理:从HCCL到MindIE的DeepSeek部署实践

昇腾910B上跑DeepSeek多机分布式推理,很多人卡在第一眼:MindIE、HCCL、ranktable、hccn_tool,每个词都眼熟,串起来就不是那么回事。实际踩过一圈之后你会发现,真正决定能不能跑起来的不是模型代码,而是通信…

阅读更多 →
从CANoe到TSMaster:车载总线测试工具链迁移实战指南 2026/9/28 9:42:24

从CANoe到TSMaster:车载总线测试工具链迁移实战指南

搞车载总线测试的工程师,电脑里大概率都装着一套CANoe。我最早接触CANoe是刚入行那会儿,跟着前辈在项目里做网络测试,从报文发送、DBC解析到UDS诊断,基本全是靠Vector这套工具撑起来的。说实话,CANoe确实是这个行业的标…

阅读更多 →
从刷榜到用榜:GitHub Trending 的增量逻辑、项目筛选与高效落地 2026/9/28 9:42:23

从刷榜到用榜:GitHub Trending 的增量逻辑、项目筛选与高效落地

1. 日榜的"热度"到底是怎么算出来的先别急着收藏仓库。每天打开 GitHub 的 Trending 页面,你看到的是过去 24 小时内 Star 增量最高的仓库,周榜和月榜则分别看一周、一个月内的增量。官方没有公开完整排序算法,但用久了会发现&…

阅读更多 →
【Java开发MCP】SSE模式开发并集成MCP:TaoToken统一Key接入与SpringAI WebFlux配置骨架 2026/9/28 9:42:23

【Java开发MCP】SSE模式开发并集成MCP:TaoToken统一Key接入与SpringAI WebFlux配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
OpenCompass 高效评测:Partitioner 任务切分与 Runner 执行后端实战指南 2026/9/28 9:42:23

OpenCompass 高效评测:Partitioner 任务切分与 Runner 执行后端实战指南

模型评测人工智能大模型AI 评测 【免费下载链接】opencompass OpenCompass is an LLM evaluation platform, supporting a wide range of models from OpenAI, Anthropic, Gemini, Qwen, GLM, DeepSeek, etc, across 100 datasets covering knowledge, reasoning, coding, scie…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉