georgeani/AutoGraphAD
GitHub: georgeani/AutoGraphAD
该项目实现了基于变分图自编码器的无监督网络流量异常检测方法,并提供完整的数据处理、模型训练、超参数搜索及与 Anomal-E 对比的实验代码。
Stars: 1 | Forks: 0
# AutoGraphAD: 使用变分图自编码器的无监督网络异常检测
## 简介
代码结构包含两个文件夹,一个用于我们的方法,另一个用于使用我们自己的方法来运行 Anomal-E。
要运行这些代码,您需要创建两个独立的虚拟环境,因为运行每部分代码所需的库互不兼容。
运行实验各部分所需的库已包含在需求文件中,可以轻松安装。对于机器学习库,请确保下载与您的 CUDA 版本相匹配的库。
原始数据集、数据集文件和模型权重已上传至 FigShare 仓库。可通过以下链接访问:
[https://doi.org/10.6084/m9.figshare.30643508](https://doi.org/10.6084/m9.figshare.30643508)
## 异常分数与 Anomal-E 估计器超参数搜索
这些是我们的超参数搜索网格。
### AutoGraphAD 超参数搜索网格
| 超参数 | 超参数取值 |
| ---------------------------------- | ----------------------------------------- |
| 层数 | [1, 2] |
| 隐藏层维度 | 32 |
| 学习率 | 1e-3 |
| 激活函数 | ReLU |
| 结构损失的损失函数 | Binary Cross Entropy |
| 特征损失的损失函数 | [Mean Square Error, Cosine Embedding Loss]|
| 优化器 | AdamW |
| 权重衰减 | 1e-5 |
| KL 退火 | [Yes, No] |
| KL 退火轮数 | 10 |
| KL 最小权重 | 0.0 |
| 正则化器 | [Yes, No] |
| 多次采样 | [Yes, No] |
| 最大轮数 | 100 |
| 早停容忍度 | 20 |
| 特征重要性 | 1.0 |
| 结构重要性 | 1.0 |
### Anomal-E 下游估计器超参数搜索网格
| 超参数 | 超参数取值 |
| ------------------------------- | ------------------------------------------ |
| PCA 组件数 | [0.96, 0.98, 0.99] |
| PCA 权重 | True |
| PCA 白化 | [True, False] |
| PCA 标准化 | True |
| HBOS 箱数 | [5, 6, 8, 10, 12, 14, 16, 18, 20] |
| HBOS Alpha | [0.05, 0.1] |
| HBOS Tol | [0.1, 0.5] |
| 污染度 (Anomal-E) | [0.02, 0.035, 0.05, 0.1, 0.2] |
| Alpha (AutoGraphAD) | [0.1, 0.5, 1.0] |
| Beta (AutoGraphAD) | [0.1, 0.5, 1.0] |
| Gamma (AutoGraphAD) | [0.1, 0.5, 1.0] |
| MSE 使用 (AutoGraphAD) | [True, False] |
| 分位数 (AutoGraphAD) | [95, 97, 98, 99] |
## 为 AutoGraphAD 和 Anomal-E 选择的超参数
### 为 Anomal-E 选择的超参数
| 估计器 | 污染度等级 | 超参数 |
|-----------|-----------------------|---------------------------------------------------------------------------------|
| PCA | 无污染 | 污染度: 0.02, 组件数: 0.96, 白化: False |
| PCA | 3.5% 污染 | 污染度: 0.05, 组件数: 0.98, 白化: False |
| PCA | 5.7% 污染 | 污染度: 0.1, 组件数: 0.98, 白化: False |
| CBLOF | 无污染 | 污染度: 0.02, Alpha: 0.9, Beta: 5, 簇数: 36, 使用权重: True |
| CBLOF | 3.5% 污染 | 污染度: 0.05, Alpha: 0.9, Beta: 5, 簇数: 40, 使用权重: True |
| CBLOF | 5.7% 污染 | 污染度: 0.1, Alpha: 0.9, Beta: 5, 簇数: 50, 使用权重: False |
| HBOS | 无污染 | 污染度: 0.02, Alpha: 0.05, Beta: 5, 箱数: 14, Tol: 0.1 |
| HBOS | 3.5% 污染 | 污染度: 0.05, Alpha: 0.1, Beta: 5, 箱数: 5, Tol: 0.1 |
| HBOS | 5.7% 污染 | 污染度: 0.1, Alpha: 0.1, Beta: 5, 箱数: 12, Tol: 0.1 |
### AutopGraphAD 模型超参数
| 模型变体 | 污染度 | 模型超参数 |
|-------------------|---------------|------------------------------------------------------------------------------------|
| VGAE 正则化器 | 0% | 20% 负采样, 边丢弃, 带退火的节点掩码, 1 层 |
| VGAE 正则化器 | 3.5% | 40% 负采样, 边丢弃, 带退火的节点掩码, 2 层 |
| VGAE 多次采样| 5.7% | 20% 负采样, 边丢弃, 带退火的节点掩码, 1 层, 10 次采样 |
### AutopGraphAD 异常分数超参数
| 污染度 | 异常分数超参数 |
|--------------------|---------------------------------------------------------------------|
| 0% 污染 | Alpha: 0.1, Beta: 0.5, Gamma: 0.1, MSE: True, 分位数: 95 |
| 3.5% 污染 | Alpha: 1.0, Beta: 0.1, Gamma: 1.0, MSE: False, 分位数: 95 |
| 5.7% 污染 | Alpha: 0.5, Beta: 0.1, Gamma: 0.5, MSE: True, 分位数: 95 |
## 使用 VGAE 进行异常检测
### 训练模型
模型训练通过 `training_script.py` 文件完成。在该文件中,您可以声明并配置您的模型:
* 配置模型架构(例如 Embedding Size、层数等)
* 优化超参数(例如学习率、权重衰减)
* KL 退火
* Checkpoint 保存路径及要使用的数据集
模型定义在该文件内部的一个字典中。请修改该字典以训练和设计您的文件。
### 评估模型性能并执行超参数优化
超参数优化和模型评估在 `optimised_grid_search.py` 文件中进行。
该脚本包含两个主要方法:
* 一个用于超参数优化
* 一个用于测试超参数。
您只需设置超参数优化时结果的保存路径即可。在测试模型时,您需要设置最佳结果的路径,以便它能读取在优化过程中取得这些结果的超参数。
此外,您可以通过文件开头的列表添加更多超参数选项,以扩大搜索空间。
### 生成图数据集
要生成图数据集,您需要 `.parquet` 格式的原始数据集。选择这种格式是因为它的加载和保存速度极快。此外,它具有内置的数据压缩功能,可以减小文件大小,便于数据传输。
该 `.parquet` 文件可在 FigShare 仓库中找到。
* 设置一个仓库以保存数据集
* 设置原始文件的路径
* 选择生成器的模式
* 选择 `datasets.py` 文件中可找到的各项设置。
我们在训练数据集中生成 0% 污染度的数据集时所使用的设置如下:
* batch_size=1
* window_size=180
* window_stride=180
* train_split=70
* test_split=10
* remove_attacks=True
* classification_threshold=0.0
* node_labels=True
* l2_norm=True
我们在训练数据集中生成 3.36% 污染度的数据集时所使用的设置如下:
* batch_size=1
* window_size=180
* window_stride=180
* train_split=70
* test_split=10
* remove_attacks=False
* classification_threshold=0.0
* node_labels=True
* l2_norm=True
我们在训练数据集中生成 5.76% 污染度的数据集时所使用的设置如下:
* batch_size=1
* window_size=180
* window_stride=180
* train_split=70
* test_split=10
* remove_attacks=False
* classification_threshold=0.0
* node_labels=True
* benign_downsampling=0.01
* l2_norm=True
要添加负边,您需要使用数据集类提供的 `negative_sampling()` 方法。要保存处理后的数据集,您需要使用 `save_datasets()` 方法。请确保在调用保存方法之前已创建该数据集所在的文件夹。
## 使用 Anomal-E 进行异常检测
### 训练模型
模型训练通过 Jupyter Notebook `AnomalERunning.ipynb` 完成。您可以通过 Notebook 执行以下操作:
* 加载不同的数据集
* 设置模型路径,以便在达到最佳损失时保存模型权重
* 设置超参数并设置早停的容忍度。
### 评估模型性能并执行超参数优化
超参数优化和模型评估在 `optimised_grid_search.py` 文件中进行。
该脚本包含两个主要方法:
* 一个用于超参数优化
* 一个用于测试超参数。
您只需设置超参数优化时结果的保存路径即可。在测试模型时,您需要设置最佳结果的路径,以便它能读取在优化过程中取得这些结果的超参数。
此外,您可以通过文件开头的列表添加更多超参数选项,以扩大搜索空间。
### 生成图数据集
要生成图数据集,您需要 `.parquet` 格式的原始数据集。选择这种格式是因为它的加载和保存速度极快。此外,它具有内置的数据压缩功能,可以减小文件大小,便于数据传输。
该 `.parquet` 文件可在 FigShare 仓库中找到。
* 设置一个仓库以保存数据集
* 设置原始文件的路径
* 选择生成器的模式
* 选择 `datasets.py` 文件中可找到的各项设置。
我们在训练数据集中生成 0% 污染度的数据集时所使用的设置如下:
* batch_size=1
* window_size=180
* window_stride=180
* train_split=70
* test_split=10
* remove_attacks=True
* classification_threshold=0.0
* node_labels=True
* l2_norm=True
我们在训练数据集中生成 3.36% 污染度的数据集时所使用的设置如下:
* batch_size=1
* window_size=180
* window_stride=180
* train_split=70
* test_split=10
* remove_attacks=False
* classification_threshold=0.0
* node_labels=True
* l2_norm=True
我们在训练数据集中生成 5.76% 污染度的数据集时所使用的设置如下:
* batch_size=1
* window_size=180
* window_stride=180
* train_split=70
* test_split=10
* remove_attacks=False
* classification_threshold=0.0
* node_labels=True
* benign_downsampling=0.01
* l2_norm=True
要保存处理后的数据集,您需要使用数据集类中提供的 `save_datasets()` 方法。请确保在调用保存方法之前已创建该数据集所在的文件夹。
## PCAP 转换为 NF
要将 PCAP 文件处理为 NetFlow,需要安装 NFStream 库。您可以使用任何现有的虚拟环境,因为它与这两套库都兼容。
### PCAP 转换为 CSV
要开始处理,您需要:
* 创建一个文件夹并将所有 PCAP 文件加载到其中。
* 运行脚本 `pcap_to_nf_v2.py`。
* 设置有关处理 PCAP 文件方式的一些设置。这包括 PCAP 文件夹、非活动超时和最大流长度。
对于 UNSW-NB15,使用了与论文中提到的相同的设置。
### CSV 标注
创建 NetFlow CSV 文件后,下一个目标是对它们进行标注。为了进行标注,我们创建了一个真值(ground truth)文件,其中包含原始数据集中每个异常流的信息。真值通过创建以下元组来实现:
* 源 IP
* 源端口
* 目标 IP
* 目标端口
* 开始时间
* 结束时间戳
* 协议。
然后将该元组与生成的 CSV 文件中相应的流进行匹配以进行标注。
我们创建并使用一个 `.config` 文件来指示元组的每个组件出现在哪些行中。
对于标注,我们使用脚本 `nf_labeler_v3.py`,并添加标志以传递以下路径:
* 真值文件。
* 配置文件。
* 需要标注的文件夹的 CSV 文件。
### 合并断裂流
为了合并任何可能断裂的流,我们使用脚本 `nf_joiner_v2.py`。该文件合并相近的流,并创建一个由较小流组成的单一较大流。从而允许创建更长、更清晰的通信片段。
要使用此文件,我们需要传入以下标志:
* 包含 CSV 文件夹路径的标志。
* 最大流过期超时时间。
## 引用
如果您发现此代码或研究有用,请引用我们的论文:
**AutoGraphAD: Unsupervised network anomaly detection using Variational Graph Autoencoders**
*Georgios Anyfantis 和 Pere Barlet-Ros*
[在 IEEE Xplore 上阅读论文](https://ieeexplore.ieee.org/document/11603414)
```
@INPROCEEDINGS{11603414,
author={Anyfantis, Georgios and Barlet-Ros, Pere},
booktitle={2026 IEEE 12th International Conference on Network Softwarization (NetSoft)},
title={AutoGraphAD: Unsupervised Network Anomaly Detection Using Variational Graph Autoencoders},
year={2026},
volume={},
number={},
pages={255-260},
keywords={Modeling;Printing;Labeling;Training;Anomaly detection;Graph neural networks;Contamination;Machine learning;Computer architecture;Architecture;Graph Neural Networks;Intrusion Detection System;Unsupervised Learning;Graph Variational Autoencoders;Anomaly Detection},
doi={10.1109/NetSoft70012.2026.11603414}}
```
标签:Apex, NoSQL, 变分图自编码器, 图神经网络, 学术研究, 异常检测, 机器学习, 网络安全, 逆向工具, 隐私保护