尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

基于NSL-KDD与KDDCup双数据集的网络入侵检测模型训练与评估实战

发布时间:2026/9/30 1:03:53

资讯中心
01
ARTICLE

基于NSL-KDD与KDDCup双数据集的网络入侵检测模型训练与评估实战

基于NSL-KDD与KDDCup双数据集的网络入侵检测模型训练与评估实战
简介这份资源面向计算机、网络安全相关专业的课程设计与期末大作业场景提供一套基于NSL-KDD数据集的网络入侵检测模型完整实现方案同时支持用KDDCup与NSL-KDD两个数据集进行模型评估适合新手入门与高分冲刺。压缩包共27个文件约29.98MB包含10个csv数据文件、7个txt说明、4个ipynb实验笔记、3个m脚本、1个py脚本及md、docx文档覆盖数据处理、建模、评估全流程。资源内含带主成分分析与无主成分分析两条建模路线配套KDDCup数据读取与修正脚本、模型评估笔记及README说明代码注释清晰部署简单即可运行。目前已有403人学习下载可作为课程设计、期末大作业的参考模板帮助读者快速理解入侵检测的建模思路与评估方法。1. 从一份满分大作业拆起NSL-KDD 训练网络入侵检测模型到底交付了什么如果你正在为课程设计或期末大作业找一个能跑通、能讲清、还能拿高分的网络入侵检测项目这份基于 NSL-KDD 数据集训练模型并用 KDDCup 与 NSL-KDD 双数据集做评估的资源值得先看结构再决定要不要动手。它不是一个空壳 Demo而是把数据预处理、特征降维、模型训练、跨数据集评估四条链路都拆成了独立 Notebook 和 MATLAB 模型文件。压缩包里的model_no_pca.ipynb和model_with_pca.ipynb分别对应无降维与带 PCA 降维两条技术路线evaluate_model_with_kdddataset.ipynb专门负责用 KDDCup 数据做泛化验证get_KDD_cup_data.ipynb处理原始 KDDCup 数据的字段对齐。适合谁适合已经学过机器学习基础、但没完整走过入侵检测流程的本科生或研一学生也适合需要快速复现 baseline 的从业者。你拿到手后最需要关注的不是代码有多长而是它怎么处理 NSL-KDD 与 KDDCup 之间的特征空间差异——这才是模型评估部分真正值钱的地方。2. 数据管道与特征工程NSL-KDD 的 41 维特征怎么喂进模型2.1 先搞清 NSL-KDD 和 KDDCup 的字段血缘NSL-KDD 是从 KDDCup99 清洗出来的改进版去掉了冗余记录但保留了 41 维特征和 5 类标签Normal、DoS、Probe、R2L、U2R。压缩包里的kddcup_data.csv和kddcup_data_corrected.csv是原始 KDDCup 数据及其修正版NSL_KDD-master目录下则是标准 NSL-KDD 的训练集和测试集。很多新手直接拿 KDDCup 的 41 维去套 NSL-KDD 训练好的模型结果准确率断崖式下跌原因就在符号型特征protocol_type、service、flag的编码映射不一致。read_kddcup99.py这个脚本的作用就是统一读取逻辑把 KDDCup 的列名和 NSL-KDD 对齐。常见做法是先用 pandas 读入检查列数和列名顺序再决定是重新编码还是做列裁剪。import pandas as pd # 读取 NSL-KDD 训练集注意它没有表头需要手动指定列名 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 ] df_train pd.read_csv(NSL_KDD-master/KDDTrain.txt, namescol_names) df_test pd.read_csv(NSL_KDD-master/KDDTest.txt, namescol_names) # 检查符号型特征的唯一值确认训练集和测试集覆盖范围是否一致 for col in [protocol_type, service, flag]: print(col, train:, df_train[col].nunique(), test:, df_test[col].nunique())这段代码的关键参数是namescol_names因为 NSL-KDD 原始文件不带表头不指定列名后面做特征对齐会全乱。difficulty列是 NSL-KDD 特有的难度分级训练时通常要 drop 掉否则会引入标签泄漏。打印唯一值数量是为了提前发现测试集里出现了训练集没见过的 service 类别这种情况直接做 OneHotEncoder 会报维度不匹配稳妥做法是用handle_unknownignore或者手动对齐类别集合。2.2 数值化与归一化的顺序不能反符号型特征编码和数值归一化的顺序有讲究。我一般会先把 protocol_type、service、flag 做 OneHot 或 Label Encoding再把所有数值列做 MinMax 归一化。如果先归一化再编码OneHot 出来的 0/1 列会被归一化缩放虽然不影响树模型但对神经网络和 KNN 这类基于距离的模型会引入偏差。model_no_pca.ipynb里用的是 LabelEncoder 加 MinMaxScaler 的组合model_with_pca.ipynb则在归一化后接了 PCA 降到 20 维左右。PCA 的n_components参数建议先跑一次累计方差贡献率曲线看到 95% 以上再定不要拍脑袋设 10 或 15。from sklearn.preprocessing import LabelEncoder, MinMaxScaler from sklearn.decomposition import PCA # 对三个符号型特征做 Label Encoding le LabelEncoder() for col in [protocol_type, service, flag]: df_train[col] le.fit_transform(df_train[col]) # 测试集必须用同一个 encoder 转换不能重新 fit df_test[col] le.transform(df_test[col]) # 分离特征和标签drop 掉 difficulty 列 X_train df_train.drop([label, difficulty], axis1) y_train df_train[label] X_test df_test.drop([label, difficulty], axis1) y_test df_test[label] # 归一化 scaler MinMaxScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # PCA 降维保留 95% 方差 pca PCA(n_components0.95) X_train_pca pca.fit_transform(X_train_scaled) X_test_pca pca.transform(X_test_scaled) print(PCA 后维度:, X_train_pca.shape[1])注意le.transform和scaler.transform在测试集上只能用 transform不能重新 fit这是血泪经验。很多同学在测试集上重新 fit 了 LabelEncoder导致同一类 service 在训练集和测试集里映射到不同整数模型评估结果虚高但实际部署会翻车。PCA 的n_components0.95表示自动选择能解释 95% 方差的主成分数量比手动指定整数更稳。3. 模型训练与双数据集评估从 NSL-KDD 到 KDDCup 的泛化验证3.1 无 PCA 与带 PCA 两条路线的选型理由model_no_pca.ipynb和model_with_pca.ipynb分别对应两种工程取舍。无 PCA 版本保留全部 41 维特征适合树模型Random Forest、XGBoost因为树模型对特征维度不敏感且能输出特征重要性方便你在报告里解释哪些特征对入侵检测贡献大。带 PCA 版本把维度压到 20 左右适合神经网络或 KNN训练速度快但可解释性下降。压缩包里的pca_model.m和IDS_model_8-0.m是 MATLAB 版本的模型文件NO_PCA_IDS_model.m对应无 PCA 路线。如果你用 Python直接跑 Notebook如果课程要求 MATLAB.m文件可以加载已训练好的模型做推理。选型建议报告里要放特征重要性图就用无 PCA要对比训练时间就用带 PCA。from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix, accuracy_score # 无 PCA 版本训练 Random Forest rf RandomForestClassifier(n_estimators100, max_depth20, random_state42, n_jobs-1) rf.fit(X_train_scaled, y_train) y_pred rf.predict(X_test_scaled) print(NSL-KDD 测试集准确率:, accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred)) # 输出特征重要性取前 10 个 import numpy as np importances rf.feature_importances_ idx np.argsort(importances)[::-1][:10] for i in idx: print(X_train.columns[i], importances[i])n_estimators100是随机森林的树数量作业场景下 100 到 200 足够再往上边际收益很低。max_depth20防止过拟合NSL-KDD 训练集只有 12 万条左右树太深会记住噪声。n_jobs-1用满 CPU 核数加速训练。特征重要性输出后你会发现src_bytes、dst_bytes、same_srv_rate、dst_host_srv_count这几个特征排名靠前报告里可以直接拿这个结果做分析。3.2 用 KDDCup 做跨数据集评估的正确姿势evaluate_model_with_kdddataset.ipynb是整个项目里最容易被忽视但最能拉开分差的部分。跨数据集评估的目的是验证模型泛化能力在 NSL-KDD 上训练在 KDDCup 上测试。但 KDDCup 的标签体系和 NSL-KDD 不完全一致KDDCup 有 23 种攻击类型NSL-KDD 归并成 4 大类。直接拿 NSL-KDD 训练的五分类模型去预测 KDDCup 的 23 类标签类别对不上。常见做法是先把 KDDCup 的标签映射到 NSL-KDD 的 5 类体系Normal、DoS、Probe、R2L、U2R再做评估。get_KDD_cup_data.ipynb里应该包含了这个映射逻辑add_to_kdd_data.csv可能是补充的映射表。# 假设已经读入 KDDCup 数据并完成列对齐 # 将 KDDCup 的 23 种攻击标签映射到 NSL-KDD 的 5 类 dos_attacks [back, land, neptune, pod, smurf, teardrop] probe_attacks [ipsweep, nmap, portsweep, satan] r2l_attacks [ftp_write, guess_passwd, imap, multihop, phf, spy, warezclient, warezmaster] u2r_attacks [buffer_overflow, loadmodule, perl, rootkit] def map_label(label): if label normal: return Normal elif label in dos_attacks: return DoS elif label in probe_attacks: return Probe elif label in r2l_attacks: return R2L elif label in u2r_attacks: return U2R else: return Unknown # 对 KDDCup 测试集做同样的特征工程注意用 NSL-KDD 训练好的 scaler 和 encoder X_kddcup kddcup_df.drop([label], axis1) X_kddcup_scaled scaler.transform(X_kddcup) # 复用 NSL-KDD 的 scaler y_kddcup kddcup_df[label].apply(map_label) # 用 NSL-KDD 训练好的模型预测 y_kddcup_pred rf.predict(X_kddcup_scaled) print(KDDCup 跨数据集准确率:, accuracy_score(y_kddcup, y_kddcup_pred))这里最关键的一步是scaler.transform(X_kddcup)必须复用 NSL-KDD 训练集 fit 出来的 scaler不能重新 fit。如果 KDDCup 的数值范围跟 NSL-KDD 差异大跨数据集准确率会明显下降这恰恰是评估泛化能力的意义所在。标签映射函数里的攻击类型列表来自 KDDCup99 的标准分类add_to_kdd_data.csv可能补充了更多映射关系跑之前先看一眼那个文件的内容。跨数据集准确率通常比同数据集低 10 到 20 个百分点如果低太多检查特征对齐和标签映射是否漏了类别。4. 避坑与排查跑通这份大作业最常见的五个翻车点4.1 现象LabelEncoder 报 “y contains previously unseen labels”原因测试集或 KDDCup 数据里出现了训练集没有的 service 或 flag 类别而你在测试集上重新 fit 了 LabelEncoder或者直接用transform但训练集没覆盖全。解决训练集 fit 之后用le.classes_检查类别集合对测试集里多出来的类别统一映射到unknown再 transform。更稳的做法是用OrdinalEncoder(handle_unknownuse_encoded_value, unknown_value-1)。4.2 现象PCA 降维后模型准确率反而下降原因PCA 对量纲敏感如果归一化没做好方差大的特征会主导主成分方向。另外n_components设得太小丢了关键判别信息。解决先做 MinMax 或 StandardScaler再跑 PCA用累计方差贡献率曲线确认 95% 以上如果准确率还是降说明这个数据集不适合 PCA换回无 PCA 版本。4.3 现象KDDCup 跨数据集评估时维度不匹配原因KDDCup 原始数据列数和 NSL-KDD 不一致或者 OneHot 编码后维度不同。解决用read_kddcup99.py统一读取检查X_kddcup.shape[1]是否等于X_train.shape[1]。如果不等用add_to_kdd_data.csv做列对齐或者手动 drop 掉多余列。4.4 现象MATLAB 模型文件加载报错 “Unable to read file”原因.m文件可能是脚本而非模型文件或者 MATLAB 版本不兼容。解决先看README.md里的说明确认.m文件是脚本还是save出来的模型。如果是脚本直接运行如果是模型用load(pca_model.m)加载。MATLAB 版本差异可能导致旧版模型无法在新版加载建议用 R2020b 及以上。4.5 现象Notebook 跑完准确率 99% 但报告被质疑原因NSL-KDD 的测试集和训练集分布有差异如果做了过采样或用了测试集调参准确率会虚高。解决严格划分训练集和测试集不要用测试集做特征选择或超参调优。报告里同时给出 NSL-KDD 同数据集准确率和 KDDCup 跨数据集准确率后者才是泛化能力的真实体现。5. 进阶技巧用特征重要性做模型解释与报告加分跑通基础流程后想让大作业从“能跑”变成“有亮点”最省力的切入点是特征重要性分析。Random Forest 和 XGBoost 都能直接输出feature_importances_但直接画条形图太普通。我一般会做两件事一是按攻击类型分组统计特征重要性看 DoS 和 Probe 各自依赖哪些特征二是用 SHAP 值做单样本解释挑一个被误分类的样本看哪些特征把模型带偏了。SHAP 在pip install shap后几行代码就能出图报告里放一张 force plot比堆准确率数字有说服力。import shap # 用训练好的 Random Forest 做 SHAP 解释 explainer shap.TreeExplainer(rf) shap_values explainer.shap_values(X_test_scaled[:100]) # 取前 100 个样本加速 # 对某一类攻击比如 DoS做 summary plot # 注意 shap_values 是列表每个类别一个数组 shap.summary_plot(shap_values[1], X_test_scaled[:100], feature_namesX_train.columns)TreeExplainer对树模型有精确的快速实现shap_values返回的列表长度等于类别数索引 1 对应 DoS 类。X_test_scaled[:100]取前 100 个样本是为了控制计算时间全量跑 2 万条会慢。summary_plot 的横轴是 SHAP 值正负表示对预测为该类的推动方向颜色深浅表示特征值大小。如果报告里要对比 PCA 前后的解释差异带 PCA 版本需要把主成分映射回原始特征这一步比较绕建议直接用无 PCA 版本做解释。另一个加分点是跨数据集评估的误差分析。把 KDDCup 上预测错误的样本挑出来按真实标签分组看哪类攻击漏检最多。通常 R2L 和 U2R 因为样本少跨数据集表现最差。针对这两类可以尝试在训练时加类别权重class_weightbalanced或者用 SMOTE 做少量过采样。但注意过采样只能在训练集做测试集和 KDDCup 评估集不能动。从那以后我每次做跨数据集评估都强制先跑一遍混淆矩阵再写结论不然很容易被“准确率 95%”这种数字骗过去。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。