sheryar827/fl-iot-botnet-nbaiot-cic-iot2023
GitHub: sheryar827/fl-iot-botnet-nbaiot-cic-iot2023
该项目比较了三种联邦学习聚合策略在非独立同分布 IoT 流量数据上进行僵尸网络检测的性能与鲁棒性。
Stars: 0 | Forks: 0
# fl-iot-botnet-nbaiot-cic-iot2023
[](https://doi.org/10.5281/zenodo.20456827)
比较 **FedAvg**、**FedProx** 和 **FedTrimmedAvg** 在 **non-IID**
客户端分布下,基于 **N-BaIoT** 和 **CIC-IoT2023** 数据集进行 IoT 僵尸网络
检测的性能。
本代码库伴随一篇网络安全硕士学位论文,研究在客户端数据异构(non-IID,这对于分布式
IoT 部署是现实的)的情况下,联邦聚合策略的选择如何
影响僵尸网络检测的性能。
## 研究问题
在跨客户端的 IoT 流量符合现实的 non-IID 划分下,对于僵尸网络的检测准确率、F1 和收敛速度,鲁棒和近端聚合策略(FedProx、FedTrimmedAvg)与
原始的 FedAvg 相比,以及与中心化性能上界相比,表现如何?
## 数据集
| 数据集 | 来源 | 备注 |
|---|---|---|
| N-BaIoT | UCI Machine Learning Repository | 来自 9 台商用 IoT 设备的网络流量;包含良性 + Mirai/BASHLITE 攻击流量 |
| CIC-IoT2023 | Canadian Institute for Cybersecurity (CIC) | 跨多种攻击类别的大规模 IoT 攻击数据集 |
## 方法
- **聚合策略:** FedAvg、FedProx(近端项 μ)、FedTrimmedAvg(逐坐标截断均值)
- **模型:** MLP 和 CNN 分类器
- **数据划分:**
- IID 基线
- 通过在多个浓度值 α 下进行 Dirichlet 标签划分实现 Non-IID(α 越低 = 偏斜越大)
- **基线:** 每个模型的中心化训练(性能上界)
- **可复现性:** 每种配置在多个随机种子上运行;结果报告为 **mean ± std**
### 实验配置
报告运行中使用的值(来自每个 notebook 中的 `CFG` 块):
| 参数 | 值 |
|---|---|
| 客户端数量 | 9 |
| FL 轮数 | 30 |
| 本地 epoch | 3 |
| Batch size | 512 |
| 学习率 | 1e-3 |
| 测试集比例 | 0.2 |
| 收敛阈值 (F1) | 0.95 |
| 每个攻击类型 CSV 的最大样本数 | 20,000 |
| Dirichlet α 值 | 1.0, 0.5, 0.1 |
| FedProx μ | 0.01 |
| FedTrimmedAvg 截断比例 | 0.1 |
| 随机种子 | 42, 123, 7 (3 个种子) |
每个 (model, seed) 共有 **11 个实验**:1 个中心化基线 + 1 个 IID
FedAvg 基线 + 一个 3×3 的矩阵:{FedAvg, FedProx, FedTrimmedAvg} × {三个
Dirichlet α 值}。
## 代码库结构
```
.
├── FL_IoT_Botnet_NBaIoT_MLP_CNN.ipynb # N-BaIoT experiments
├── FL_IoT_Botnet_CIC_IoT2023_MLP_CNN.ipynb # CIC-IoT2023 experiments
├── fl_nbaiot_results/ # N-BaIoT outputs (CSVs, figures)
├── fl_cic_iot_2023_results/ # CIC-IoT2023 outputs (CSVs, figures)
├── .gitignore
├── LICENSE # MIT
└── README.md
```
## 结果文件
每个结果文件夹包含:
| 文件 | 内容 |
|---|---|
| `csv/all_runs_raw.csv` | 每个 (model, run, seed) 一行:最终/最佳准确率 & F1、收敛轮次 |
| `csv/experiment_summary_mean_std.csv` | 跨种子聚合的人类可读摘要(`mean ± std`) |
| `csv/experiment_summary_numeric.csv` | 相同的聚合结果,数字列用于绘图/分析 |
| `csv/history_*.csv` | 单次运行的每轮准确率/F1 历史记录 |
**阅读摘要:** 在 `experiment_summary_mean_std.csv` 中,`Seeds`
列报告了每行包含多少个种子的结果。`Conv_Round` 是运行
达到其收敛标准时的轮次(越低越快)。
## 结果
所有图表均为 macro-F1 (%),在 3 个种子上的 mean ± std。在两个数据集中使用了相同的超参数,
因此数据集是比较中的唯一变量。
### 核心结论:各策略在 non-IID 下的最佳 F1(最异构的设置,α = 0.1)
| 数据集 | 模型 | FedAvg | FedProx | FedTrimmedAvg |
|---|---|---|---|---|
| N-BaIoT | MLP | 81.27 ± 5.69 | 76.48 ± 6.41 | **83.34 ± 2.78** |
| N-BaIoT | CNN | 78.21 ± 1.46 | 68.69 ± 0.38 | **77.66 ± 3.20** |
| CIC-IoT2023 | MLP | 44.68 ± 7.19 | 50.13 ± 9.07 | **60.86 ± 2.08** |
| CIC-IoT2023 | CNN | 41.66 ± 7.62 | 38.08 ± 10.72 | **56.34 ± 2.15** |
### 对异构性的鲁棒性(F1 从 α = 1.0 降至 α = 0.1)
越小越好 - 它衡量了随着客户端数据
变得更加倾斜,性能损失了多少。
| 数据集 | 模型 | FedAvg | FedProx | FedTrimmedAvg |
|---|---|---|---|---|
| N-BaIoT | MLP | 6.41 pp | 10.84 pp | **4.37 pp** |
| N-BaIoT | CNN | 9.46 pp | 18.65 pp | **9.95 pp** |
| CIC-IoT2023 | MLP | 21.42 pp | 12.89 pp | **6.20 pp** |
| CIC-IoT2023 | CNN | 21.78 pp | 18.55 pp | **7.46 pp** |
(中心化性能上界:N-BaIoT ≈ 87.8% F1;CIC-IoT2023 ≈ 70.7% (MLP) /
68.8% (CNN)。N-BaIoT 是更容易区分的任务;CIC-IoT2023 则相当
困难。)
### 主要发现
**FedTrimmedAvg 是 non-IID 数据下最鲁棒的聚合策略。**
在每个数据集/模型组合中,它都提供了最佳(或统计学上并列最佳)的 non-IID F1,关键在于,随着客户端倾斜
增加,它损失的性能*最少*。在 CIC-IoT2023 上,从 α = 1.0 到 α = 0.1,它仅下降了约 6–7 pp,
而 FedAvg 为约 21 pp。逐坐标修剪丢弃了最极端的
客户端更新,这恰恰是严重标签倾斜
导致的失败模式 - 因此该结果与该方法的设计初衷一致。
**FedProx 在此表现不佳,这是调参导致的问题,而非方法**
本身的缺陷。** FedProx 旨在*帮助*应对异构性,
但在 α = 0.1 时它经常表现最差,且带有最大的
方差(例如 CIC-IoT2023 CNN 上的 ±10.72)。近端系数被固定
在 μ = 0.01 应用于所有倾斜级别;如此小的值几乎不约束局部
漂移,因此 FedProx 的表现接近 FedAvg,但增加了优化噪声。针对每种倾斜程度进行 μ 扫描
将是很自然的后续工作;目前的结果应该被
解读为“μ = 0.01 时的 FedProx”,而不是对 FedProx 的普遍性评判。
**MLP 始终与 CNN 持平或表现更佳。** 对于工程化的统计
流特征,不存在可供卷积利用的空间结构,因此更简单的
MLP 具有竞争力且通常表现更好 - 这是一个值得一提的预期结果。
**关于 IID/non-IID 边界的说明:** 在 CIC-IoT2023 上,最佳的 α = 0.5 运行
(67.68%) 略微超过 IID 基线 (67.51%)。这个差异完全
在一个标准差(±1.57)之内,反映的是种子噪声,而非真正的
反转。
## 复现实验
1. 在 Google Colab(或 Jupyter)中打开相关的 notebook。
2. 从其来源下载数据集(参见**数据集**),并将数据加载单元格指向它。
3. 按照上面列出的内容设置 `CFG` 参数(或使用您自己的)。
4. 运行所有单元格。编排循环在每次运行后都会保存检查点,因此如果
会话中断,将在下次执行时从每次运行的历史 CSV 文件中恢复已完成的
运行。
5. 摘要单元格将 `all_runs_raw.csv` 聚合为 mean ± std 表格。
## 引用本工作
如果您使用了此代码或结果,请引用该代码库(参见
[`CITATION.cff`](CITATION.cff)) - GitHub 将渲染一个**“Cite this repository”**
按钮。如需创建永久的、可引用的归档,请考虑通过
[Zenodo](https://zenodo.org) 生成 DOI。
## 许可证
基于 [MIT 许可证](LICENSE) 发布。各数据集保留其各自的
许可证;请参阅原始来源。
## 作者
**Sheryar Kiani: 2504142, Saad Farooq: 2504108** - 网络安全硕士,伊斯兰堡航空大学。
标签:Apex, FedAvg, NoSQL, 僵尸网络检测, 凭据扫描, 机器学习, 物联网安全, 联邦学习, 逆向工具, 非独立同分布