尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

入侵检测项目实战:Python机器学习与深度学习双路线源码解析

入侵检测项目实战:Python机器学习与深度学习双路线源码解析 简介这是一套基于机器学习与深度学习的入侵检测完整项目面向计算机专业毕业设计、课程设计与期末大作业场景也适合需要实战练习的初学者。项目围绕网络流量数据从预处理到模型训练、评估与预测的完整流程展开涵盖特征提取、相关性分析、不平衡处理、归一化与标签编码等经典步骤并分别实现CNN与LSTM两类深度学习模型附有模型训练、预测脚本及二分类演示程序代码结构清晰可运行复现。资源共31个文件包括14个Python源程序、3个CSV数据集、5个TXT说明、3个Markdown文档、2个HDF5权重文件、1份Word技术方案等压缩包整体约26.58MB便于下载与本地部署。项目经导师指导并获99分高分评价已有95人学习使用资料完整且附带使用说明既可作为课设/毕设的完整参考方案也能帮助学习者快速掌握入侵检测建模全流程。1. 入侵检测项目怎么落地这份 Python 双路线源码包能直接复现入侵检测Intrusion Detection在国内课程设计里其实被低估了大多数人卡住的不是模型调参而是第一步数据集不知道选哪个预处理做到一半报错好不容易跑通又发现准确率上不去。这份基于 Python 的、用机器学习与深度学习实现的入侵检测项目源码用的是 UNSW-NB15 数据集同时给了机器学习随机森林和深度学习CNN、LSTM两条完整路线还带技术方案文档、参考论文和使用说明。适合正在做毕设、课程设计、期末大作业的计算机专业学生也适合想拿真实安全数据集练手的学习者。它能解决的是从原始流量数据到论文里的结果图表这一整条通路的问题。2. 先把数据收拾干净UNSW-NB15 预处理与不平衡处理做入侵检测这几年我最大的感受是数据端花的精力通常比模型多尤其这种安全类数据集。好消息是这份资源把重心压在了预处理上脚本拆得很细建议按 readme 的顺序跑不要直接上来就训模型。2.1 目录结构先看懂少走弯路拿到压缩包先别急着解压跑代码先花五分钟把目录过一遍。这个结构设计得比较规矩数据、算法、文档三层分开找东西很快。路径内容data/UNSW_NB15.zip原始数据集压缩包data/Process_data.zip预处理后的中间数据data/train.csv、test.csv划分好的可直接建模数据data/2_feture.csv精简特征后的中间产物ML/随机森林、特征选择、不平衡处理、可视化脚本cnn/CNN 训练脚本、预测脚本、结果目录lstm/LSTM 训练脚本、预测脚本、结果目录doc/入侵检测-技术方案文档readme.md、IDS.md使用说明与项目说明train.csv 和 test.csv 是 pandas 直接能读的成品数据想快速验证流程的话用它俩就够了。UNSW_NB15.zip 是原始数据用来写论文里“数据来源与预处理”那一节的别一上来就死磕原数据。2.2 UNSW-NB15 数据集的特点与二分类任务定义UNSW-NB15 是悉尼新南威尔士大学出的网络安全数据集特点是特征维度多、攻击类型覆盖广。原数据大概有 49 个特征维度包含正常流量和 9 种攻击类型。训练集约 17 万条、测试集约 8 万条具体数量以你解压出来的文件为准。这个项目做的是二分类正常流量和攻击流量。攻击类型统一映射成 1正常流量映射成 0。二分类的好处是模型简单、指标好看适合课程设计和毕设如果导师要求更高后面第 6 章会给多分类的改法。2.3 预处理管线get_feature → Min-max → Lable_encoder预处理链路就是数据从原始 csv 到能喂给模型的过程。项目里 get_feature.py 干的是特征提取和标签映射核心逻辑大致是这样import pandas as pd df pd.read_csv(data/train.csv, encodingutf-8) # 二分类标签映射Normal 为 0其余攻击类型统一为 1 df[label_bin] df[attack_cat].apply(lambda x: 0 if x Normal else 1) # 特征列与标签分离attack_cat 只在映射时用不进模型 X df.drop(columns[label_bin, attack_cat], errorsignore) y df[label_bin]这里的 errorsignore 是有讲究的不同版本的 UNSW-NB15 预处理文件列名可能差一两个字符加上它列不存在时不会直接崩掉。标签映射放在特征提取这一步做后面无论跑哪条路线都省事。接下来是 Min-max.py 的归一化处理from sklearn.preprocessing import MinMaxScaler scaler MinMaxScaler(feature_range(0, 1)) X_scaled scaler.fit_transform(X)UNSW-NB15 的特征量纲差距非常大有的字段到几千有的在小数区间徘徊。不归一化的话模型训练时梯度会被大数值特征带偏。归一化之后后续无论走随机森林还是 CNN 都舒服。最后是 Lable_encoder.py 的标签处理。二分类场景下 Y 基本就是个 0/1 数组但如果你后面想扩展到多分类用 LabelEncoder 处理攻击类别是少不了的from sklearn.preprocessing import LabelEncoder le LabelEncoder() y_encoded le.fit_transform(y) # 多分类时保存类别映射预测阶段要用 classes_ le.classes_2.4 样本不平衡是绕不过去的坎UNSW-NB15 有个非常典型的问题类别不均衡。Generic 类攻击样本量大而 Analysis、Backdoors 这类只有几百条。直接拿原始数据训练模型很容易学成“哑巴”——全判成多数类准确率看起来不低实际上攻击类别召回率惨不忍睹。项目里的 Process_Imbanlce.py 就是在处理这个事。常见做法是用 SMOTE 过采样把少数类样本合成出来from imblearn.over_sampling import SMOTE smote SMOTE(random_state42, k_neighbors5) X_resampled, y_resampled smote.fit_resample(X_scaled, y_encoded)SMOTE 不是简单复制样本而是在少数类样本的近邻之间插值生成新样本。k_neighbors 控制近邻数量默认 5 在大多数场景够用random_state 固定住保证每次跑出来的数据一致。这里有个大前提我在第 5 章会展开SMOTE 必须在 train_test_split 之后只对训练集做否则会造成数据泄漏验证指标全是假的。2.5 Get_corr.py 相关性分析与 3d.py 可视化这两个脚本的功能在课程设计里很讨巧。Get_corr.py 做的是特征相关性矩阵用热力图展示特征之间的关系。我一般会先跑它如果有两个特征相关系数超过 0.95就删掉其中一个避免冗余特征干扰模型import seaborn as sns import matplotlib.pyplot as plt corr_matrix pd.DataFrame(X_scaled).corr() sns.heatmap(corr_matrix, cmapRdBu_r, center0) plt.savefig(res/corr_heatmap.png, dpi300) plt.close()3d.py 做的是三维散点图把数据降到三个维度后可视化正常流量和攻击流量的分布。这两张图放进论文的“数据分析”小节答辩时很有说服力比空口讲“数据来自公开数据集”强得多。3. 机器学习基线与随机森林先拿到能复现的分数做完数据预处理下一步不是直接上深度学习而是先跑一个机器学习基线。这是我在多个入侵检测项目里养成的习惯理由就两个一是快几分钟出结果二是稳后面 CNN、LSTM 效果再差也有个对照物。3.1 基线为什么选随机森林入侵检测的表格数据有几个特点特征维度不算高、存在非线性关系、类别分布不均衡。随机森林对这种场景非常稳它通过多棵决策树投票天然能处理非线性特征对异常值和噪声也有一定容忍度。另一个现实好处是随机森林有 feature_importances_ 属性可以直接输出每个特征的重要性排序这是写论文“特征选择”章节的好素材。CNN 和 LSTM 在这个项目里是加分项但如果没有一个“及格线”对照深度学习的提升就体现不出来。答辩时导师问一句“你那个深度学习比传统方法好在哪”拿随机森林的数据一对比回答就有了依据。3.2 RFP.py训练一个随机森林分类器ML 目录下的 RFP.py 就是随机森林的实现核心参数如下from sklearn.ensemble import RandomForestClassifier rf RandomForestClassifier( n_estimators100, max_depthNone, min_samples_leaf1, random_state42, n_jobs-1 ) rf.fit(X_train, y_train)参数含义和调整空间n_estimators树的数量。100 是性价比很高的位置加树不一定线性变好但训练时间线性增长。max_depthNone树不限制深度靠随机森林自身的随机性防过拟合。如果训练集分数明显高于测试集再手动限深度。min_samples_leaf1叶子节点最小样本数。数据量大时不用动小数据集可以提到 2~5 压过拟合。n_jobs-1使用全部 CPU 核UNSW-NB15 数据量不算小这个参数能省不少时间。3.3 classify.py评估指标要看清入侵检测项目里最常犯的错是死盯准确率但准确率在类别不均衡的数据上会骗人。假设数据里 90% 是攻击流量模型无脑全判成攻击准确率就有 90%这个模型却一点用没有。所以 classify.py 里重点看的是精确率、召回率、F1 和混淆矩阵from sklearn.metrics import classification_report, confusion_matrix y_pred rf.predict(X_test) print(classification_report(y_test, y_pred, digits4))三个指标在入侵检测里的侧重点精确率判为攻击的样本里真正是攻击的比例。高意味着误报少。召回率真正的攻击里被检出来的比例。高意味着漏报少。入侵检测场景里召回率通常比精确率更重要漏掉一次攻击的代价远大于多报几次警。3.4 特征重要性项目答辩的天然素材随机森林自带特征重要性输出这是我从第 3 章开始就提的一个白嫖点import pandas as pd importance pd.Series(rf.feature_importances_, indexX_train.columns) importance.nlargest(10).plot(kindbarh)把 top10 特征画出来贴在论文里就是一张“基于随机森林的特征重要性分析图”。配合前面 Get_corr.py 的相关性热力图特征工程这部分的论述就完整了基本不用额外编内容。4. 深度学习双路线CNN 与 LSTM 的实战参数与结果对比深度学习部分用的是 PyTorchcnn 和 lstm 两个目录各自独立训练脚本和预测脚本分开结构清晰。如果你跑过其他 PyTorch 项目这套代码上手很快。4.1 cnn_pytorch.pyCNN 怎么吃表格数据CNN 处理表格数据有个前置问题它天生是为图像设计的输入要求是 (batch, channels, height, width) 这种结构。UNSW-NB15 是 49 维的表格数据不是图片所以得先做一次维度变换。项目里用的是把它当成 1D 信号处理即每个样本是一个长度为 49 的序列经过 unsqueeze 补成 (batch, 1, 49) 的形状其中 1 是通道数。cnn_pytorch.py 里的网络结构大致长这样import torch.nn as nn class CNN1D(nn.Module): def __init__(self, input_dim49): super().__init__() self.conv nn.Sequential( nn.Conv1d(1, 64, kernel_size3, padding1), nn.ReLU(), nn.MaxPool1d(2), nn.Conv1d(64, 128, kernel_size3, padding1), nn.ReLU(), nn.AdaptiveAvgPool1d(1) ) self.fc nn.Sequential( nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 1) ) def forward(self, x): x self.conv(x) x x.view(x.size(0), -1) return self.fc(x)几个容易踩的点Conv1d 的第一个参数被写成 1 而不是 49因为样本先被 reshape 成了单通道序列AdaptiveAvgPool1d(1) 代替固定尺寸的池化好处是即使输入长度变了网络也不报错最后的全连接输出维度是 1因为二分类只用输出一个 logit配合 BCEWithLogitsLoss 用。4.2 cnn_train.py训练循环与关键参数训练脚本的核心参数集中在优化器和损失函数上import torch.optim as optim optimizer optim.Adam(model.parameters(), lr0.001) criterion nn.BCEWithLogitsLoss() for epoch in range(20): # 项目里 cnn_train.py 有完整的 batch 训练循环 optimizer.zero_grad() outputs model(batch_x) loss criterion(outputs, batch_y.float()) loss.backward() optimizer.step() torch.save(model.state_dict(), fcnn/res/cnn_epoch{epoch}.pth)参数说明BCEWithLogitsLoss 内部自带 Sigmoid不需要在网络末尾再显式加 Sigmoid 层。预测阶段要输出概率时才手动加。Adam 初始学习率 0.001 是通用起点。如果 loss 在几个 epoch 后不降再降到 0.0001。每个 epoch 保存一次权重这叫“后悔药”万一后面跑挂了能回滚到之前的效果最好的那一次。4.3 lstm_train.py / lstm_predict.py时序建模的坑LSTM 的设计初衷是处理序列数据UNSW-NB15 本身是流量记录不是时间序列但特征列可以当作一个“序列”塞进去。LSTM 的输入形状是 (batch, seq_len, features)。在表格数据场景里常见做法是把 49 维特征 reshape 成 (batch, 49, 1)即序列长度 49每个时间步一个特征import torch.nn as nn class LSTMNet(nn.Module): def __init__(self, input_size1, hidden_size128, num_layers2): super().__init__() self.lstm nn.LSTM( input_size, hidden_size, num_layers, batch_firstTrue ) self.fc nn.Linear(hidden_size, 1) def forward(self, x): out, _ self.lstm(x) out out[:, -1, :] # 取最后一个时间步的输出 return self.fc(out)这里 batch_firstTrue 是必须的它让输入形状变成 (batch, seq_len, features)而不是 PyTorch 默认的 (seq_len, batch, features)不然数据送进去直接维度错乱。out[:, -1, :] 取的是最后一个时间步的隐藏状态这是 LSTM 做分类任务的标准操作。lstm_predict.py 负责加载训练好的权重做预测加载姿势要记住 model.eval()model LSTMNet(input_size1, hidden_size128, num_layers2) model.load_state_dict(torch.load(lstm/res/best_model.pth)) model.eval() # 关掉 dropout固定 batchnorm 统计量 with torch.no_grad(): pred model(new_data)model.eval() 这个细节很多人会漏。不调用它模型里的 Dropout 层在推理时还在随机丢神经元每次预测结果都会有波动。4.4 三模型结果怎么对比跑完三条路线之后把随机森林、CNN、LSTM 的指标汇总成一张表这是答辩和论文结论部分的核心素材。模型结构要点训练耗时量级适合场景随机森林100 棵树无需 GPU分钟级快速出基线、特征重要性分析CNN两层 Conv1d 全连接GPU 上分钟级捕获局部特征精度上限高LSTM两层 LSTM 全连接GPU 上分钟级CPU 偏慢有序列建模需求时可用具体数值以你机器上跑出来的为准资源包里也带了一张 cnn_pytorch_acc.jpg 结果图可以作为参考对照。我自己的经验区间是随机森林二分类准确率通常能到 85%~90%CNN 和 LSTM 调好参之后在此基础上还能小幅往上走。如果你的结果明显低于这个范围优先回看第 2 章的预处理链路是不是漏了哪一步。5. 避坑指南入侵检测项目最容易翻车的五个地方这个项目我前后跑过几遍也帮人排查过问题踩坑点相对固定。写在这里你遇到类似报错可以少走弯路。5.1 维度不匹配49 维特征塞进卷积层就报错现象执行 cnn_train.py 直接报 RuntimeError: Expected 3D input for Conv1d或者 size mismatch。原因Conv1d 期望的输入形状是 (batch, channels, length)如果把原始数据直接 (batch, 49) 塞进去维度对不上必炸。解决在送入网络前先补通道维度。常见做法是 x x.unsqueeze(1)把 (batch, 49) 变成 (batch, 1, 49)。如果不确定打印一次 batch 数据的 shape一秒定位问题。5.2 准确率 99% 但你被骗了现象测试集准确率到了 99%但混淆矩阵里攻击类别召回率一塌糊涂或者反过来训练集分很高、测试集完全没法看。原因大概率是数据泄漏。两个典型操作会引发这个问题一是 MinMaxScaler 在 train_test_split 之前对整个数据集做 fit_transform归一化时偷看了测试集的统计量二是 SMOTE 在划分之前做生成的合成样本横跨训练集和测试集模型相当于提前见过了测试集的邻居。解决先 train_test_split再只对训练集 fit scaler之后用同一个 scaler transform 测试集SMOTE 也一样fit_resample 只扑向训练集测试集保持原始分布。这是预处理链路里最不能省的顺序。5.3 csv 编码与中文路径现象pandas 读取数据报 UnicodeDecodeError: gbk codec cant decode byte或者模型保存加载时找不到文件。原因Windows 下 pandas 的 read_csv 默认用 gbk 编码而这个资源里的 csv 文件是 utf-8 编码两个对不上就崩。路径带中文也有类似问题PyTorch 某些版本对中文路径的兼容性不好。解决读文件时显式指定 encodingutf-8必要时加 errorsignore 兜底整个项目目录不要放在带中文的路径下也别解压到桌面“新建文件夹”这类带空格的路径。5.4 PyTorch 环境与显存现象运行时报 ModuleNotFoundError: No module named torch或者 CUDA out of memory。原因前者是环境没装 PyTorch而且这个是 CPU 版和 GPU 版的安装命令不一样直接 pip install torch 经常会装成 CPU 版但代码里又调用了 cuda后者是小显存机器硬跑大 batch_size。解决严格按 requirements.txt 安装版本。没有 GPU 就明确设 device torch.device(cpu)虽然训练慢点但这个数据量完全能跑。显存不足就把 batch_size 从 64 降到 32 或 16。5.5 UNSW-NB15 数据解压后对不上现象训练脚本报找不到 train.csv或者读进来的行数和 readme 里说的对不上。原因zip 文件解压后是嵌套目录Process_data.zip 是处理后的中间数据需要先解压到 data 目录下如果直接读 UNSW_NB15.zip 里的原始文件格式和列名都对不上。解决先按 readme 的目录要求摆放文件train.csv 和 test.csv 是已经划分好的成品数据优先用它们跑通全流程原始数据留给写论文时描述预处理过程用。6. 把二分类扩成多分类混淆矩阵与模型复用的完整流程项目默认是二分类但很多学校的毕设要求会比这个高一层导师常问的一句话是“你能识别出是哪一类攻击吗”这一章给你一个直接把现成项目改成多分类的方法改动量很小。多分类改造只需要动三个地方。第一标签不再用 0/1 映射而是用 LabelEncoder 把 attack_cat 完整编码第二模型输出层神经元数从 1 改成类别数UNSW-NB15 有 9 种攻击加正常流量就是 10第三损失函数从 BCEWithLogitsLoss 换成 CrossEntropyLoss。代码改动大致是这样import torch.nn as nn class CNN1DMulti(nn.Module): def __init__(self, input_dim49, num_classes10): # 网络主体和二分类一样只改最后一层 self.fc nn.Sequential( nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, num_classes) # 输出 10 类 logits ) criterion nn.CrossEntropyLoss()保存模型时把类别映射一起存进去后面用 cnn_predict.py 预测才不会拿到一个数字却不知道它对应哪种攻击import torch ckpt { model_state: model.state_dict(), classes: le.classes_ # [Analysis, Backdoors, ..., Worms] } torch.save(ckpt, res/multi_class_cnn.pth)加载预测时用 map_location 解决环境差异然后逐个攻击类别看混淆矩阵ckpt torch.load(res/multi_class_cnn.pth, map_locationcpu) model.load_state_dict(ckpt[model_state]) model.eval() # 预测并还原攻击类别 pred_idx torch.argmax(model(new_data), dim1) pred_label ckpt[classes][pred_idx]逐类看混淆矩阵时你会注意到一个规律Generic 类和 Exploits 类之间经常互相误判因为二者在部分流量特征上确实相似而 Backdoors、Analysis 这类少数类样本量少模型容易把它们漏掉。这正好是论文“结果分析与不足”章节的素材——不是简单的“准确率 xx%”而是具体到哪类攻击容易被漏、背后的原因是什么。答辩时能讲出这一层比单报一个准确率数字有说服力得多。从那以后我拿到任何一个入侵检测类的项目第一件事永远是先跑通数据处理链路把每个中间文件的 shape 和分布 print 出来看一眼确认没问题再碰模型。这个习惯帮我避掉了至少五六次因为数据泄漏导致的返工。数据没洗干净之前调模型全是在赌运气希望这次的拆解能帮你把这条路上最深的坑提前填上。希望帮到你。本文还有配套的精品资源点击获取
返回列表