【深度学习】【机器学习】用神经网络进行入侵检测,NSL-KDD数据集,基于机器学习(深度学习)判断网络入侵

文章目录

  • 下载数据集NSL-KDD
  • 数据集介绍
  • 输入的41个特征
  • 输出的含义
  • 数据处理&&训练技巧
  • 建神经网络,输入41个特征,输出是那种类别的攻击
  • 模型训练
  • 模型推理
  • 写gradio前端界面,用户自己输入41个特征,后端用模型推理计算后显示出是否是dos攻击。
  • 使用方法:
  • 获取代码和模型

【深度学习】用神经网络进行入侵检测,NSL-KDD数据集,用TCP连接特征判断是否是网络入侵

下载数据集NSL-KDD

NSL-KDD数据集,有dos,u2r,r21,probe等类型的攻击,和普通的正常的流量,即是这样:

Normal:正常记录
DOS:拒绝服务攻击
PROBE:监视和其他探测活动
R2L:来自远程机器的非法访问
U2R:普通用户对本地超级用户特权的非法访问

数据集样子:

在这里插入图片描述

数据集介绍

https://towardsdatascience.com/a-deeper-dive-into-the-nsl-kdd-data-set-15c753364657
https://mathpretty.com/10244.html

输入的41个特征

下面是对TCP连接的41个特征的介绍:

特征编号特征名称特征描述类型范围
1duration连接持续时间,从TCP连接建立到结束的时间,或每个UDP数据包的连接时间连续[0, 58329]秒
2protocol_type协议类型,可能值为TCP, UDP, ICMP离散-
3service目标主机的网络服务类型,共70种可能值离散-
4flag连接状态,11种可能值,表示连接是否按照协议要求开始或完成离散-
5src_bytes从源主机到目标主机的数据的字节数连续[0, 1379963888]
6dst_bytes从目标主机到源主机的数据的字节数连续[0, 1309937401]
7land若连接来自/送达同一个主机/端口则为1,否则为0离散0或1
8wrong_fragment错误分段的数量连续[0, 3]
9urgent加急包的个数连续[0, 14]
10hot访问系统敏感文件和目录的次数连续[0, 101]
11num_failed_logins登录尝试失败的次数连续[0, 5]
12logged_in成功登录则为1,否则为0离散0或1
13num_compromisedcompromised条件出现的次数连续[0, 7479]
14root_shell若获得root shell 则为1,否则为0离散0或1
15su_attempted若出现"su root" 命令则为1,否则为0离散0或1
16num_rootroot用户访问次数连续[0, 7468]
17num_file_creations文件创建操作的次数连续[0, 100]
18num_shells使用shell命令的次数连续[0, 5]
19num_access_files访问控制文件的次数连续[0, 9]
20num_outbound_cmds一个FTP会话中出站连接的次数连续0
21is_hot_login登录是否属于“hot”列表,是为1,否则为0离散0或1
22is_guest_login若是guest登录则为1,否则为0离散0或1
23count过去两秒内,与当前连接具有相同的目标主机的连接数连续[0, 511]
24srv_count过去两秒内,与当前连接具有相同服务的连接数连续[0, 511]
25serror_rate过去两秒内,在与当前连接具有相同目标主机的连接中,出现“SYN”错误的连接的百分比连续[0.00, 1.00]
26srv_serror_rate过去两秒内,在与当前连接具有相同服务的连接中,出现“SYN”错误的连接的百分比连续[0.00, 1.00]
27rerror_rate过去两秒内,在与当前连接具有相同目标主机的连接中,出现“REJ”错误的连接的百分比连续[0.00, 1.00]
28srv_rerror_rate过去两秒内,在与当前连接具有相同服务的连接中,出现“REJ”错误的连接的百分比连续[0.00, 1.00]
29same_srv_rate过去两秒内,在与当前连接具有相同目标主机的连接中,与当前连接具有相同服务的连接的百分比连续[0.00, 1.00]
30diff_srv_rate过去两秒内,在与当前连接具有相同目标主机的连接中,与当前连接具有不同服务的连接的百分比连续[0.00, 1.00]
31srv_diff_host_rate过去两秒内,在与当前连接具有相同服务的连接中,与当前连接具有不同目标主机的连接的百分比连续[0.00, 1.00]
32dst_host_count前100个连接中,与当前连接具有相同目标主机的连接数连续[0, 255]
33dst_host_srv_count前100个连接中,与当前连接具有相同目标主机相同服务的连接数连续[0, 255]
34dst_host_same_srv_rate前100个连接中,与当前连接具有相同目标主机相同服务的连接所占的百分比连续[0.00, 1.00]
35dst_host_diff_srv_rate前100个连接中,与当前连接具有相同目标主机不同服务的连接所占的百分比连续[0.00, 1.00]
36dst_host_same_src_port_rate前100个连接中,与当前连接具有相同目标主机相同源端口的连接所占的百分比连续[0.00, 1.00]
37dst_host_srv_diff_host_rate前100个连接中,与当前连接具有相同目标主机相同服务的连接中,与当前连接具有不同源主机的连接所占的百分比连续[0.00, 1.00]
38dst_host_serror_rate前100个连接中,与当前连接具有相同目标主机的连接中,出现SYN错误的连接所占的百分比连续[0.00, 1.00]
39dst_host_srv_serror_rate前100个连接中,与当前连接具有相同目标主机相同服务的连接中,出现SYN错误的连接所占的百分比连续[0.00, 1.00]
40dst_host_rerror_rate前100个连接中,与当前连接具有相同目标主机的连接中,出现REJ错误的连接所占的百分比连续[0.00, 1.00]
41dst_host_srv_rerror_rate前100个连接中,与当前连接具有相同目标主机相同服务的连接中,出现REJ错误的连接所占的百分比连续[0.00, 1.00]

这个表格提供了关于TCP连接的41个特征的详细介绍,包括特征编号、特征名称、特征描述、类型以及范围。

输出的含义

数据集是一个csv表格,倒数第二列就是类别标签,大类其实就五个:

['normal', 'dos', 'probe', 'r2l', 'u2r']

但csv里写的详细的标签:
在这里插入图片描述

可以通过这个程序转换:

# 结果标签转换为数字
dos_type = ['back', 'land', 'neptune', 'pod', 'smurf', 'teardrop', 'processtable', 'udpstorm', 'mailbomb','apache2']
probing_type = ['ipsweep', 'mscan', 'nmap', 'portsweep', 'saint', 'satan']
r2l_type = ['ftp_write', 'guess_passwd', 'imap', 'multihop', 'phf', 'warezmaster', 'warezclient', 'spy', 'sendmail','xlock', 'snmpguess', 'named', 'xsnoop', 'snmpgetattack', 'worm']
u2r_type = ['buffer_overflow', 'loadmodule', 'perl', 'rootkit', 'xterm', 'ps', 'httptunnel', 'sqlattack']
type2id = {'normal': 0}
for i in dos_type:type2id[i] = 1
for i in r2l_type:type2id[i] = 2
for i in u2r_type:type2id[i] = 3
for i in probing_type:type2id[i] = 4

数据处理&&训练技巧

数据预处理

讨论原始网络数据面临的挑战:高维度、类别特征和连续特征。

使用的技术:

对类别数据(协议类型、服务和标志)进行独热编码。

标准化连续特征以处理不同的尺度。

如何处理缺失数据(如果有),通过插值或删除。

使用StandardScaler和pickle保存缩放参数以保持一致的预处理。

处理不平衡数据

讨论入侵检测数据集中的不平衡问题。

介绍ImbalancedDatasetSampler的使用及其如何帮助实现平衡的小批量。

使用此类采样器对深度学习模型训练的好处。

模型架构

解释两个提出的模型:BGRUNet2和AttentionModel。

详细介绍GRU(门控循环单元)层、双向性和注意力机制。

权重初始化技术,如Xavier和Kaiming初始化。

使用Dropout和Batch Normalization防止过拟合。

训练技巧

使用CosineAnnealingLR进行学习率调度,以适应性地调整学习率。

选择Adam优化器而非传统的SGD的原因。

损失函数的选择及其对模型训练的影响。

实验设置

数据加载器和批处理过程的描述。

利用GPU进行高效模型训练。

在训练过程中评估模型准确性和损失的过程。

建神经网络,输入41个特征,输出是那种类别的攻击

神经网络模型:


class BGRUNet2(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(BGRUNet2, self).__init__()self.hidden_size = hidden_sizeself.gru = nn.GRU(input_size, hidden_size, batch_first=True, bidirectional=True)self.fc1 = nn.Linear(hidden_size * 2, 512)  # Multiply hidden size by 2 for bidirectionalself.fc2 = nn.Linear(512, 64)self.fc3 = nn.Linear(64, output_size)self.dropout = nn.Dropout(0.2)# Initialize GRU weightsfor name, param in self.gru.named_parameters():if 'weight_ih' in name:init.xavier_uniform_(param.data)elif 'weight_hh' in name:init.orthogonal_(param.data)elif 'bias' in name:param.data.fill_(0)# Initialize fully connected layer weightsinit.xavier_uniform_(self.fc1.weight)init.xavier_uniform_(self.fc2.weight)init.xavier_uniform_(self.fc3.weight)# Initialize fully connected layer biasesinit.zeros_(self.fc1.bias)init.zeros_(self.fc2.bias)init.zeros_(self.fc3.bias)def forward(self, x):# Initialize hidden state for bidirectional GRUh0 = torch.zeros(2, x.size(0), self.hidden_size).to(x.device)  # 2 for bidirectional# Forward pass through GRUout, _ = self.gru(x, h0)# Concatenate the hidden states from both directionsout = torch.cat((out[:, -1, :self.hidden_size], out[:, 0, self.hidden_size:]), dim=1)out = self.dropout(out)out = F.relu(self.fc1(out))out = self.dropout(out)out = F.relu(self.fc2(out))out = self.dropout(out)return self.fc3(out)

模型训练

训练30轮,准确度最高97.2%:

在这里插入图片描述

随着训练轮数的变化,损失的变化:

在这里插入图片描述

模型推理

加载模型后,构建输入数据,模型推导得出结果:

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = BGRUNet2(input_size=122, hidden_size=256, output_size=5)
model.load_state_dict(torch.load('model_accuracy_max.pth', map_location=device))
model.to(device)
model.eval()
time1 = time.time()
with torch.no_grad():X = X.to(device)outputs = model(X)# softmaxoutputs = F.softmax(outputs, dim=1)_, predicted = torch.max(outputs.data, 1)time2 = time.time()

写gradio前端界面,用户自己输入41个特征,后端用模型推理计算后显示出是否是dos攻击。

运行代码后访问:http://127.0.0.1:7869/

可以看到:
在这里插入图片描述

填写特征太多,有点懒得填,可以拉到最底下,有例子,可以点一下例子数据:

在这里插入图片描述

然后点一下Submit,模型推流后给出结果,可以看到,模型认为这次TCP连接数据表明了这是probe入侵,概率是1,模型推理消耗了0.002秒。

在这里插入图片描述

使用方法:

在这里插入图片描述

执行python run2.py。即可开启训练。

执行python infer.py。即可开启gradio前端界面。

获取代码和模型

go:

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/288641.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务(基础篇-006-Docker)

Docker是一个开源的应用容器引擎,它让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间没有任何接口(类似 iPhone 的 app&…

【OpenCV】 OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信

OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Python、Ruby、MATLAB等语…

阿里云实时计算Flink的产品化思考与实践【上】

摘要:本文整理自阿里云高级产品专家黄鹏程和阿里云技术专家陈婧敏在 FFA 2023 平台建设专场中的分享。内容主要为以下五部分: 阿里云实时计算 Flink 简介产品化思考产品化实践SQL 产品化思考及实践展望 该主题由黄鹏程和陈婧敏共同完成,前半程…

BaseDao封装JavaWeb的增删改查

目录 什么是BaseDao? 为什么需要BaseDao? BaseDao的实现逻辑 什么是BaseDao? Basedao 是一种基于数据访问对象(Data Access Object)模式的设计方法。它是一个用于处理数据库操作的基础类,负责封装数据库…

Adobe推出20多个,企业版生成式AI定制、微调服务

3月27日,全球多媒体领导者Adobe在拉斯维加斯召开“Summit 2024”大会,重磅推出了Firefly Services。 Firefly Services提供了20 多个生成式AI和创意API服务,支持企业自有数据对模型进行定制、微调,同时可以与PS、Illustrator、Ex…

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战 一、生产事故描述 Mysql生产数据库最大连接数爆满,其余客户端也同样拿不到数据库连接,生产异常,数据传输失败! 报错如下&#xff1a…

架构师之路--Docker的技术学习路径

Docker 的技术学习路径 一、引言 Docker 是一个开源的应用容器引擎,它可以让开发者将应用程序及其依赖包打包成一个可移植的容器,然后在任何支持 Docker 的操作系统上运行。Docker 具有轻量级、快速部署、可移植性强等优点,因此在现代软件开…

解决kubesphere流水线docker登陆错误http: server gave HTTP response to HTTPS client

kubesphere DevOps流水线中,在登录私有的harbor仓库时,报以下错误 docker login 111.230.19.120:80 -u admin -p test123. WARNING! Using --password via the CLI is insecure. Use --password-stdin. Error response from daemon: Get "https://…

使用vue构建一个简单实用的春节红包插件!

摘要:本文将介绍如何使用Vue.js构建一个简单实用的春节红包插件。该插件通过模拟红包的打开和关闭过程,以及金额的随机分配,为春节红包活动提供了一个有趣且互动的体验。 一、引言 在春节这个充满欢乐和祝福的时刻,红包成为了传递…

pt-archiver的实践分享,及为何要用 ob-archiver 归档数据的探讨

作者简介:肖杨,软件开发工程师 在数据密集型业务场景中,数据管理策略是否有效至关重要,它直接关系到系统性能与存储效率的提升。数据归档作为该策略的关键环节,不仅有助于优化数据库性能,还能有效降低存储成…

11.2024

插入排序 代码&#xff1a; public class 第十一题 {public static void main(String[] args) {int a[]{2,2,1,6,4,9,7,6,8};for (int k1;k<a.length;k){int sk-1;//排好序的最后一位int sssa[k];//记录哨兵的值while (s>0&&sss<a[s]){a[s1]a[s];s--;}a[s1]…

Python中的变量与常量

变量&#xff1a;在程序运行过程中&#xff0c;值会发生变化的量&#xff0c; 常量&#xff1a;在程序运行过程中&#xff0c;值不会发生变化的量。 无论是变量还是常量&#xff0c;在创建时都会在内存中开辟一块空间&#xff0c;用于保存它的值。 Python 中的变量不需要声明…

数仓建设实践——58用户画像数仓建设

目录 一、数据仓库&用户画像简介 1.1 数据仓库简介 1.2 数据仓库的价值 1.3 用户画像简介 1.4 用户画像—标签体系 二、用户画像数仓建设过程 2.1 画像数仓—背景&现状 2.2 画像数仓—整体架构 2.3 画像数仓—研发流程 2.4 画像数仓—指标定义 2.5 画像数仓…

基于大语言模型的云故障根因分析|顶会EuroSys24论文

*马明华 微软主管研究员 2021年CCF国际AIOps挑战赛程序委员会主席&#xff08;第四届&#xff09; 2021年博士毕业于清华大学&#xff0c;2020年在佐治亚理工学院做访问学者。主要研究方向是智能运维&#xff08;AIOps&#xff09;、软件可靠性。近年来在ICSE、FSE、ATC、EuroS…

【b站李炎恢】Vue.js Element UI | 十天技能课堂 | 更新中... | 李炎恢

课程地址&#xff1a;【Vue.js Element UI | 十天技能课堂 | 更新中... | 李炎恢】 https://www.bilibili.com/video/BV1U54y127GB/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 备注&#xff1a;虽然标题声明还在更新中&#xff0c;但是看一些常用…

一键换脸的facefusion

FaceFusion 一个开源换脸软件&#xff0c;提供UI界面&#xff0c;启动后可直接在浏览器上面上传图片进行换脸操作。 电脑环境win10&#xff0c;软件pycharm&#xff0c;需要提前安装好python环境&#xff0c;推荐使用Anaconda3。关注文章下方公共号发送 “ 软件安装包 ”可以获…

Docker搭建LNMP环境实战(06):Docker及Docker-compose常用命令

Docker搭建LNMP环境实战&#xff08;06&#xff09;&#xff1a;Docker及Docker-compose常用命令 此处列举了docker及docker-compose的常用命令&#xff0c;一方面可以做个了解&#xff0c;另一方面可以在需要的时候进行查阅。不一定要强行记忆&#xff0c;用多了就熟悉了。 1、…

sheng的学习笔记-AI-YOLO算法,目标检测

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录 目标定位&#xff08;Object localization&#xff09; 定义 原理图 具体做法&#xff1a; 输出向量 图片中没有检测对象的样例 损失函数 ​编辑 特征点检测&#xff08;Landmark detection&#xff09; 定义&a…

Day23:事务管理、显示评论、添加评论

事务管理 事务的定义 什么是事务 事务是由N步数据库操作序列组成的逻辑执行单元&#xff0c;这系列操作要么全执行&#xff0c;要么全放弃执行。 事务的特性(ACID) 原子性(Atomicity):事务是应用中不可再分的最小执行体&#xff08;事务中部分执行失败就会回滚 。一致性(C…

R语言 for循环问题

今天偶然发现在R的for循环中&#xff0c;作为循环计次的i&#xff0c; 并不会因为在循环体中的赋值变化而变化。 记录一下&#xff0c;还没有找到相关的解释。