LiaBerco/intrusion-detection-cicids2017

GitHub: LiaBerco/intrusion-detection-cicids2017

对已发表的 CIC-IDS2017 入侵检测教程进行批判性复现,纠正数据泄露、不真实评估和类别丢弃等方法论缺陷,在正确方法下重新验证模型性能。

Stars: 0 | Forks: 0

# CIC-IDS2017 入侵检测 —— 一项批判性复现研究 **期末项目 —— 网络安全中的数据科学 (Dr. Uri Itai)** ## 项目描述 本项目复现并**批判性评估**了一篇已发表的入侵检测教程,该教程在 CIC-IDS2017 网络流数据集上训练机器学习分类器。我们的目标不仅是重新运行作者的 pipeline,更是为了测试作者的声明是否确实有证据支持。 网络入侵检测在此被构建为网络流的监督分类,分为两个层面: - 一个**二分类**任务 —— 区分正常与攻击流量,以及 - 一个**多分类**任务 —— 识别某个网络流属于九种攻击家族中的哪一种。 这里面临的决定性难题是严重的**类别不平衡**(大约 83% 的流是正常的,而某些攻击家族仅出现极少数几次),这使得评估方法成为该问题中最困难也最重要的环节。 本次复现重建了完整的 pipeline(数据加载 → EDA → 特征工程 → 模型训练 → 评估 → 误差分析),同时纠正了原工作中的三个方法论缺陷: 1. **数据泄露** —— 原作者在整个数据集上进行分割*之前*拟合了 scaler、PCA 和 SMOTE;我的 pipeline 是先进行分割,然后仅在训练折上拟合每一次转换。 2. **不切实际的评估** —— 原作者在人为平衡的测试集上衡量性能;我则在未触及的、自然不平衡的分布上进行评估,并使用对不平衡敏感的指标(F1、MCC、平衡准确率、ROC-AUC、PR-AUC)。 3. **丢弃稀有类别** —— 原作者删除了样本量很少的攻击家族(例如 Heartbleed、Infiltration);我保留了全部九个类别,并使用 `class_weight='balanced'` 来处理不平衡问题。 该 notebook 还包含了量化每个缺陷的对照实验、一项特征重要性研究、一项 SVM/KNN 的可扩展性测量、对原作者 PCA 选择的评估,以及一项基于成本的运行点分析。 **主要结果:** 作者的定性结论(Random Forest 是最佳模型)在正确的评估下依然成立,但那近乎完美的表面数据则不然——它们主要来自于平衡的评估,部分来自于数据泄露。 ## 精选来源(教程) - **教程 / 来源仓库:** noushinpervez — *Intrusion-Detection-CICIDS2017* https://github.com/noushinpervez/Intrusion-Detection-CICIDS2017 所选来源是一个 GitHub 教程,因此文章/教程链接和原始仓库链接是同一个 URL。 ## 原始 GitHub 仓库 - https://github.com/noushinpervez/Intrusion-Detection-CICIDS2017 ## 数据集来源 - **数据集:** CIC-IDS2017,加拿大网络安全研究所 (CIC),新不伦瑞克大学。 官方页面:https://www.unb.ca/cic/datasets/ids-2017.html - **使用版本:** 预提取的网络流特征发布版本 —— **`MachineLearningCVE`** CSV 文件(8 个文件,78 个数值特征 + 一个 `Label` 列)。这与原作者使用的版本相同,选择该版本是为了确保比较的公平性。 - 由于数据集体积庞大(约 1 GB),本仓库**不**包含该数据集。请从上述链接下载 `MachineLearningCVE` CSV 文件(Kaggle 上也提供了一个常用的镜像),并将所有八个 `.csv` 文件放在位于该 notebook 旁的一个名为 `dataset/` 的文件夹中。 ## 仓库内容 | 文件 | 描述 | |---|---| | `MyProject.ipynb` | 完整且可执行的 notebook(数据加载 → EDA → 特征工程 → 模型训练 → 评估 → 误差分析 → 执行摘要)。 | | `REPORT.pdf` | 书面报告(摘要、批判性评估、特征工程分析、可复现性、实验结果、结论、执行摘要、总结)。 | | `README.md` | 本文件。 | | `requirements.txt` | Python 依赖项(包含项目经过测试的版本)。 | ## 执行说明 该 notebook 具有**环境感知能力**:它既可以在本地机器上运行,也可以在 Google Colab 上运行,并能自动定位数据集文件夹。 ### 选项 A —— 本地运行(推荐) 需要 **Python 3.11**。 ``` # 1. (可选)创建并激活 virtual environment python -m venv .venv # Windows: .venv\Scripts\activate # macOS/Linux: source .venv/bin/activate # 2. 安装依赖 pip install -r requirements.txt # 3. 放置 dataset # 下载 MachineLearningCVE CSVs 并将所有 8 个 .csv 文件放入:./dataset/ # 4. 运行 notebook jupyter notebook MyProject.ipynb # 然后:Kernel → Restart & Run All ``` 数据加载器会在 `./dataset/`、`./MachineLearningCVE/` 或 `C:\GitHub\DataScience\dataset` 中搜索 CSV 文件(如果你的文件夹位于其他位置,你可以在第一个代码单元格中编辑候选路径)。 ### 选项 B —— Google Colab 1. 将 `MyProject.ipynb` 上传到 Colab。 2. 将 `MachineLearningCVE` CSV 文件上传到你的 Google Drive 中一个名为 `MachineLearningCVE` 的文件夹中。 3. 运行所有单元格 —— 第一个单元格会挂载 Drive 并自动找到该文件夹。 ### 关于可复现性的说明 - 所有随机操作均使用**固定随机种子**,因此每次运行的结果都是可复现的。 - 本项目使用 `requirements.txt` 中的版本(Python 3.11、pandas 3.0、scikit-learn 1.9)进行了测试。该 notebook 的编写也兼容 Colab 自带的(较旧的)pandas/scikit-learn;任何特定于版本的警告仅是表面上的,不会影响结果。 - 在典型的笔记本电脑上,完整运行大约需要 15–20 分钟(大部分时间花在完整的约 177 万行训练集上训练模型,以及进行可扩展性/PCA 实验)。
标签:Apex, CIC-IDS2017, NoSQL, 数据科学, 机器学习, 模型评估, 特征工程, 资源验证, 逆向工具