aktaruzzamanelious/shap-ids-cross-dataset
GitHub: aktaruzzamanelious/shap-ids-cross-dataset
面向 IoT 与勒索软件网络流量检测的可复现研究代码包,提供基于 SHAP 的可解释轻量级分类器双数据集比较实验,包含完整的训练管线、统计验证和论文级产物。
Stars: 1 | Forks: 0
# 基于 SHAP 的可解释入侵检测:针对 IoT 和勒索软件流量的轻量级分类器双数据集比较
[](https://doi.org/10.5281/zenodo.21046395)
针对 IoT 和勒索软件流量检测的轻量级分类器双数据集比较,
包含基于 SHAP 的可解释性以及将误报率转化为 SOC 工作量的指标。
## 作者
- Aktaruzzaman Elious - 西苏格兰大学 - ORCID [0009-0009-6143-5183](https://orcid.org/0009-0009-6143-5183)
- Manesh Thankappan - 西苏格兰大学
- Danial Javaheri - 西苏格兰大学
本仓库由 A. Elious 准备并维护。
## 论文
手稿正在准备中。目标期刊:MDPI *Sensors*。
## 数据集
- **UGRansome2024** (Azugo et al., 2024) - 勒索软件网络流量
- **CICIoT2023** (Neto et al. 2023) - IoT 攻击流量
两者均为公开可用。此处**不**提供原始数据;请参阅
[`data/README.md`](data/README.md) 获取 URL、访问日期和下载助手。
## 复现结果
1. 克隆此仓库。
2. 创建一个 Python 3.12 虚拟环境。
3. `pip install -r requirements.txt`
4. 按照 [`data/README.md`](data/README.md) 下载数据集。
5. **从仓库根目录**启动 Jupyter 并按数字顺序 `01` → `12` 运行 Notebook。
每个 Notebook 会自动解析仓库根目录,因此无论从根目录还是从
`notebooks/` 文件夹启动,路径都能正常工作。
包含所有结果 CSV 文件、8 个训练好的模型、SHAP 交互数组以及 18 张
论文图表,因此无需重新运行整个 pipeline 即可检查和
验证论文中的数据。
**可复现性。**所有随机步骤均使用固定种子 **42**:UGRansome2024 的 80/20
划分、模型训练、五种子 Random Forest 稳定性检查、
bootstrap 重采样以及 SHAP 背景采样。CICIoT2023 使用数据集
作者提供的官方训练/测试划分。确定性的后处理步骤
(McNemar 和 Holm 检验、SOC 工作量转换、各类别召回率以及
耗时计算)不需要种子。
**验证数据。**内置了一个独立的检查程序。在
仓库根目录下运行:
```
python3 verify_canonical_artifacts.py
```
它会通过 SHA-256 校验和以及论文表格中报告的
具体数值来确认 13 个规范结果 CSV 中的每一个(退出代码 0 表示全部通过)。
## Notebook → 规范产物映射
将 13 个规范结果 CSV 中的每一个映射到生成它的 Notebook 的权威对照表,
该表是通过读取每个 Notebook 的输出写入路径得出的(这些
Notebook **并未**被重新运行)。13 个中有 11 个以相同的名称直接写入;
剩下的 4 个(即下面两行带有 `[†]` 标记的)是通过对
Notebook 写入的单个合并文件进行拆分得到的。
| # | 规范 CSV (位于 `results/` 中) | 写入者 | Notebook 写入时的名称 | 供(论文)使用 |
|---|---|---|---|---|
| 1 | `master_results_all.csv` | `04_multimodel_comparison.ipynb` | `results/master_results_all.csv` (直接写入) | 表格 1, 2, 3 |
| 2 | `metrics_with_ci_ugr.csv` [†] | `09_bootstrap_ci.ipynb` | `results/bootstrap_ci.csv`, `dataset == UGRansome2024` 行 | 表格 6 + Sec 4.5 |
| 3 | `metrics_with_ci_cic.csv` [†] | `09_bootstrap_ci.ipynb` | `results/bootstrap_ci.csv`, `dataset == CICIoT2023` 行 | 表格 6 + Sec 4.5 |
| 4 | `rf_seed_robustness.csv` | `06_statistical_tests.ipynb` | `results/rf_seed_robustness.csv` (直接写入) | 表格 4;种子鲁棒性图 |
| 5 | `mcnemar_results.csv` | `06_statistical_tests.ipynb` | `results/mcnemar_results.csv` (直接写入) | 表格 5 |
| 6 | `ablation_ugransome_tier_a.csv` [†] | `08_ablation.ipynb` | `results/ablation_ugr.csv`, `tier == A_raw_flow_only` 行 | 表格 7;特征消融图 |
| 7 | `ablation_ugransome_tier_b.csv` [†] | `08_ablation.ipynb` | `results/ablation_ugr.csv`, `tier in {B1,B2,B3,B4}` 行 | 表格 7;特征消融图 |
| 8 | `spearman_correlations.csv` | `10_shap_best_permutation.ipynb` | `results/spearman_correlations.csv` (直接写入) | 表格 8 |
| 9 | `shap_vs_gini_permutation_cic.csv` | `10_shap_best_permutation.ipynb` | `results/shap_vs_gini_permutation_cic.csv` (直接写入) | 表格 9 |
| 10 | `shap_vs_gini_permutation_ugr.csv` | `10_shap_best_permutation.ipynb` | `results/shap_vs_gini_permutation_ugr.csv` (直接写入) | 表格 10 |
| 11 | `per_category_recall_cic.csv` | `12_per_category_recall.ipynb` | `results/per_category_recall_cic.csv` (直接写入) | 表格 11;各类别召回率热力图 |
| 12 | `efficiency_table.csv` | `11_efficiency.ipynb` | `results/efficiency_table.csv` (直接写入) | 表格 12;**Figure 17** (`figures/efficiency.{png,pdf}`) |
| 13 | `soc_workload.csv` | `07_soc_workload.ipynb` | `results/soc_workload.csv` (直接写入) | 表格 13, 14;**Figure 18** (`figures/soc_workload.{png,pdf}`) |
[†] **拆分说明。**提交的 Notebook 写入了两个*合并*文件:
`08_ablation.ipynb` 写入 `results/ablation_ugr.csv`(一个包含 Tier A
行以及四个 Tier B 行的文件),而 `09_bootstrap_ci.ipynb` 写入
`results/bootstrap_ci.csv`(一个包含两个数据集的文件)。提供的
规范文件是按行拆分后的结果 - `ablation_ugransome_tier_a.csv` 是
单独的 `A_raw_flow_only` 行,`ablation_ugransome_tier_b.csv` 是四个
`B1`–`B4` 行,而 `metrics_with_ci_{ugr,cic}.csv` 是按数据集划分的子集。
这四个文件均包含与合并文件相同的列,并且是由 `verify_canonical_artifacts.py` 验证的
论文规范版本。
该拆分最初是一个一次性的手动步骤(它不是已提交的 Notebook
单元)。为了让审查者能够从
合并文件中复现出四个规范文件名,请在仓库根目录运行 `split_canonical_csvs.py`。完整的
复现顺序为:
1. 运行 `notebooks/08_ablation.ipynb` → 写入 `results/ablation_ugr.csv`
2. 运行 `notebooks/09_bootstrap_ci.ipynb` → 写入 `results/bootstrap_ci.csv`
3. 运行 `python3 split_canonical_csvs.py`,它会生成:
- `results/ablation_ugr.csv` → `ablation_ugransome_tier_a.csv` (Tier A 行)
和 `ablation_ugransome_tier_b.csv` (四个 B1–B4 行)
- `results/bootstrap_ci.csv` → `metrics_with_ci_ugr.csv` (UGRansome2024 行)
和 `metrics_with_ci_cic.csv` (CICIoT2023 行)
```
python3 split_canonical_csvs.py
```
拆分过程会原封不动地复制表头和匹配的数据行,因此输出结果
与已提交的规范文件在字节上是完全相同的(与检查门槛测试的 sha256 相同)。
如果缺少合并的输入文件,脚本会报告缺少哪些文件,
并提示您先运行 Notebook 08/09。
### 辅助产物(不包含在 13 个规范 CSV 中)
| Notebook | 产物 | 用于 |
|---|---|---|
| `01_data_cleaning.ipynb` | `data/processed/ugr_clean.csv` | 预处理 |
| `02_preprocessing.ipynb` | `data/processed/{ugr,cic}_{train,test}.csv` | 预处理 |
| `03_baselines.ipynb` | `results/baselines/baseline_metrics.csv`, `results/baselines/rules.json` | Sec 4.1 规则基线 (UGR macro-F1 0.6274 / CIC 0.5986) |
| `04_multimodel_comparison.ipynb` | `results/models/*.joblib` (8 个模型) | 训练好的模型 |
| `05_shap_v5.ipynb` | `figures/shap_bar_rf_{ugr,cic}`, `figures/shap_beeswarm_rf_{ugr,cic}` | RF SHAP 重要性图 |
| `10_shap_best_permutation.ipynb` | `results/top_interactions_ugr_xgb.csv`, `results/shap_interaction_ugr_xgb.npy` | Sec 4.7 SHAP 交互 |
| `11_efficiency.ipynb` | `results/cpu_info.json`, `results/raw_efficiency_timings.json` | Sec 3.8 计时环境 |
### 图表 17 和 18(从规范 CSV 重新生成)
**Figure 17** (`figures/efficiency.{png,pdf}`) 和 **Figure 18**
(`figures/soc_workload.{png,pdf}`) 不是由 Notebook 写入的;它们是
由位于仓库根目录的 `make_corrected_figs.py` 生成的,该脚本会读取
`results/efficiency_table.csv` (Figure 17) 和 `results/soc_workload.csv`
(Figure 18),并为每个文件写入 600 DPI 的 PNG 和真正的矢量 PDF。
从仓库根目录运行:
```
python3 make_corrected_figs.py
```
## 局限性
- SHAP 交互值仅针对 UGRansome2024 / XGBoost 模型进行计算
(`results/top_interactions_ugr_xgb.csv`, `results/shap_interaction_ugr_xgb.npy`)。
由于内存限制,未执行 CICIoT2023 的交互计算。
- 未运行深度学习或其他重量级基线;比较仅在
四个轻量级分类器与基于规则的基线之间进行。
- 这是一次双数据集比较;它没有测试跨数据集迁移
(在一个数据集上进行训练并在另一个数据集上进行评估)。
## 仓库结构
```
notebooks/ 12 Jupyter notebooks (data cleaning -> final experiments), run 01..12
results/ 13 canonical result CSVs + supporting JSON, SHAP interaction array,
baselines/ (metrics + rule thresholds), and models/ (8 trained .joblib)
figures/ 18 publication figures at 600 DPI, each with a PNG and a PDF (36 files)
data/ Download instructions + helper script (no raw data shipped)
verify_canonical_artifacts.py checks the 13 canonical CSVs by checksum + value
make_corrected_figs.py regenerates Figure 17 (efficiency.*) and Figure 18
(soc_workload.*) from the canonical results/ CSVs
split_canonical_csvs.py splits the two combined CSVs the notebooks write
(ablation_ugr.csv, bootstrap_ci.csv) into the four
canonical per-tier / per-dataset files
CITATION.cff citation metadata for GitHub's cite feature
```
这些 pipeline 的 Notebook 是独立的,不导入任何本地辅助模块。
## 许可证
MIT — 请参阅 [`LICENSE`](LICENSE)。
## 引用
如果您使用了这项工作,请引用该文章(一旦发布)以及此
仓库。提供了一个 `CITATION.cff` 文件供 GitHub 的“Cite this repository”
按钮使用。在发表和进行 Zenodo 归档之前:
```
@misc{elious_shap_ids_2026,
author = {Elious, Aktaruzzaman and Thankappan, Manesh and Javaheri, Danial},
title = {{SHAP-Based Explainable Intrusion Detection: A Two-Dataset
Comparison of Lightweight Classifiers for IoT and Ransomware
Traffic}},
year = {2026},
howpublished = {\url{https://github.com/aktaruzzamanelious/shap-ids-cross-dataset}},
note = {Zenodo DOI to be added on release}
}
```
标签:Apex, NoSQL, 人工智能, 勒索软件检测, 可解释AI, 机器学习, 物联网安全, 用户模式Hook绕过, 网络流量分析, 逆向工具