ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于UNSW-NB15数据集的机器学习入侵检测系统实战与部署

基于UNSW-NB15数据集的机器学习入侵检测系统实战与部署 简介这是一份面向计算机相关专业学生、教师及机器学习初学者的毕业设计/课程设计源码包聚焦使用 UNSW-NB15 数据集实现网络攻击检测。资源包含决策树二分类、逻辑回归、KNN 分类器等算法的 Python 实现并配有 README 说明覆盖数据处理、模型训练与评估的基本流程。全包共 4 个文件以 Python 脚本为主另含 1 个 Markdown 说明文档压缩后仅 12KB轻量便携下载后简单部署即可运行适合用于毕设、课设、大作业或项目初期演示。目前已有 143 人学习浏览。代码均经过运行验证功能完整尤其适合需要快速搭建可复现实验环境、对照论文进行算法对比分析的学习者结合 UNSW-NB15 数据集的真实攻击流量可帮助理解不同机器学习算法在异常检测任务中的效果差异为后续改进与二次开发提供清晰起点。1. 项目概述与核心定位1.1 这个毕设项目到底在做什么UNSW-NB15 数据集是澳大利亚网络安全中心ACCS发布的网络入侵检测基准数据集它比老牌的 KDD99、NSL-KDD 更贴近现代网络流量特征。这个毕业设计的核心目标就是在这个数据集上跑通多种机器学习算法完成“正常流量 vs 攻击流量”的二分类检测以及不同攻击类型的多分类识别最终产出一套能直接运行、有界面交互、有可视化结果的完整系统。说白了这个项目的价值点有三个一是数据集选型够新UNSW-NB15 包含九大类攻击Fuzzers、Analysis、Backdoors、DoS、Exploits、Generic、Reconnaissance、Shellcode、Worms覆盖了现代网络环境中的常见威胁比老数据集有说服力二是技术栈完整从数据清洗、特征工程、模型训练到结果评估走的是标准机器学习流程三是工程化程度到位自带源码、教程、部署脚本属于“拿到手就能跑”的类型。适合什么人参考如果你是计算机、网络空间安全、信息安全、人工智能相关专业的本科生或研究生正在为毕设选题发愁或者已经选了“基于机器学习的入侵检测”方向但不知道从何下手这个项目能帮你省掉至少两周的踩坑时间。课程设计、实训项目、竞赛基础项目也同样适用。1.2 为什么选 UNSW-NB15 而不是 KDD99很多同学上来就问导师说做入侵检测网上资料一堆都是 KDD99我直接用行不行我的建议是除非导师特别指定否则用 UNSW-NB15 的性价比更高。KDD99 是 1999 年的数据里面的攻击类型和网络环境早已过时很多论文里你都会看到“KDD99 存在大量冗余记录、无法反映现代攻击特征”这类批评。答辩的时候评委一旦问“你为什么不用新数据集”如果你答不上来印象分会打折扣。UNSW-NB15 的流量数据是使用 IXIA PerfectStorm 工具在真实网络环境中生成的包含约 250 万条记录、49 个特征字段其中 45 个为流量特征字段4 个为标签字段。测试集UNSW_NB15_testing-set.csv约 12.3 万条训练集UNSW_NB15_training-set.csv约 17.5 万条另外还有四个分块文件UNSW_NB15_1.csv 到 UNSW_NB15_4.csv可以合并使用。特征涵盖流持续时间、协议类型、源/目的字节数、TTL、TCP 窗口大小、SYN/FIN/ACK 标志位等既有连续型数值特征也有类别型特征非常适合作机器学习算法的“试炼场”。2. 核心算法设计与模型选型2.1 多算法对比实验的设计思路毕设和工程项目的最大区别在于工程追求“最好用的一个模型”毕设追求“多个模型对比论证方案合理性”。这个项目的算法选择很有代表性覆盖了不同学习范式传统机器学习决策树Decision Tree、随机森林Random Forest、逻辑回归LR、朴素贝叶斯NB集成学习方法XGBoost、梯度提升决策树GBDT、随机森林RF距离/核方法K近邻KNN、支持向量机SVM选这些算法的原因很简单数据集规模在几十万条级别深度学习虽然也行但训练成本高、调参复杂对于本科毕设来说把传统机器学习集成学习做扎实已经足够支撑一篇合格的论文了。而且这些算法在 scikit-learn 里都有成熟实现代码量小、运行速度快、可解释性强方便后面做特征重要性分析和结果可视化。2.2 各类算法在 UNSW-NB15 上的表现差异根据我跑过的实际结果说几个经验性的结论供你参考具体数值会因特征处理方式不同而有浮动随机森林和 XGBoost 在不做复杂特征工程的情况下准确率就能到 85%~90% 区间是性价比最高的两个模型决策树单模型容易过拟合在测试集上波动较大但作为基学习器效果不错逻辑回归和朴素贝叶斯训练快、可解释性好但面对高维非线性特征时准确率明显偏低适合做基线对比KNN 在小规模采样数据上表现还行但一旦数据量上来预测速度会变得很慢因为每次预测都要计算与所有训练样本的距离SVM特别是 RBF 核在 10 万级以上数据上训练时间会很长如果机器配置一般建议先用降采样或特征子集来跑从毕设答辩的角度来看你不需要每个算法都调到最优但需要能说清楚“为什么某个算法表现好/差”。比如随机森林效果好是因为它通过 Bagging 策略减小了方差、并行训练多棵决策树并投票XGBoost 效果好是因为它做了二阶泰勒展开、加入了正则项和列抽样对异常值的鲁棒性更强。这些原理层面的解释是论文和答辩中拉开分差的关键。3. 部署准备与运行环境搭建3.1 环境依赖清单拿到源码包之后第一步永远是建虚拟环境不要直接往系统 Python 里装包这是 Python 项目的铁律。推荐用 conda 或 venv 创建 Python 3.8 以上的虚拟环境具体依赖如下# 创建虚拟环境 conda create -n nsl_kdd python3.9 conda activate nsl_kdd # 安装核心依赖 pip install numpy pandas scikit-learn matplotlib seaborn pip install xgboost joblib flask # flask用于简单可视化界面 # 如果下载速度慢可以换国内镜像源 pip install -i https://mirrors.aliyun.com/pypi/simple numpy pandas scikit-learn依赖中需要专门说明的是 joblib 和 flask。joblib 用于保存训练好的模型文件.pkl后面做模型加载和预测都要用flask 是可选依赖如果项目带 Web 界面就需要安装如果只是跑命令行实验则可以跳过。3.2 数据集下载与目录组织UNSW-NB15 数据集需要从官网或公开镜像下载文件为 CSV 格式。下载后建议按以下目录结构组织UNSW-NB15-Project/ │ ├── data/ │ ├── UNSW_NB15_training-set.csv │ ├── UNSW_NB15_testing-set.csv │ ├── UNSW_NB15_1.csv │ ├── UNSW_NB15_2.csv │ ├── UNSW_NB15_3.csv │ └── UNSW_NB15_4.csv ├── models/ # 训练产出的模型文件 ├── src/ # 核心源码 ├── results/ # 实验结果和图表 └── requirements.txt注意训练集和测试集不要混用。如果要用完整 250 万条数据做训练需要合并四个分块文件再去重如果电脑内存不足少于 16G建议直接只用 training-set17.5 万条做训练、testing-set12.3 万条做测试效果也够用而且实验跑得快迭代方便。3.3 源码结构快速解读拿到源码包后不要急着运行先花 20 分钟把代码结构理清楚。通常这类项目会包含以下核心模块src/ ├── data_preprocess.py # 数据清洗与预处理 ├── feature_engineering.py # 特征工程 ├── train_models.py # 模型训练入口 ├── evaluate.py # 评估指标计算与可视化 ├── predict.py # 单条/批量预测 ├── app.py # Flask可视化界面可选 └── utils.py # 公共函数我的建议是先打开 data_preprocess.py 看数据读取逻辑再打开 train_models.py 看训练流程最后再运行。不要一上来就python app.py连数据长什么样都没搞清楚后面出问题了完全不知道怎么排查。4. 核心环节实操从数据预处理到结果评估4.1 数据清洗与特征工程细节UNSW-NB15 数据的预处理有几个关键坑逐一说明。第一缺失值处理。原始 CSV 中可能出现空值和字符串 “N/A”pandas 读进来后会变成 NaN。直接删行会造成信息损失建议用列均值填充连续型特征、众数填充类别型特征。import pandas as pd import numpy as np df pd.read_csv(../data/UNSW_NB15_training-set.csv) # 查看缺失值情况 print(df.isnull().sum()[df.isnull().sum() 0]) # 连续特征用均值填充 num_cols df.select_dtypes(include[np.number]).columns df[num_cols] df[num_cols].fillna(df[num_cols].mean()) # 类别特征用众数填充 cat_cols df.select_dtypes(include[object]).columns for col in cat_cols: df[col] df[col].fillna(df[col].mode()[0])第二类别特征编码。UNSW-NB15 中的proto协议类型、service服务类型、state连接状态是字符串类型的类别特征需要转换。我建议用 pandas 的get_dummies()做独热编码简单直接但从特征维度角度来看proto有 130 个取值独热编码后维度爆炸会增加内存开销。更推荐的做法是先用LabelEncoder做标签编码或者只对高频类别做独热编码、低频类别合并为 “other”。from sklearn.preprocessing import LabelEncoder le LabelEncoder() df[proto_encoded] le.fit_transform(df[proto]) df[service_encoded] le.fit_transform(df[service]) df[state_encoded] le.fit_transform(df[state]) # 删除原始文本列 df df.drop([proto, service, state], axis1)第三特征相关性分析。45 个特征中有些存在较强的线性相关性比如spkts与dpkts发送/接收的数据包数量、sbytes与dbytes发送/接收字节数。虽然树模型对特征相关性不敏感但逻辑回归和 KNN 这类基于距离/线性关系的模型会受影响。建议在建模前做一次相关性热力图分析对相关性超过 0.9 的特征对做去重。import matplotlib.pyplot as plt import seaborn as sns corr df.corr() plt.figure(figsize(16, 12)) sns.heatmap(corr, cmapcoolwarm, center0) plt.show()4.2 标签处理与训练集划分UNSW-NB15 有两个标签列label二分类标签0/1和attack_cat攻击类型。如果你做二分类任务直接用label列即可如果做多分类需要将正常流量标记为 “Normal”其余按攻击类别分类。# 二分类标签检查 print(df[label].value_counts()) # 多分类标签 df[attack_cat] df[attack_cat].fillna(Normal) print(df[attack_cat].value_counts())训练集和测试集要分开处理不能把测试集的信息引入训练过程。正确的做法是在训练集上 fit 编码器/缩放器再 transform 测试集。用train_test_split拆分时务必设置random_state保证结果可复现。from sklearn.model_selection import train_test_split split_X_train, split_X_test, split_y_train, split_y_test train_test_split( df.drop([label, attack_cat], axis1), df[label], test_size0.2, random_state42, stratifydf[label] )stratify参数非常重要。UNSW-NB15 的 label 有类别不平衡问题网络流量数据正常样本远多于攻击样本如果不做分层抽样随机划分出来的训练集和测试集类别比例可能差异很大导致模型评估失真。4.3 模型训练与参数调优实战训练环节我按“傻瓜式跑通 → 针对性调优”两个阶段推进。第一阶段先用默认参数跑 4~5 个算法拿到基线结果第二阶段再针对效果最好的 1~2 个模型做网格搜索调参。from sklearn.ensemble import RandomForestClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.linear_model import LogisticRegression from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix # 随机森林 rf_model RandomForestClassifier(n_estimators100, random_state42) rf_model.fit(split_X_train, split_y_train) rf_pred rf_model.predict(split_X_test) print(Random Forest Accuracy:, accuracy_score(split_y_test, rf_pred)) print(Random Forest F1:, f1_score(split_y_test, rf_pred))关于类别不平衡问题这里重点说一下。如果不做任何处理直接用原始数据训练模型的准确率可能会虚高但召回率很难看——因为模型会把几乎所有样本都预测为多数类。解决方式有三种一是在训练时做下采样让正负样本比例接近二是训练后调整决策阈值三是用 SMOTE 做过采样。对于毕设来说最推荐的是第一种操作简单、容易解释。from imblearn.under_sampling import RandomUnderSampler rus RandomUnderSampler(random_state42) X_resampled, y_resampled rus.fit_resample(split_X_train, split_y_train)4.4 评估指标与分析图表产出模型训练完需要产出一批可视化结果放到论文里。必须要有的图包括混淆矩阵热力图、ROC 曲线和 AUC 值、特征重要性柱状图、多模型准确率对比柱状图。from sklearn.metrics import roc_curve, auc # 混淆矩阵 cm confusion_matrix(split_y_test, rf_pred) sns.heatmap(cm, annotTrue, fmtd, cmapBlues) plt.xlabel(Predicted) plt.ylabel(Actual) plt.show() # ROC曲线 fpr, tpr, _ roc_curve(split_y_test, rf_model.predict_proba(split_X_test)[:, 1]) auc_score auc(fpr, tpr) plt.plot(fpr, tpr, labelfRF (AUC{auc_score:.4f})) plt.plot([0, 1], [0, 1], k--) plt.xlabel(False Positive Rate) plt.ylabel(True Positive Rate) plt.legend() plt.show()特征重要性分析这块容易被忽略但非常重要它能直接体现你的工作深度。随机森林训练后将feature_importances_和特征名对应输出取 Top 10 特征绘制柱状图放到论文里就是一张很有说服力的图。features split_X_train.columns importances rf_model.feature_importances_ feat_imp pd.DataFrame({feature: features, importance: importances}) feat_imp feat_imp.sort_values(importance, ascendingFalse).head(10) plt.figure(figsize(10, 6)) sns.barplot(ximportance, yfeature, datafeat_imp) plt.show()5. 部署运行时常见问题排查5.1 内存溢出的处理方法UNSW-NB15 完整数据约 250 万条记录直接pd.read_csv读取再加上独热编码内存占用可能轻松超过 8G。如果电脑配置一般会出现 MemoryError 或者程序运行到一半被系统卡死。实用解决方案读取时指定dtype参数缩减内存占用。UNSW-NB15 大部分数值特征不需要 float64 精度用 int32/float32 可以省一半内存。更简单的做法是只读取训练集和测试集不要合并全部 250 万条数据。df pd.read_csv(../data/UNSW_NB15_training-set.csv, dtype{sbytes: float32, dbytes: float32})如果这样还是内存不足建议使用 pandas 的chunksize参数分批读取配合特征筛选只保留相关性最高的 20~25 个特征参与建模。5.2 模型预测准确率低怎么调如果你跑出来的准确率只有 60%~70%大概率不是算法的问题而是数据预处理出了问题。常见的原因有三个一是类别编码不一致比如训练集用LabelEncoder编码后直接保存模型但预测时加载新数据没有用同一个编码器转换特征导致特征维度不匹配或顺序错乱。二是遗漏了关键特征列。UNSW-NB15 某些列如id、srcip、dstip、sport、dsport是不应该作为模型输入的它们是标识字段而非特征字段。如果你把 IP 地址和端口号也放进训练特征里模型确实会在训练集上表现优异但换到新数据上就完全失效。在做特征筛选时第一步就是去掉这个五元组信息。三是数据泄露。如果在数据清洗阶段不小心把测试集的信息也用来 fit 编码器或填充缺失值评估结果会偏乐观但真实部署时性能就会掉下来。# 删除非特征列 df df.drop([id, srcip, dstip, sport, dsport], axis1, errorsignore)5.3 训练时间过长的优化思路SVM 和 KNN 在 UNSW-NB15 上训练特别慢是预期内的事情不用慌。如果非要用这两个算法可以先用RandomUnderSampler将训练数据降到每个类别 1 万条以内或者用PCA把 45 维特征降到 20 维左右以加速距离计算。XGBoost 如果训练慢可以先减少n_estimators到 50、加大learning_rate到 0.3先验证流程能跑通再逐步提高迭代次数。import xgboost as xgb xgb_model xgb.XGBClassifier( n_estimators80, learning_rate0.1, max_depth6, subsample0.8, colsample_bytree0.8, eval_metriclogloss, random_state42 )6. 毕业设计场景下的配套工作6.1 论文结构建议与时序安排这个项目对应的毕业论文我建议按以下结构组织第一章是绪论重点讲入侵检测的背景、现有研究的不足、本课题的研究内容和意义第二章是相关技术介绍包括 UNSW-NB15 数据集的介绍和机器学习算法原理概述第三章是系统设计包括整体架构、数据预处理方案、特征工程方案、算法选择说明第四章是实验结果与分析包括实验环境、评估指标、多算法对比结果、典型案例分析第五章是总结与展望。时间上建议按“3 周完成数据和代码跑通、2 周完成实验对比、2 周撰写论文、1 周准备答辩材料”的节奏安排这样比较从容。很多同学把时间全部耗在前面调代码上结果论文只留了一周最后只能赶工质量很难保证。6.2 答辩必问的高频问题与对应策略问答环节是毕设的重头戏。根据我过往经验评委大概率会问以下问题问题一“为什么选这几个算法”策略不说“因为别人都用了”而是从算法原理角度回答——决策树和随机森林代表了单模型与集成学习的对比逻辑回归和朴素贝叶斯代表了线性模型与概率模型的基线XGBoost 代表了梯度提升框架KNN 和 SVM 代表了距离类和核方法。这样回答能体现你对机器学习算法谱系的整体理解。问题二“训练集和测试集是什么比例为什么不直接用数据集自带的划分”策略说明数据集官方已经提供了 train/test 划分但为了验证模型泛化能力你额外做了 8:2 的分层抽样交叉验证。这两个结果可以同时放进论文对比。问题三“只用了机器学习为什么不用深度学习”策略不要贬低深度学习而是说深度学习在入侵检测中确实效果好但可解释性弱、训练成本高本课题目的是探索传统机器学习在现代数据集上的性能边界同时为后续毕设之外引入深度学习的对比研究做铺垫。这样既诚恳又留有余地。问题四“这类系统的实际部署价值在哪里”策略结合工业界实际——企业安全运营中心SOC里的网络入侵检测系统NIDS需要实时性高、可解释性强的模型机器学习模型可以直接部署在特征提取引擎后对双向流量元数据进行打分。当然很多工业场景已经在用基于深度学习的方案但传统机器学习模型依然可以作为旁路检测、降低误报率的有效补充。6.3 如何基于此项目做功能扩展如果时间充裕建议做以下几个方向的扩展每一个都能写进论文的“下一步工作”里引入更多特征维度将 UNSW-NB15 与 CICIDS2017 数据集做迁移对比实验验证算法跨域泛化能力结合特征选择算法使用递归特征消除RFE或基于 L1 正则化的特征选择对比特征降维前后的性能变化尝试混合模型用集成学习做了 Stacking、Blending 等两层融合方案在准确率上往往比单个模型再高 1~2 个百分点网页可视化界面增强在 Flask 基础上增加文件上传检测、实时流量抓包分析、检测结果时间线等6.4 实操中的经验与避坑心得最后分享几个我做这个项目时踩过的坑对新手价值很大。第一数据预处理代码和建模代码一定要分开写分别保存为独立 py 文件。我一开始把预处理和训练写在一个脚本里后来每次调参都要重新跑一遍数据清洗浪费了大量时间。第二所有实验结果保存前要固定随机种子。不固定随机种子的话每次跑的结果都不完全一样写进论文的数据前后对不上答辩很尴尬。建议在项目入口统一设置random.seed(42)、np.random.seed(42)。第三模型保存用joblib.dump不要用pickle.dump。joblib 对大数组和 sklearn 模型对象的序列化更高效加载也不容易出兼容性问题。import joblib # 保存模型 joblib.dump(rf_model, ../models/random_forest.joblib) # 加载模型 loaded_model joblib.load(../models/random_forest.joblib)第四报告图表不要直接截屏用代码生成 PDF 或高分辨率 PNG 保存。论文排版时矢量图比位图清晰很多导师对图片质量的要求往往比想象中高。绘图时把dpi设置为 300并导出为 PDF 格式。plt.savefig(../results/rf_confusion_matrix.pdf, dpi300, bbox_inchestight)第五源码中如果带了 GUI 界面Flask或 Tkinter 写的部署时记得把debugTrue关掉否则本地端口会被占用而且在答辩演示时浏览器可能会弹出报错页面。把这些细节提前处理好演示过程自然会流畅很多。这个项目做完你不仅交出了一份完整毕设更重要的是把“数据清洗→特征工程→模型训练→效果评估→系统部署”这一整套机器学习落地流程完整走了一遍这个经验在工作和后续研究中都是通用的硬通货。本文还有配套的精品资源点击获取
返回列表