基于NSL-KDD与KDDCup的入侵检测模型实战:从数据预处理到MATLAB/Python双路复现
2026/9/23 16:34:20 网站建设 项目流程

简介:这份资源面向计算机、网络安全相关专业的本科生与研究生,提供一套可直接用于课程设计或期末大作业的完整网络入侵检测方案。项目以NSL-KDD数据集为核心训练数据,并额外引入KDDCup数据集进行交叉评估,帮助读者理解模型在不同数据分布下的泛化表现,适合作为入门机器学习与安全检测的实战案例。压缩包共27个文件,约29.98MB,包含10个csv数据文件、7个txt说明、4个ipynb实验笔记、3个m脚本、1个py脚本及md、docx文档,覆盖数据预处理、特征工程、PCA降维与无PCA对比、模型训练及评估全流程。代码注释详尽,新手也能看懂,下载后简单部署即可运行。目前已有403人学习,资源提供含PCA与不含PCA两套建模思路,并附KDDCup数据读取与评估脚本,便于复现实验、撰写报告与二次开发。

1. 从一份满分大作业说起:NSL-KDD 训练入侵检测模型到底能跑出什么

如果你正在为课程设计或期末大作业找一个能落地、能讲清楚、还能拿得出手的题目,网络入侵检测模型是个很稳的方向。这份资源的核心思路很直接:用 NSL-KDD 数据集训练一个网络入侵检测模型,再用 KDDCup 和 NSL-KDD 两个数据集分别做模型评估。它包含完整的 MATLAB 模型文件、Python 数据预处理脚本、Jupyter Notebook 实验记录,以及 KDDCup 和 NSL-KDD 的原始数据。适合谁?适合需要交课程设计、想理解入侵检测完整流程、又不想从零造轮子的同学。你拿到手就能跑,跑完能看懂每一步在干什么,改改参数还能写进报告里当创新点。

2. 数据管道拆解:从 KDDCup 原始数据到 NSL-KDD 可训练特征

2.1 为什么不能直接把 CSV 丢进模型

KDDCup 99 原始数据里混着符号特征、数值特征和标签,直接喂给分类器会翻车。常见做法是先做符号特征数值化,再做归一化。资源里的read_kddcup99.pyget_KDD_cup_data.ipynb就是干这个的。我一般会先看数据分布,再决定用哪种编码方式。NSL-KDD 本身已经做过部分清洗,但 KDDCup 原始数据需要自己处理。这里的关键参数是protocol_typeserviceflag这三个符号列,它们必须转成数值。资源里用的是 one-hot 编码,你也可以换成 label encoding,但要注意类别不平衡问题。

# read_kddcup99.py 核心逻辑示意 import pandas as pd from sklearn.preprocessing import OneHotEncoder, MinMaxScaler # 读取原始 KDDCup 数据,注意 header=None,因为原始文件没有列名 df = pd.read_csv('data/kddcup_data.csv', header=None) # 符号列在第 1、2、3 列(从 0 开始计数) categorical_cols = [1, 2, 3] numeric_cols = [i for i in range(41) if i not in categorical_cols] # one-hot 编码符号特征 encoder = OneHotEncoder(sparse=False, handle_unknown='ignore') encoded_cat = encoder.fit_transform(df[categorical_cols]) # 数值特征归一化到 [0,1] scaler = MinMaxScaler() scaled_num = scaler.fit_transform(df[numeric_cols]) # 拼接成最终特征矩阵 import numpy as np X = np.hstack([scaled_num, encoded_cat]) y = df[41].apply(lambda x: 0 if x == 'normal' else 1) # 二分类标签

这段代码的逻辑是:先分离符号列和数值列,符号列做 one-hot,数值列做 min-max 归一化,最后拼成特征矩阵。参数上,handle_unknown='ignore'是为了防止测试集出现训练集没见过的类别时报错。标签处理成二分类,正常为 0,攻击为 1。如果你要做多分类,把apply里的逻辑改成映射到具体攻击类型即可。资源里的add_to_kdd_data.csv应该是补充数据,用来平衡样本或增加攻击类型,具体用法在 notebook 里有注释。

2.2 NSL-KDD 的列名与特征对齐

NSL-KDD 比 KDDCup 规范,它自带列名文件。资源里的NSL_KDD-master文件夹应该包含KDDTrain+.txtKDDTest+.txt。我一般会先读列名,再读数据,避免列错位。注意 NSL-KDD 的标签列在最后一列,且包含 23 种攻击类型,需要映射成 5 大类:Normal、DoS、Probe、R2L、U2R。资源里的model_no_pca.ipynbmodel_with_pca.ipynb分别对应不做 PCA 和做 PCA 的模型训练。PCA 的作用是降维,但会损失可解释性。如果你要写报告,建议两个都跑,对比准确率和训练时间。

# NSL-KDD 数据加载与标签映射 import pandas as pd # 列名从 NSL_KDD-master 里的 KDDTrain+.txt 第一行或单独文件获取 col_names = [...] # 41 个特征名 + 'label' + 'difficulty' train = pd.read_csv('NSL_KDD-master/KDDTrain+.txt', names=col_names) test = pd.read_csv('NSL_KDD-master/KDDTest+.txt', names=col_names) # 攻击类型映射到 5 大类 attack_map = { 'normal': 'Normal', 'back': 'DoS', 'land': 'DoS', 'neptune': 'DoS', 'pod': 'DoS', 'smurf': 'DoS', 'teardrop': 'DoS', 'mailbomb': 'DoS', 'apache2': 'DoS', 'processtable': 'DoS', 'udpstorm': 'DoS', 'ipsweep': 'Probe', 'nmap': 'Probe', 'portsweep': 'Probe', 'satan': 'Probe', 'mscan': 'Probe', 'saint': 'Probe', 'ftp_write': 'R2L', 'guess_passwd': 'R2L', 'imap': 'R2L', 'multihop': 'R2L', 'phf': 'R2L', 'spy': 'R2L', 'warezclient': 'R2L', 'warezmaster': 'R2L', 'sendmail': 'R2L', 'named': 'R2L', 'snmpgetattack': 'R2L', 'snmpguess': 'R2L', 'xlock': 'R2L', 'xsnoop': 'R2L', 'worm': 'R2L', 'buffer_overflow': 'U2R', 'loadmodule': 'U2R', 'perl': 'U2R', 'rootkit': 'U2R', 'httptunnel': 'U2R', 'ps': 'U2R', 'sqlattack': 'U2R', 'xterm': 'U2R' } train['category'] = train['label'].map(attack_map) test['category'] = test['label'].map(attack_map)

这段代码的关键是attack_map字典,它把 23 种具体攻击映射到 5 大类。注意 NSL-KDD 的测试集里有一些训练集没出现过的攻击类型,这是它故意设计的,用来测试模型的泛化能力。所以你在评估时不能只看准确率,还要看召回率和 F1。资源里的evaluate_model_with_kdddataset.ipynb就是做这个评估的,它会分别用 KDDCup 和 NSL-KDD 测试集跑模型,输出混淆矩阵和分类报告。

3. 模型训练与评估:MATLAB 与 Python 双路复现

3.1 MATLAB 模型文件怎么用

资源里有三个.m文件:pca_model.mIDS_model_8-0.mNO_PCA_IDS_model.m。从命名看,pca_model.m是带 PCA 的模型,NO_PCA_IDS_model.m是不带 PCA 的模型,IDS_model_8-0.m可能是某个特定参数下的模型。MATLAB 的优势是矩阵运算快,适合做特征降维和传统机器学习。我一般会先用 MATLAB 跑一遍,看看 PCA 后的累计方差贡献率,再决定保留多少主成分。常见做法是保留 95% 方差,但入侵检测里有时候降到 10 维也能保持不错的效果。注意 MATLAB 的.m文件需要对应的数据集路径正确,否则会报错找不到文件。

% pca_model.m 核心逻辑示意 load('data/kddcup_data_corrected.csv'); % 加载预处理后的数据 X = data(:, 1:41); % 特征 y = data(:, 42); % 标签 % PCA 降维 [coeff, score, latent, tsquared, explained] = pca(X); cumulative_var = cumsum(explained); k = find(cumulative_var >= 95, 1); % 保留 95% 方差的主成分数 X_pca = score(:, 1:k); % 训练 SVM 或决策树 model = fitcsvm(X_pca, y, 'KernelFunction', 'rbf'); save('model/pca_model.mat', 'model', 'coeff', 'k');

这段 MATLAB 代码先做 PCA,再训练 SVM。参数KernelFunctionrbf是因为入侵检测数据非线性可分。k是保留的主成分数,你可以改成固定值比如 10 或 15,对比效果。资源里的IDS_model_8-0.m可能是用 8 个特征训练的模型,具体要看注释。注意 MATLAB 的fitcsvm对大规模数据可能慢,如果数据量大,可以先用fitcecoc做多分类。

3.2 Python 端模型训练与评估

Python 端用model_no_pca.ipynbmodel_with_pca.ipynb两个 notebook。我一般会先跑model_no_pca.ipynb,因为它更直观,能看清每个特征的作用。然后跑model_with_pca.ipynb,对比降维后的效果。评估部分用evaluate_model_with_kdddataset.ipynb,它会加载训练好的模型,分别在 KDDCup 和 NSL-KDD 测试集上跑。注意 NSL-KDD 的测试集分布和训练集不同,所以准确率会低一些,这是正常的。如果你看到准确率从 99% 掉到 80%,别慌,那是数据集设计导致的。

# model_no_pca.ipynb 核心逻辑示意 from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix # 假设 X_train, y_train, X_test, y_test 已经准备好 rf = RandomForestClassifier(n_estimators=100, random_state=42) rf.fit(X_train, y_train) # 在 NSL-KDD 测试集上评估 y_pred = rf.predict(X_test) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred))

这段代码用随机森林做分类器,n_estimators=100是树的数量,你可以调到 200 或 300 看效果。random_state=42保证结果可复现。评估时重点看classification_report里的recallf1-score,因为入侵检测里漏报比误报更危险。资源里的evaluate_model_with_kdddataset.ipynb会分别用 KDDCup 和 NSL-KDD 测试集跑,输出两个结果。你可以把这两个结果做成表格,写进报告里对比。

3.3 评估指标怎么选才不虚

很多人只看准确率,这在入侵检测里是个坑。因为正常流量占大多数,模型全预测正常也能有 80% 准确率。所以要看召回率、F1 和 AUC。资源里的评估 notebook 应该会输出这些。我一般会额外画 ROC 曲线,看 AUC 值。如果 AUC 低于 0.9,说明模型区分能力不够,需要调特征或换模型。另外,NSL-KDD 的测试集里有一些训练集没见过的攻击,所以召回率会低,这是考察泛化能力的关键。你可以把 KDDCup 测试集的结果当作“同分布评估”,NSL-KDD 测试集的结果当作“跨分布评估”,两个都写进报告,显得更专业。

评估指标KDDCup 测试集NSL-KDD 测试集说明
准确率0.99+0.80~0.85NSL-KDD 更难,因为攻击类型更新
召回率0.98+0.70~0.80漏报率是关键
F1 分数0.98+0.75~0.82综合指标
AUC0.99+0.85~0.90区分能力

这张表是常见结果范围,你的实际结果可能略有不同。如果 NSL-KDD 上准确率低于 0.75,检查一下特征对齐和标签映射是否正确。

4. 避坑与排查:数据泄漏、标签错位和 PCA 翻车

4.1 现象:训练集准确率 99%,测试集只有 60%

原因:数据泄漏。常见情况是归一化时用了全部数据,或者 PCA 在划分训练测试之前做了。解决:先划分训练集和测试集,再在训练集上 fit 归一化器和 PCA,然后 transform 测试集。资源里的 notebook 如果顺序不对,你要手动调整。

4.2 现象:标签映射后出现 NaN

原因:攻击类型字典不全,有些攻击名没覆盖到。解决:先print(df['label'].unique())看所有标签,再补全字典。NSL-KDD 的测试集里可能有训练集没有的攻击名,比如apache2processtable等,都要映射。

4.3 现象:PCA 后模型效果反而下降

原因:PCA 是无监督降维,可能把区分性强的特征扔掉了。解决:对比不做 PCA 的版本,如果 PCA 后 F1 下降超过 5%,就放弃 PCA。或者改用 LDA 做有监督降维。资源里两个版本都有,直接对比即可。

4.4 现象:MATLAB 加载 CSV 报错“找不到文件”

原因:路径不对,或者 CSV 里有非数值字符。解决:用readtable代替load,并检查 CSV 是否已经全部数值化。MATLAB 对中文路径支持不好,把文件放在纯英文路径下。

4.5 现象:评估时混淆矩阵全是对角线,但类别不全

原因:测试集里某些攻击类别样本太少,或者标签映射后合并了。解决:用stratify划分数据,保证每个类别在训练集和测试集都有。如果某类样本少于 10 个,考虑合并到相近类别。

提示:跑 notebook 时按顺序执行,不要跳 cell。有些变量依赖前面的 cell,跳着跑容易出玄学错误。

5. 进阶技巧:用交叉验证和特征重要性写出一份能答辩的报告

最后一章说个具体技巧:怎么用这份资源做出让老师眼前一亮的报告。不要只贴准确率,要做交叉验证和特征重要性分析。交叉验证用StratifiedKFold,保证每折里类别比例一致。特征重要性用随机森林的feature_importances_,画出前 15 个重要特征。你会发现src_bytesdst_bytescountsrv_count这些特征权重很高,这正好能解释为什么入侵检测里流量统计特征最关键。把这两个图放进报告,比单纯说“准确率 99%”有说服力得多。

from sklearn.model_selection import StratifiedKFold, cross_val_score from sklearn.ensemble import RandomForestClassifier import matplotlib.pyplot as plt import numpy as np # 交叉验证 cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) rf = RandomForestClassifier(n_estimators=100, random_state=42) scores = cross_val_score(rf, X_train, y_train, cv=cv, scoring='f1_weighted') print(f"交叉验证 F1: {scores.mean():.4f} ± {scores.std():.4f}") # 特征重要性 rf.fit(X_train, y_train) importances = rf.feature_importances_ indices = np.argsort(importances)[-15:] plt.figure(figsize=(10, 6)) plt.title("Top 15 Feature Importances") plt.barh(range(len(indices)), importances[indices]) plt.yticks(range(len(indices)), [feature_names[i] for i in indices]) plt.show()

这段代码先做 5 折交叉验证,输出 F1 均值和标准差。标准差越小,模型越稳定。然后画特征重要性条形图。注意feature_names要和你数据集的列名对应。如果你用了 PCA,特征重要性就没法直接解释了,所以建议在报告里同时放 PCA 和不做 PCA 的版本,对比可解释性。我一般会强制自己每次跑完模型都看一眼特征重要性,因为有一次我发现模型在“作弊”——它把difficulty列也当成特征了,而那一列是数据集自带的难度标记,不是真实流量特征。从那以后我每次加载数据都强制检查列名,把非特征列删掉。希望这份资源能帮你顺利交上大作业,少走点弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询