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, 变分图自编码器, 图神经网络, 学术研究, 异常检测, 机器学习, 网络安全, 逆向工具, 隐私保护