aktaruzzamanelious/shap-ids-cross-dataset

GitHub: aktaruzzamanelious/shap-ids-cross-dataset

面向 IoT 与勒索软件网络流量检测的可复现研究代码包,提供基于 SHAP 的可解释轻量级分类器双数据集比较实验,包含完整的训练管线、统计验证和论文级产物。

Stars: 1 | Forks: 0

# 基于 SHAP 的可解释入侵检测:针对 IoT 和勒索软件流量的轻量级分类器双数据集比较 [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21046395.svg)](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绕过, 网络流量分析, 逆向工具