恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Python贝叶斯、KNN、神经网络入侵检测实战:从数据预处理到模型对比

  • 首页
  • 资讯中心
  • /
  • Python贝叶斯、KNN、神经网络入侵检测实战:从数据预处理到模型对比

相关资讯

NUAA编译原理课设:PL/0编译器从架构到代码生成实战 2026/10/12 12:44:39
IDC机房设计指南:从功率密度、UPS容量到制冷与验证全流程 2026/10/12 12:44:39
SpringBoot+Vue+MyBatis在线考试系统源码解析:从数据库设计到部署实践 2026/10/12 12:39:39

最新资讯

Codex 把 Markdown 转 PDF 简历:TaoToken 统一 Key 的 GitHub 工作流大纲
毕设级中文新闻标题分类系统:TF-IDF+LDA+SVM全流程实现
页面倒计时用 localStorage 缓存:setInterval 刷新与恢复的完整实现
EasyAR+ARCore组合在工业AR中的实战应用与性能优化
Java并发编程实战:从线程状态到线程池的避坑指南
基于RNN/LSTM的锂电池寿命预测:从CALCE数据集到可视化全流程

今日推荐

Debian新手入门:从部署到日常操作的完整指南
MongoDB复制集扩缩容实战:从rs.add到选主事故复盘
条形码目标检测数据集实战:从YOLOv8训练到部署

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

Python贝叶斯、KNN、神经网络入侵检测实战:从数据预处理到模型对比

发布时间:2026/10/12 12:44:39
Python贝叶斯、KNN、神经网络入侵检测实战:从数据预处理到模型对比 简介这份资源面向网络安全初学者与机器学习实践者提供一套基于Python的入侵检测完整实现方案围绕贝叶斯分类、神经网络与K近邻三种算法展开对比实验。项目采用KDD Cup数据集抽样约8万条记录按8:2划分训练集与测试集覆盖数据预处理、模型训练、性能评估全流程帮助读者理解不同算法在异常流量识别中的适用场景与优劣差异。压缩包共52个文件约3.39MB包含6个Python源码文件、4个pkl与2个pth模型文件、23张结果图及9个HTML评估页面另附csv数据集、README说明与LICENSE协议结构清晰便于复现。资源已积累272人学习下载读者可获取可运行的分类脚本、已训练模型、混淆矩阵与ROC曲线等评估结果并借助可视化页面直观对比各算法准确率与召回率为课程设计或安全实验提供参考。1. 从一条告警日志说起Python 三件套做入侵检测到底在解决什么凌晨两点IDS 面板上刷出几百条告警八成是误报真正的那条混在里面没人看得见。这是很多做安全运营的人共同的痛点规则匹配能抓已知攻击但面对变形流量、慢速扫描、内部横向移动规则库越堆越大误报率也跟着起飞。基于 Python 贝叶斯、神经网络、KNN 进行入侵检测本质上是换一条路——不靠人写规则而是让模型从历史流量特征里自己学出「正常」和「异常」的边界。它适合两类人一是手里有 KDD Cup 99、NSL-KDD 这类标注数据集、想快速跑通一个可对比基线的安全方向学生和初级工程师二是想把机器学习真正落到安全场景、但不想一上来就啃深度学习框架的运维和开发。这篇文章不讲空泛概念而是把三种模型从数据预处理到评估对比的完整链路拆开让你能照着复现也知道每一步的坑在哪。2. 三种模型怎么选贝叶斯、KNN、神经网络在入侵检测里的分工2.1 先搞清楚入侵检测的数据长什么样不管用哪个模型输入都是同一种东西一条条网络连接记录每条记录有几十个特征。以 NSL-KDD 为例一条记录包含 duration连接时长、protocol_type协议类型、src_bytes源字节数、dst_bytes目的字节数、flag连接状态、count过去两秒内同目标主机的连接数等 41 个特征最后一个是标签标记这条连接是 normal 还是某种 attack如 neptune、smurf、portsweep。这些特征分三类数值型duration、src_bytes、类别型protocol_type 的 tcp/udp/icmp、二值型logged_in 的 0/1。模型能不能学好八成取决于这三类特征处理得对不对。数值型要做归一化类别型要做独热编码这是后面所有模型共享的前置步骤。提示NSL-KDD 是 KDD Cup 99 的去重版本训练集约 12 万条、测试集约 2 万条类别分布更均衡做基线对比比原始 KDD 更靠谱。常见做法是直接用它别一上来就自己抓包标注成本太高。2.2 朴素贝叶斯为什么它适合做第一版基线朴素贝叶斯的核心假设是「特征之间相互独立」虽然现实中网络特征明显不独立比如 src_bytes 和 duration 往往相关但这个假设被违反时它依然能给出可用的分类结果这就是它常被拿来当基线的原因。它做入侵检测的逻辑很直接给定一条连接的特征向量 x计算 P(正常|x) 和 P(攻击|x)哪个概率大就判哪个。用贝叶斯公式展开就是 P(攻击|x) ∝ P(x|攻击)·P(攻击)。P(攻击) 是先验从训练集里各类别占比直接数出来P(x|攻击) 在「特征独立」假设下拆成每个特征条件概率的乘积。对离散特征protocol_type、flag条件概率就是数频次对连续特征duration、src_bytes通常假设它服从高斯分布用训练集里该类别下该特征的均值和方差去算概率密度。这就是 GaussianNB 的由来。它的优势是训练极快、可解释性强、对小样本友好劣势是特征独立假设太强对复杂攻击模式比如需要多个特征联合才能识别的慢速扫描容易漏判。所以它适合做第一版基线先跑出一个准确率数字后面再用复杂模型对比提升。2.3 KNN用距离度量「这条连接像不像已知攻击」KNN 的思路更符合直觉把训练集里所有连接记录当成已知样本来一条新连接就看它在特征空间里离哪 K 个已知样本最近这 K 个邻居里哪种标签多就判它是什么。它的关键在「距离」怎么算。最常用欧氏距离但前提是各特征量纲一致——src_bytes 动辄上万duration 可能只有零点几不归一化的话距离完全被大数值特征主导KNN 直接失效。所以标准化是 KNN 的命门。K 值的选择也直接影响结果K 太小比如 1对噪声敏感一条错标样本就能带偏判断K 太大决策边界变模糊少数类攻击容易被多数类正常流量淹没。常见做法是在 3、5、7、9 里用交叉验证挑。KNN 的优势是不需要训练过程、天然支持多分类、对异常模式敏感劣势是预测时要遍历整个训练集算距离12 万条训练数据下预测一条要算 12 万次距离线上实时检测基本扛不住。所以它更适合离线分析或小规模场景。2.4 神经网络用 MLP 抓特征之间的非线性组合前馈神经网络MLP解决的是贝叶斯和 KNN 都搞不定的问题特征之间的非线性交互。比如「短时长 高 count 特定 flag」这种组合模式单独看每个特征都正常组合起来才是攻击线性模型和距离度量都抓不住。一个典型的入侵检测 MLP 结构是输入层 41 个节点对应 41 个特征类别型独热展开后更多一到两个隐藏层每层 64 到 128 个神经元激活函数 ReLU输出层用 softmax 输出各类别概率。训练用交叉熵损失、Adam 优化器配合 dropout 防过拟合。它的优势是拟合能力强、能自动学特征交互劣势是需要调参层数、神经元数、学习率、batch size、训练慢、可解释性差而且数据量不够时容易过拟合。所以它适合在贝叶斯基线之上做提升而不是一上来就用。2.5 三种模型的选型对照维度朴素贝叶斯KNN神经网络(MLP)训练速度极快无需训练慢预测速度快慢遍历训练集快特征独立假设需要不需要不需要非线性建模弱中强可解释性强中弱适合场景基线/小样本离线分析大数据量提升实际做的时候我一般先用贝叶斯跑出基线准确率再用 KNN 看距离度量下的表现最后用 MLP 冲上限三者对比才能说明问题。3. 用 Python 把三种模型跑通从数据预处理到训练的最小链路3.1 环境准备与依赖安装先确认 Python 版本建议 3.8 及以上。核心依赖是 numpy、pandas、scikit-learn神经网络部分用 sklearn 的 MLPClassifier 就够跑通不必上 PyTorch。# 建议在虚拟环境里装避免污染全局 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install numpy pandas scikit-learn装完可以用python -c import sklearn; print(sklearn.__version__)验证。如果 numpy 装不上多半是 Python 版本和 wheel 不匹配换 3.8 到 3.10 之间的版本最稳。3.2 数据加载与特征工程这一步是整条链路里最容易翻车的地方。NSL-KDD 的列没有表头需要手动指定列名类别型特征要编码数值型要标准化。import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler, LabelEncoder # NSL-KDD 的 41 个特征 1 个标签列名按官方定义 col_names [ duration,protocol_type,service,flag,src_bytes,dst_bytes, land,wrong_fragment,urgent,hot,num_failed_logins,logged_in, num_compromised,root_shell,su_attempted,num_root,num_file_creations, num_shells,num_access_files,num_outbound_cmds,is_host_login, is_guest_login,count,srv_count,serror_rate,srv_serror_rate, rerror_rate,srv_rerror_rate,same_srv_rate,diff_srv_rate, srv_diff_host_rate,dst_host_count,dst_host_srv_count, dst_host_same_srv_rate,dst_host_diff_srv_rate,dst_host_same_src_port_rate, dst_host_srv_diff_host_rate,dst_host_serror_rate,dst_host_srv_serror_rate, dst_host_rerror_rate,dst_host_srv_rerror_rate,label,difficulty ] train pd.read_csv(KDDTrain.txt, namescol_names) test pd.read_csv(KDDTest.txt, namescol_names) # 把具体攻击类型归成五大类减少类别不平衡 attack_map { normal: normal, neptune:dos,smurf:dos,back:dos,teardrop:dos,pod:dos,land:dos, ipsweep:probe,nmap:probe,portsweep:probe,satan:probe, ftp_write:r2l,guess_passwd:r2l,imap:r2l,phf:r2l,multihop:r2l, warezmaster:r2l,warezclient:r2l,spy:r2l, buffer_overflow:u2r,rootkit:u2r,loadmodule:u2r,perl:u2r } for df in [train, test]: df[label] df[label].map(attack_map) # 类别型特征独热编码训练集和测试集要对齐列 cat_cols [protocol_type,service,flag] combined pd.concat([train[cat_cols], test[cat_cols]]) combined pd.get_dummies(combined) train_enc combined.iloc[:len(train)].reset_index(dropTrue) test_enc combined.iloc[len(train):].reset_index(dropTrue) # 数值型特征标准化scaler 只在训练集上 fit num_cols [c for c in col_names if c not in cat_cols [label,difficulty]] scaler StandardScaler().fit(train[num_cols]) train_num pd.DataFrame(scaler.transform(train[num_cols]), columnsnum_cols) test_num pd.DataFrame(scaler.transform(test[num_cols]), columnsnum_cols) X_train pd.concat([train_num, train_enc], axis1) X_test pd.concat([test_num, test_enc], axis1) le LabelEncoder().fit(train[label]) y_train le.transform(train[label]) y_test le.transform(test[label])逻辑说明先按官方定义给列命名再把 20 多种具体攻击归成 dos/probe/r2l/u2r/normal 五类避免类别过多导致模型学不动。独热编码时把训练集和测试集拼在一起做保证两边的列完全对齐——这是新手最常踩的坑分开做会导致测试集多出或缺少某些列。标准化时 scaler 只在训练集上 fit测试集用同一个 scaler 变换否则就是数据泄露。参数说明StandardScaler做的是 (x-均值)/标准差让每个特征均值为 0、方差为 1pd.get_dummies默认把类别型展开成 0/1 列。如果内存吃紧可以把get_dummies换成OneHotEncoder(handle_unknownignore)。3.3 朴素贝叶斯训练与预测from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score, classification_report nb GaussianNB() nb.fit(X_train, y_train) y_pred_nb nb.predict(X_test) print(贝叶斯准确率:, accuracy_score(y_test, y_pred_nb)) print(classification_report(y_test, y_pred_nb, target_namesle.classes_))逻辑说明GaussianNB 假设每个特征在每个类别下服从高斯分布训练时只需统计每个类别下每个特征的均值和方差所以 fit 几乎是瞬间完成。predict 时对每个类别算对数概率取最大的那个。参数说明GaussianNB 只有一个var_smoothing参数默认 1e-9作用是给方差加一个极小值防止除零。如果某类样本极少导致方差为 0可以适当调大这个值。3.4 KNN 训练与 K 值调优from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import cross_val_score # 在训练集上做 5 折交叉验证挑 K for k in [3, 5, 7, 9, 11]: knn KNeighborsClassifier(n_neighborsk, n_jobs-1) scores cross_val_score(knn, X_train, y_train, cv5, scoringaccuracy) print(fK{k}, 交叉验证准确率{scores.mean():.4f}) # 用最优 K 在测试集上评估 knn KNeighborsClassifier(n_neighbors5, n_jobs-1) knn.fit(X_train, y_train) y_pred_knn knn.predict(X_test) print(KNN 准确率:, accuracy_score(y_test, y_pred_knn))逻辑说明KNN 没有显式训练过程fit 只是把训练数据存下来。predict 时对每个测试样本算它到所有训练样本的距离取最近的 K 个投票。交叉验证是为了在训练集内部挑 K避免用测试集调参造成过拟合。参数说明n_neighbors是 K 值n_jobs-1表示用满所有 CPU 核并行算距离。12 万条训练数据下KNN 预测 2 万条测试数据可能要几分钟这是正常的别以为卡死了。3.5 神经网络训练与早停from sklearn.neural_network import MLPClassifier mlp MLPClassifier( hidden_layer_sizes(128, 64), # 两个隐藏层 activationrelu, solveradam, alpha1e-4, # L2 正则 batch_size256, learning_rate_init1e-3, max_iter200, early_stoppingTrue, # 验证集不提升就停 validation_fraction0.1, random_state42 ) mlp.fit(X_train, y_train) y_pred_mlp mlp.predict(X_test) print(神经网络准确率:, accuracy_score(y_test, y_pred_mlp))逻辑说明两个隐藏层 128 和 64 个神经元是入侵检测任务里比较稳的配置再深容易过拟合。early_stopping 会从训练集里切 10% 当验证集连续若干轮验证损失不降就停这是防过拟合最省事的手段。参数说明alpha是 L2 正则强度越大正则越强batch_size影响梯度稳定性256 是常用值learning_rate_init是初始学习率Adam 下 1e-3 通常够用。如果训练损失不降先检查数据标准化有没有做对。4. 避坑与排查三种模型落地时最容易翻车的五个地方4.1 准确率虚高到 99%但攻击一个没抓到现象模型报告准确率 99%但混淆矩阵里少数类攻击u2r、r2l召回率接近 0。原因NSL-KDD 里 normal 样本占大头模型学会了「全判正常」就能拿高准确率。准确率在不平衡数据上是骗人的指标。解决看每个类别的 precision/recall/f1重点看攻击类的召回率。必要时用class_weightbalancedKNN 和 MLP 支持或对少数类过采样。评估主指标换成 macro-F1 或攻击类召回率。4.2 测试集准确率比训练集低一大截现象训练集 99%测试集 75%差距超过 20 个点。原因要么是过拟合尤其 MLP要么是训练集和测试集分布不一致。NSL-KDD 的测试集里包含训练集没出现过的攻击类型这是它故意设计的所以差距大有时是正常的。解决先确认不是数据泄露比如标准化时用了全量数据 fit。如果是 MLP 过拟合加 dropout、减小网络、增大 alpha。如果是分布问题看测试集里哪些攻击类型训练集没有单独分析。4.3 KNN 预测慢到无法接受现象训练秒完成预测 2 万条要跑十几分钟。原因KNN 预测复杂度是 O(测试样本数 × 训练样本数 × 特征数)12 万训练样本下每条测试样本要算 12 万次距离。解决用 KD-Tree 或 Ball-Tree 加速algorithmkd_tree但对高维数据效果有限更实际的做法是先用贝叶斯或 MLP 做粗筛只把可疑样本交给 KNN 精判或者对训练集做降采样。4.4 独热编码后训练集和测试集列数对不上现象X_test比X_train多几列或少几列fit 时报维度错误。原因训练集和测试集的 service 类别不完全一样分开做 get_dummies 会生成不同的列。解决把两个数据集拼起来做编码再拆开或者用OneHotEncoder(handle_unknownignore)先 fit 训练集再 transform 测试集。这是血泪经验第一次做基本都会踩。4.5 神经网络训练损失震荡不收敛现象loss 上下跳准确率卡在某个值不动。原因学习率太大、batch_size 太小、或者数据没标准化导致梯度爆炸。解决先把学习率降到 1e-4 试增大 batch_size 到 256 或 512确认标准化做了。如果还不行换solversgd配 momentum或者加 BatchNormsklearn 的 MLP 不支持得换 PyTorch。5. 把三种模型串成对比实验评估口径与一个提分技巧跑通单个模型只是开始真正有价值的是把三者放在同一口径下对比。我一般会固定同一份预处理后的数据用同一套评估函数输出准确率、macro-F1、各类别召回率和混淆矩阵这样对比才公平。from sklearn.metrics import f1_score, confusion_matrix import matplotlib.pyplot as plt import seaborn as sns def evaluate(name, y_true, y_pred): print(f {name} ) print(准确率:, round(accuracy_score(y_true, y_pred), 4)) print(macro-F1:, round(f1_score(y_true, y_pred, averagemacro), 4)) cm confusion_matrix(y_true, y_pred) sns.heatmap(cm, annotTrue, fmtd, xticklabelsle.classes_, yticklabelsle.classes_) plt.title(name) plt.show() evaluate(Naive Bayes, y_test, y_pred_nb) evaluate(KNN, y_test, y_pred_knn) evaluate(MLP, y_test, y_pred_mlp)逻辑说明macro-F1 对每个类别一视同仁不会被多数类拉高比准确率更能反映模型对少数类攻击的识别能力。混淆矩阵能直接看出哪类攻击被误判成了什么比如 r2l 常被误判成 normal说明这类攻击的特征和正常流量太像。参数说明averagemacro是各类别 F1 的算术平均如果更关心攻击类的整体表现可以用averageweighted按样本数加权。一个实用的提分技巧是模型融合把三个模型的预测概率平均后取最大或者用投票法。贝叶斯和 KNN 的错误模式往往不重叠融合后 macro-F1 通常能比单模型高 2 到 5 个点。具体做法是VotingClassifier(estimators[(nb,nb),(knn,knn),(mlp,mlp)], votingsoft)注意 soft 投票需要每个模型都支持predict_proba这三个都支持。还有个容易被忽略的点特征选择。41 个特征里真正有用的可能只有十几个用SelectKBest或基于随机森林的特征重要性筛一遍去掉冗余特征后 KNN 的预测速度会明显提升MLP 的过拟合也会减轻。我一般会保留 15 到 20 个特征做对比实验。最后说个我自己的习惯每次跑完实验把预处理参数、模型超参、评估结果记在一个 CSV 里别靠脑子记。入侵检测这方向换个数据集、换个 K 值、换个网络结构结果能差十几个点没有记录根本没法复现。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号