KDD-99数据集实战:基于机器学习的网络入侵检测系统优化

KDD-99数据集:机器学习实战网络入侵检测 随着互联网使用和机器学习的兴起,入侵检测已成为机器学习领域一个重要课题。 阅读详情

1. 从零开始:认识KDD-99与网络入侵检测

如果你对网络安全感兴趣,或者正在学习机器学习,那你大概率听说过KDD-99数据集。它就像网络安全领域的“MNIST”,是无数研究者入门和验证算法的经典“试金石”。简单来说,KDD-99是一个记录了大量模拟网络连接行为的数据集,每一条记录都像是一次网络访问的“体检报告”,上面详细记录了这次连接的时长、发送的数据量、触发的错误次数等41个维度的特征,并且最终被打上了一个标签:这次连接是“正常”的,还是一次“攻击”行为。

我刚开始接触这个数据集的时候,觉得它就是个普通的CSV文件,没什么特别的。但真正用起来才发现,这里面门道很深。它的价值在于,它不是一个冷冰冰的、完美规整的实验室数据,而是高度模拟了真实网络环境中的复杂性和“噪音”。数据里包含了超过490万条连接记录(我们常用的是其10%的子集),攻击类型又细分为四大类:DoS(拒绝服务攻击)、Probe(探测扫描)、R2L(远程到本地的未授权访问) 和 U2R(用户到root的权限提升攻击)。这就像教你识别坏人,不仅告诉你这是坏人,还告诉你他是小偷、强盗还是诈骗犯,让你能更精准地建立防御策略。

那么,基于机器学习的网络入侵检测系统(NIDS)到底是什么呢?你可以把它想象成一个不知疲倦的、超级有经验的网络保安。传统的规则库防火墙就像是一份“通缉令”列表,只抓名单上有的坏人。而机器学习驱动的NIDS,则是让这个保安通过观察海量正常和异常的网络流量(也就是用KDD-99这样的数据集来训练),自己学会总结“坏人”的行为模式。即使遇到一个全新的、不在通缉令上的攻击手法,只要它的行为模式偏离了“正常”的范畴,系统也能发出警报。这种从数据中学习规律的能力,正是应对日益复杂和隐蔽的网络威胁的关键。

这篇文章,我就想和你分享我这些年折腾KDD-99数据集的一些实战心得。我不会只给你看几个漂亮的准确率数字,那没太大意义。我会带你一步步走完从数据清洗、特征工程到模型调优的全过程,重点聊聊那些能让你的模型从“还行”变得“很稳”的优化技巧,并且用实际的代码和结果对比,让你看得明白,自己也能动手复现。无论你是刚入门的学生,还是想在实际项目中应用机器学习的安全工程师,相信这些踩过的坑和总结的经验都能帮到你。

2. 数据预处理:打好地基,模型才能站得稳

很多新手朋友拿到数据,恨不得马上导入模型开始训练,追求一个快速的“结果”。这是我踩过的第一个大坑。KDD-99数据集如果不经过精心处理,直接喂给模型,效果会大打折扣,甚至会产生严重的误导。数据预处理,就是给模型准备一份干净、规整、易消化的“食材”,这一步做扎实了,后面的“烹饪”(模型训练)才能出美味。

2.1 数据清洗与探索:发现隐藏的问题

首先,我们得看看数据到底长什么样。原始数据集中存在大量的重复记录,这在真实网络流量中其实很常见,比如一次持续的DoS攻击会产生大量相似的数据包。但如果不处理,这些冗余数据会让模型产生偏见,以为某些模式特别重要,同时也浪费计算资源。我的做法是直接去重。去重之后,数据量会从近50万条锐减到14万多条,别心疼,这去掉的是“水分”,留下的是“精华”。

import pandas as pd
import numpy as np

# 加载数据,假设数据文件为kddcup.data_10_percent.gz
df = pd.read_csv('kddcup.data_10_percent.gz', header=None)
# ...(这里需要加载KDD-99的列名文件,为df.columns赋值)

# 查看初始形状和基本信息
print(f"原始数据集形状: {df.shape}")
print(f"列名: {df.columns.tolist()}")
print(df.info())

# 1. 删除完全重复的行
initial_count = df.shape[0]
df.drop_duplicates(inplace=True)
print(f"去重后记录数: {df.shape[0]}, 删除了 {initial_count - df.shape[0]} 条重复记录。")

接下来,检查缺失值。幸运的是,KDD-99数据集非常完整,几乎没有缺失值。但我们还需要关注数据分布。比如,目标标签label的分布极不均衡,“normal”(正常)和“smurf”(一种DoS攻击)类别的样本数量远超其他攻击类型。这种类别不平衡是入侵检测中的典型挑战,模型很容易被多数类“带偏”,对少数攻击类型(如U2R, R2L)的检测率极低。在预处理阶段,我们就要心里有数,为后续的采样策略或损失函数调整做准备。

2.2 特征编码与标准化:让模型“读懂”数据

数据里有数值特征(如duration连接时长,src_bytes源字节数),也有分类特征(如protocol_type协议类型,service服务类型)。计算机模型,尤其是基于数学运算的机器学习模型,更擅长处理数字。所以我们需要把分类特征转换成数字。

这里有个细节:对于protocol_type(tcp, udp, icmp)这种无序分类变量,我常用LabelEncoder或pd.factorize进行标签编码。但对于service这种有几十个取值的特征,标签编码会引入错误的顺序关系(比如http=1, ftp=2,模型会误以为2比1大)。更好的方法是使用独热编码(One-Hot Encoding)。不过,独热编码会显著增加特征维度,需要权衡。在初期,我们可以先用标签编码快速验证流程。

from sklearn.preprocessing import LabelEncoder, MinMaxScaler

# 定义分类特征列和数值特征列(根据实际数据集调整)
categorical_cols = ['protocol_type', 'service', 'flag']
numeric_cols = [col for col in df.columns if col not in categorical_cols + ['label']]

# 对分类特征进行标签编码(注意:对于service,生产环境建议考虑独热编码或嵌入)
label_encoders = {}
for col in categorical_cols:
    le = LabelEncoder()
    df[col] = le.fit_transform(df[col])
    label_encoders[col] = le  # 保存编码器,用于后续对新数据的转换

# 对数值特征进行归一化(Min-Max Scaling)
scaler = MinMaxScaler()
df[numeric_cols] = scaler.fit_transform(df[numeric_cols])

# 对目标标签进行编码
le_target = LabelEncoder()
df['label_encoded'] = le_target.fit_transform(df['label']) # 新建一列存储编码后的标签

归一化或标准化是另一个关键步骤。像src_bytes(可能几万)和duration(可能几百)这样的特征,数值范围差异巨大。如果不处理,模型会认为数值大的特征更重要。通过MinMaxScaler将所有数值特征缩放到[0, 1]区间,或者使用StandardScaler将其转换为均值为0、方差为1的分布,可以保证每个特征在模型眼中处于平等的起跑线上。

2.3 数据集划分:为评估模型做好准备

我们不能用训练模型的数据去评估它,那叫“作弊”,结果会过于乐观。必须将数据划分为训练集和测试集。通常我用70%的数据训练,30%的数据测试。这里要特别注意使用stratify参数进行分层抽样。因为数据不平衡,随机划分可能导致测试集中某些攻击类型样本极少甚至没有。分层抽样能确保训练集和测试集中各类别的比例与原始数据集保持一致,评估结果才可信。

from sklearn.model_selection import train_test_split

# 假设X是特征数据,y是编码后的标签
X = df.drop(['label', 'label_encoded'], axis=1) # 特征
y = df['label_encoded'] # 目标

# 分层划分数据集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)
print(f"训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")

# 检查划分后的类别分布
print("训练集类别分布:")
print(pd.Series(y_train).value_counts(normalize=True))
print("\n测试集类别分布:")
print(pd.Series(y_test).value_counts(normalize=True))

完成这些,我们的数据“地基”才算初步打好。但这还不够,41个特征对于很多模型来说依然维度偏高,且可能存在大量无关或冗余特征。下一步,我们就要进行“精装修”——特征工程。

3. 特征工程与选择:找到真正的“关键线索”

特征工程被很多人称为机器学习项目的“灵魂”,在入侵检测中尤其如此。原始数据中的41个特征并非同等重要,有些特征可能是噪声,有些特征之间高度相关。好的特征选择能降低计算复杂度、防止过拟合、提升模型性能,甚至增强模型的可解释性。我试过直接用全部特征训练,效果不仅提升有限,训练时间还特别长。

3.1 基于模型的特征重要性分析

一个快速有效的方法是使用树模型(如随机森林)来评估特征重要性。随机森林在训练过程中会自然地计算每个特征对减少数据不确定性的贡献度。我们可以训练一个初步的随机森林,然后查看它的feature_importances_属性。

from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt

# 使用训练集训练一个随机森林
rf_for_feature = RandomForestClassifier(n_estimators=100, random_state=42, n_jobs=-1)
rf_for_feature.fit(X_train, y_train)

# 获取特征重要性并排序
importances = rf_for_feature.feature_importances_
indices = np.argsort(importances)[::-1] # 从大到小排序的索引
feature_names = X_train.columns

# 绘制最重要的前15个特征
plt.figure(figsize=(10, 6))
plt.title("Top 15 Feature Importances (Random Forest)")
plt.barh(range(15), importances[indices[:15]][::-1], align='center')
plt.yticks(range(15), [feature_names[i] for i in indices[:15]][::-1])
plt.xlabel('Relative Importance')
plt.tight_layout()
plt.show()

# 打印重要性排名
print("特征重要性排名(前10):")
for i in range(10):
    print(f"{i+1}. {feature_names[indices[i]]}: {importances[indices[i]]:.4f}")

通过这个分析,我发现在KDD-99数据集中,像 src_bytes(源到目的地的字节数)、dst_host_srv_count(目标主机相同服务的连接计数)、count(过去两秒内到同一主机的连接数)以及 same_srv_rate(相同服务的连接比例)等特征,往往排名非常靠前。这些特征直观上也很好理解,它们直接反映了连接行为的密集度、数据量和模式规律性,是区分正常访问和洪水攻击、扫描攻击的关键。

3.2 使用SelectFromModel进行自动化特征选择

手动根据重要性阈值选择特征有点麻烦,sklearn提供了SelectFromModel这个好用的工具。它可以基于我们训练好的评估器(比如刚才的随机森林),自动选择重要性高于某个阈值的特征。

from sklearn.feature_selection import SelectFromModel

# 使用随机森林作为基模型进行特征选择
selector = SelectFromModel(
    RandomForestClassifier(n_estimators=50, random_state=42),
    threshold='median' # 选择重要性在中位数以上的特征
)
selector.fit(X_train, y_train)

# 获取被选中的特征
selected_feat = X_train.columns[selector.get_support()]
print(f"原始特征数量: {X_train.shape[1]}")
print(f"选中特征数量: {len(selected_feat)}")
print("选中的特征:", selected_feat.tolist())

# 转换数据集
X_train_selected = selector.transform(X_train)
X_test_selected = selector.transform(X_test)

在实际操作中,我通常会尝试不同的阈值(如‘mean’, ‘median’,或自定义数值),或者结合交叉验证来选择最优的特征子集。有时候,特征数量减少到原来的1/3甚至更少,模型准确率不仅没降,反而因为去除了噪声而有所提升,训练速度更是快了好几倍。

3.3 针对特定攻击类型的特征构造

KDD-99的特征虽然丰富,但有时为了提升对特定攻击的检测能力,我们还需要构造新的特征。例如,对于R2L(远程本地攻击)和U2R(权限提升攻击)这类低频、隐蔽的攻击,它们往往不会在单次连接中表现出明显的异常,而是体现在一系列连接的模式上。

虽然原始数据集中已经包含了一些基于时间窗口的统计特征(如count, serror_rate),但我们还可以尝试构造更多。比如,可以计算“登录失败次数与总登录尝试次数的比率”、“root权限访问命令的使用频率”等(这需要更细粒度的原始日志,KDD-99中可能已抽象)。这个思路很重要:结合领域知识进行特征构造,是突破模型性能瓶颈的重要手段。在真实项目中,我们往往需要和安全专家一起,分析攻击链,提炼出关键的行为指标作为新特征。

4. 模型选择、训练与调优:打造高精度检测引擎

数据准备好了,特征也选好了,现在终于到了最激动人心的环节——训练模型。我们的目标不是找到一个“万能”的模型,而是根据入侵检测任务的特点,找到最适合的模型,并把它调整到最佳状态。

4.1 模型初选与基准测试

我习惯先从几个不同原理的经典模型开始,建立一个性能基准。对于分类任务,随机森林、梯度提升树(如XGBoost, LightGBM)、支持向量机(SVM)和神经网络都是常见的选择。

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 初始化几个模型
models = {
    'Random Forest': RandomForestClassifier(n_estimators=100, random_state=42, n_jobs=-1),
    'Gradient Boosting': GradientBoostingClassifier(n_estimators=100, random_state=42),
    'SVM (RBF)': SVC(kernel='rbf', random_state=42, probability=True), # 注意SVM在大数据集上可能较慢
    'MLP Neural Net': MLPClassifier(hidden_layer_sizes=(64, 32), max_iter=200, random_state=42)
}

# 在特征选择后的数据上训练和评估
for name, model in models.items():
    print(f"\n=== 训练 {name} ===")
    model.fit(X_train_selected, y_train)
    y_pred = model.predict(X_test_selected)
    accuracy = accuracy_score(y_test, y_pred)
    print(f"测试集准确率: {accuracy:.4f}")
    # 可以进一步查看更详细的分类报告,关注少数类的召回率
    # print(classification_report(y_test, y_pred, target_names=le_target.classes_))

在我的多次实验中,树模型家族(随机森林、XGBoost)通常在KDD-99上表现非常出色,准确率很容易达到99%以上。这得益于它们对非线性关系强大的捕捉能力,以及对特征量纲不敏感的特性。SVM在调参得当的情况下也能取得不错的效果,但训练时间相对较长。神经网络是个“潜力股”,但在数据量不是特别巨大的情况下,其表现可能并不比调优好的树模型有显著优势,且训练和调参更复杂。

4.2 应对类别不平衡:比准确率更重要的指标

在入侵检测中,整体准确率高不代表系统好。因为攻击样本(尤其是U2R、R2L)远少于正常样本,一个愚蠢的模型只要把所有连接都预测为“正常”,也能获得很高的准确率,但这毫无用处。我们必须关注召回率(Recall),特别是对少数攻击类别的召回率。召回率衡量的是“在所有真正的攻击中,我们抓住了多少”。

提升少数类召回率的方法有很多:

  1. 调整类别权重:在模型训练时,给少数类样本更高的权重,让模型更关注它们。sklearn中很多模型都有class_weight='balanced'参数。
    rf_balanced = RandomForestClassifier(n_estimators=200, class_weight='balanced', random_state=42, n_jobs=-1)
    rf_balanced.fit(X_train_selected, y_train)
    
  2. 重采样技术:
    • 过采样:如SMOTE算法,通过插值合成新的少数类样本。
    • 欠采样:随机减少多数类样本的数量。 我个人的经验是,对于KDD-99,使用class_weight参数进行加权是更简单有效的方法,能避免过采样可能带来的过拟合风险。
  3. 使用更合适的评估指标:不要只看准确率。多关注精确率-召回率曲线(PR Curve) 下的面积(AUC-PR),它对类别不平衡更敏感。对于多分类,可以查看每个类别的F1-score(精确率和召回率的调和平均)。
from sklearn.metrics import precision_recall_fscore_support, classification_report

# 使用带类别权重的模型进行预测
y_pred_balanced = rf_balanced.predict(X_test_selected)

# 输出详细的分类报告
print(classification_report(y_test, y_pred_balanced, target_names=le_target.classes_))

# 可以单独查看某个稀有攻击类别(例如‘U2R’)的召回率
# 假设‘U2R’编码后的标签是 class_index
# u2r_index = list(le_target.classes_).index('U2R')
# u2r_recall = recall_score(y_test, y_pred_balanced, labels=[u2r_index], average=None)[0]
# print(f"U2R攻击的召回率: {u2r_recall:.4f}")

4.3 超参数调优:让模型性能再上一个台阶

默认参数的模型就像出厂设置的汽车,能开,但未必好开。通过调优,我们可以把模型的潜力榨出来。以随机森林为例,n_estimators(树的数量)、max_depth(树的最大深度)、min_samples_split(节点分裂所需最小样本数)等参数都至关重要。

手动调参效率低,我们可以用GridSearchCV(网格搜索)或RandomizedSearchCV(随机搜索)进行自动化调优。随机搜索在参数空间大时效率更高。

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint

# 定义参数分布
param_dist = {
    'n_estimators': randint(100, 500),
    'max_depth': [10, 20, 30, None], # None表示不限制深度
    'min_samples_split': randint(2, 20),
    'min_samples_leaf': randint(1, 10),
    'max_features': ['sqrt', 'log2', None] # 寻找最佳分裂时考虑的特征数
}

# 初始化基础模型
rf_base = RandomForestClassifier(class_weight='balanced', random_state=42, n_jobs=-1)

# 初始化随机搜索
random_search = RandomizedSearchCV(
    estimator=rf_base,
    param_distributions=param_dist,
    n_iter=50, # 随机尝试50组参数
    cv=3, # 3折交叉验证
    scoring='f1_weighted', # 使用加权F1分数作为评估标准
    verbose=1,
    random_state=42,
    n_jobs=-1
)

# 在训练集上执行搜索
random_search.fit(X_train_selected, y_train)

# 输出最佳参数和最佳分数
print(f"最佳参数: {random_search.best_params_}")
print(f"最佳交叉验证分数 (加权F1): {random_search.best_score_:.4f}")

# 使用最佳模型在测试集上最终评估
best_rf = random_search.best_estimator_
y_pred_best = best_rf.predict(X_test_selected)
final_accuracy = accuracy_score(y_test, y_pred_best)
print(f"\n调优后模型在测试集上的准确率: {final_accuracy:.4f}")

经过这样一轮系统的数据预处理、特征工程和模型调优,你的网络入侵检测模型性能会有质的飞跃。我自己的一个项目里,通过上述优化流程,将针对U2R和R2L这类稀有攻击的召回率从最初的不足50%提升到了80%以上,而整体准确率依然保持在99.5%的高位。这背后的关键,就是对数据深刻的理解和持续不断的迭代优化。

5. 系统集成与性能评估:从模型到可用的系统

训练出一个高精度的模型只是成功了一半。如何将它集成到一个可以实时或准实时分析网络流量的系统中,并科学地评估其整体性能,是更具挑战性也更有价值的实战环节。

5.1 构建实时检测流水线

一个简单的实时检测系统流水线可以这样设计:

  1. 数据采集:从网络设备(如交换机镜像端口)或流量监控工具(如Zeek/Bro)中实时捕获网络连接数据包。
  2. 特征提取:对每个连接会话,按照KDD-99定义的41个特征(或你优化后的特征集)进行实时计算。这需要编写相应的特征提取脚本,例如计算过去两秒内向同一目标主机发起连接的数量(count),计算连接中SYN错误的比例(serror_rate)等。
  3. 数据预处理:将提取出的原始特征,使用我们之前训练时保存的LabelEncoder和MinMaxScaler对象进行相同的编码和缩放。这里至关重要:必须使用训练时拟合好的转换器,不能对实时数据重新拟合。
  4. 模型预测:将处理好的特征向量输入到我们训练好的、调优过的模型(如best_rf)中进行预测。
  5. 告警与响应:如果模型预测为攻击,则根据攻击类型和置信度,触发不同等级的告警,并可与防火墙等设备联动,进行阻断或记录。
import pickle
import numpy as np

# 假设我们已经保存了训练好的模型、特征选择器和数据转换器
# 在训练结束后保存
with open('intrusion_detection_pipeline.pkl', 'wb') as f:
    pickle.dump({
        'model': best_rf,
        'feature_selector': selector,
        'scaler': scaler,
        'label_encoder': le_target,
        'categorical_encoders': label_encoders
    }, f)

# 在实时检测系统中加载
with open('intrusion_detection_pipeline.pkl', 'rb') as f:
    pipeline = pickle.load(f)

model = pipeline['model']
selector = pipeline['feature_selector']
scaler = pipeline['scaler']

def real_time_predict(raw_features):
    """
    raw_features: 字典或数组,包含从一条网络连接中实时提取的原始特征
    """
    # 1. 将原始特征转换为DataFrame(单行)
    df_raw = pd.DataFrame([raw_features])

    # 2. 分类特征编码(使用保存的encoder)
    for col, encoder in pipeline['categorical_encoders'].items():
        # 注意处理未见过的类别,可以统一编码为‘unknown’或最常见的类别
        df_raw[col] = df_raw[col].apply(lambda x: x if x in encoder.classes_ else 'unknown')
        # 转换时可能会遇到训练时未见的标签,需要处理
        df_raw[col] = encoder.transform(df_raw[col])

    # 3. 数值特征缩放(使用保存的scaler)
    numeric_cols = [col for col in df_raw.columns if col not in pipeline['categorical_encoders'].keys()]
    df_raw[numeric_cols] = scaler.transform(df_raw[numeric_cols])

    # 4. 特征选择(使用保存的selector)
    features_selected = selector.transform(df_raw)

    # 5. 模型预测
    prediction_encoded = model.predict(features_selected)[0]
    prediction_prob = model.predict_proba(features_selected)[0]

    # 6. 解码预测结果
    attack_type = pipeline['label_encoder'].inverse_transform([prediction_encoded])[0]
    confidence = np.max(prediction_prob)

    return attack_type, confidence

# 模拟一条实时连接的特征
sample_connection = {
    'duration': 0,
    'protocol_type': 'tcp',
    'service': 'http',
    'flag': 'SF',
    'src_bytes': 100,
    'dst_bytes': 200,
    # ... 其他特征
}
# attack_type, confidence = real_time_predict(sample_connection)

5.2 超越准确率:全面的性能评估体系

在真实系统中,我们需要一套更全面的评估指标:

  • 混淆矩阵:直观展示模型在每个类别上的预测情况(真阳性、假阳性、真阴性、假阴性)。
  • 精确率、召回率、F1-Score(按类别和宏观/微观平均):这是核心指标。对于入侵检测,我们通常更追求高召回率(尽量不漏报攻击),同时也要控制一定的精确率(减少误报,避免告警疲劳)。
  • ROC曲线与AUC值:适用于二分类问题,对于多分类可以计算每个类别对应的ROC AUC。AUC值越接近1,模型区分能力越强。
  • 检测延迟:从数据包到达到产生告警的时间,这对实时性要求高的场景很重要。
  • 资源消耗:模型推理时对CPU/内存的占用率。

我习惯在项目后期,用一个独立的、包含各种攻击类型的验证集(最好是与训练集、测试集时间上或来源上略有不同的数据)来做最终的系统级评估。这能更好地模拟模型上线后遇到新数据时的表现。

5.3 持续学习与模型更新

网络攻击手法日新月异,一个静态的模型很快就会过时。因此,一个健壮的入侵检测系统必须具备持续学习的能力。可以设计一个反馈闭环:

  1. 系统产生的告警,经过安全分析师的确认(True Positive或False Positive)。
  2. 将这些确认后的新样本(尤其是新的攻击变种)加入训练数据集。
  3. 定期(如每周或每月)用更新的数据重新训练或微调模型。
  4. 通过A/B测试或影子模式,将新模型与旧模型对比,确认性能提升后再上线替换。

这个过程可以实现自动化,但需要特别注意数据的安全性和标注质量。同时,要警惕概念漂移——网络正常行为模式本身也会随时间变化,模型需要适应这种变化。

折腾KDD-99数据集这么多年,我最大的体会是,构建一个高效的入侵检测系统,机器学习模型只是核心部件之一。围绕它的数据流水线、特征工程管道、评估体系和更新机制,共同决定了系统的最终成败。从实验室99%的准确率,到生产环境中稳定、可靠、可解释的检测能力,中间还有很长的路要走,但每一步的优化和思考,都让整个系统变得更加强大和智能。希望我分享的这些实战经验和代码片段,能为你启动自己的项目提供一个坚实的跳板。记住,多动手实验,多分析错误案例,你会对网络安全和机器学习有更深的理解。

NSL-KDD数据集详细介绍及下载 难度等级表示每条记录分类时判断的难易程度,是一个[0,21]范围内的整数,数值越 大表示该记录越容易分类,0是最不容易分类的。对 于主机入侵检测,采用的方法比较灵活,既可以是操作系统的各种日志,也可以是某些应 用系统的日志,还可以通过开发驻留于主机的应用软件等方法获得主机数据。NSL-KDD每条流量的41个特征的含义如表5-1所示,表中列出了特征名称及其类 型,其中 continuous是 连 续 数 值 型,symbolic是 符 号 类 型。,表示相应的流量为正常 或异常。因此 NSL-KDD是一个。 阅读详情

相关推荐

网络工程毕业设计选题指南与100个实用案例

网络协议分析与网络安全是计算机网络领域的核心研究方向。从TCP/IP协议栈到HTTP/2性能优化,协议分析帮助理解网络通信原理;而入侵检测、防火墙策略等安全技术则保障网络系统可靠性。这些技术在网络管理、物联网等应用场景中发挥关键作用。针对网络工程专业毕业设计需求,本文整理了包含Wireshark协议分析、机器学习入侵检测、SNMP网络监控等100个典型选题,涵盖协议实现、安全防护、运维管理等方向,结合Python、Java等开发语言和TensorFlow等框架,为本科生提供兼具技术深度和实现可行性的项目参考

weixin_28730549的博客 341

快速了解NSL-KDD数据集

NSL-KDD 数据集是著名的KDD’99数据集的修订版本,该数据集由四个子数据集组成:KDDTest+、KDDTest-21、KDDTrain+、KDDTrain+_20Percent。其中KDDTest-21 和 KDDTrain+_20Percent 是 KDDTrain+ 和 KDDTest+ 的子集。数据集每条记录包含 43 个特征,其中 41 个特征指的是流量输入本身,最后两个是标签(正常或攻击)和分数(流量输入本身的严重性)。 数据集中存在 4 种不同类型的攻击:拒绝服务 (DoS)、探测、用

airen的博客 3万+

KDDCUP99数据集处理(Keras)

环境: Anaconda3-Spyder、python+keras+pandas+sklearn 数据集介绍 KDDCup99的原始数据来自于1998年的DARPA入侵检测评估项目,所有的网络数据来自于一个模拟的美国空军局域网,网络中加了很多模拟的攻击。实验的训练数据为7周的网络流量,这些网络流量包含有约500万条网络连接;实验的测试数据为2周的网络流量,包含有约200万条网络连接。 对以上的数据...

qq_39480875的博客 2万+

关于KDD99入侵检测数据集的FAQ

1 KDDCup99网络入侵检测数据集介绍 该数据集是从一个模拟的美国空军局域网上采集来的9个星期的网络连接数据,分成具有标识的训练数据和未加标识的测试数据。测试数据和训练数据有着不同的概率分布,测试数据包含了一些未出现在训练数据中的攻击类型,这使得入侵检测更具有现实性。 在训练数据集中包含了1种正常的标识类型normal和22种训练攻击类型,如表1-1所示。另外有14种攻击仅出现在测试数据集中...

win_in_action的专栏 6061

基于机器学习的网络入侵检测二元分类模型构建与性能评估(NSL-KDD数据集)

该项目是一个基于NSL-KDD数据集的网络入侵检测系统,主要采用机器学习方法对网络流量数据进行使用了多种机器学习模型,如逻辑回归、线性SVM、多项式核SVM、高斯核SVM、决策树、随机森林、朴素贝叶斯和K近邻算法训练二元分类(正常/异常)模型及预测,最后比较了各个算法的检测效果。

正在成为 code ape 4237

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

之前用NSL-KDD数据集做入侵检测的项目是:【1】【2】有人问我是不是可以改代码,我说可以。

q742971636的博客 1811

计算机毕业设计Python深度学习网络入侵检测系统 网络安全攻防系统 网络安全 信息安全(源码+LW文档+PPT+讲解视频)

计算机毕业设计Python深度学习网络入侵检测系统 网络安全攻防系统 网络安全 信息安全(源码+LW文档+PPT+讲解视频)

全网计算机/大数据辅导(自媒体)道祖第一人、全网粉丝100W+,专注于大学生项目实战开发,讲解,毕业答疑辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。同时招收学生代理、校园代理。 1060

41、网络安全与农业科技:前沿技术解析

本文探讨了网络安全、农业科技和RFID技术等领域的前沿技术与创新应用。重点介绍了基于机器学习的网络入侵检测系统(IDS)在流量模式学习和攻击检测中的应用,以及常见数据集的使用;基于ESP32的物联网灌溉系统通过多传感器协同实现智能水资源管理;同时分析了RFID标签碰撞问题及其缓解策略。文章还对这三类技术的特点、应用场景和未来发展趋势进行了深入对比和展望,展示了它们在各自领域的重要价值和挑战。

dropout6artist的博客 64

CIC-IDS-2017数据集实战:从原始流量到机器学习就绪数据的完整预处理流程

本文详细介绍了CIC-IDS-2017数据集从原始网络流量到机器学习就绪数据的完整预处理流程。内容涵盖数据加载与初步检查、特征工程、数据清洗、异常值处理、数据集拆分与保存等关键步骤,并分享了内存管理、标签泄露、类别不平衡等实战避坑指南,旨在帮助安全分析师和机器学习从业者高效构建高质量的入侵检测模型训练数据。

r7s8t的博客 502

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

特征编号特征名称特征描述类型范围1duration连接持续时间,从TCP连接建立到结束的时间,或每个UDP数据包的连接时间连续[0, 58329]秒2协议类型,可能值为TCP, UDP, ICMP离散3service目标主机的网络服务类型,共70种可能值离散4flag连接状态,11种可能值,表示连接是否按照协议要求开始或完成离散5src_bytes从源主机到目标主机的数据的字节数连续6dst_bytes从目标主机到源主机的数据的字节数连续7。

q742971636的博客 5292

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

【深度学习】用神经网络进行入侵检测,NSL-KDD数据集,用TCP连接特征判断是否是网络入侵NSL-KDD数据集,有dos,u2r,r21,probe等类型的攻击,和普通的正常的流量,即是这样:Normal:正常记录 DOS:拒绝服务攻击 PROBE:监视和其他探测活动 R2L:来自远程机器的非法访问 U2R:普通用户对本地超级用户特权的非法访问数据集样子:https://towardsdatascience.com/a-deeper-dive-into-the-nsl-kdd-data-set-15c75

q742971636的博客 3838

kdd数据集_数据建模分析复习

目录数据挖掘基础理论数据可视化预处理机器学习模型模型评估指标过拟合欠拟合数据挖掘基础理论起源:2000年定义:从大量数据中提取隐藏在其中的,事先不知道的、但潜在有用的信息的过程。目标:建立一个决策模型KDD(Knowledge Discovery from Database):数据清理、数据集成、数据选择、数据变换、数据挖掘、模式评估、知识表示CRISP-DM(cross-industry pro...

weixin_39718173的博客 960

揭秘Outlook/QQ邮箱伪造:如何利用Unicode编码绕过SPF检测

本文深入剖析了利用Unicode编码进行邮件显示名伪造的攻击手法,揭示了攻击者如何通过插入零宽字符等特殊编码绕过SPF检测,使邮件在Outlook、QQ邮箱等客户端中看似来自可信发件人。文章通过Python代码示例演示了伪造过程,并提供了从用户自查到管理员部署DMARC策略的多层次防御建议。

weixin_29063035的博客 332

KDD99数据集预处理

KDD99数据集,全称KDD Cup 1999数据集,是一个广泛用于网络入侵检测研究的大型公开数据集。

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 3573

MIC(Maximal Information Coefficient)最大互信息系数

MIC(Maximal Information Coefficient)最大互信息系数是一种用于衡量两个变量之间相关性的统计量。它扩展了传统的互信息(MI)和条件互信息(CMI)的概念,具有更广泛的应用范围。MIC能够捕获包括功能性和非功能性的广泛的关联,具有普遍性和公平性。普遍性意味着在足够的样本量下,MIC能够捕捉到广泛的相关关系,而不仅仅局限于特定的功能类型;公平性则意味着MIC对不同类型的包含同等噪声的关系给出了相似的分数。需要注意的是,虽然MIC具有很多优点,但它也有一些局限性。

qlkaicx的博客 4603

GPS从入门到放弃(一) --- GPS基础原理

GPS从入门到放弃(一) — GPS基础原理 GPS,全称Global Positioning System,已经广泛应用于我们的日常生活中了,现在的智能手机 里都会自带GPS定位功能。这是一个美国的全球定位系统,虽然我们现在也有北斗了,但毕竟GPS搞的早,所以先从它开始研究起。 整个GPS系统分三大部分: 地面站 卫星 接收机 地面站负责监控。它们通过接收、测量各个卫星信号,计算卫星的运行轨...

tyst08的专栏 2万+

探索NSL-KDD数据集:入侵检测的起点

NSL-KDD数据集是KDD Cup 1999数据集的改进版本。KDD Cup 1999数据集因其冗余和不平衡问题而广受批评。NSL-KDD数据集通过删除冗余记录和重新平衡样本,解决了这些问题,使其成为机器学习研究中的标准数据集之一。NSL-KDD数据集包含41个特征和一个标签,特征包括基本特征、内容特征和基于流量的特征。标签用于标识连接是正常(normal)还是攻击(attack)。攻击类型分为四类:DOS(拒绝服务攻击)、R2L(远程到本地攻击)、U2R(用户到根攻击)和Probe(探测攻击)。

mh007的博客 5960

python数据处理与分析案例,python如何进行数据处理

大家好,本文将围绕基于python的数据处理案例展开说明,python数据处理与分析案例是一个很多人都想弄明白的事情,想搞清楚python如何进行数据处理需要先了解以下几个事情。大家好,小编来为大家解答以下问题,python数据处理案例步骤及其代码,python数据处理与分析教程,今天让我们一起来看看吧!哈喽~今天学习记录的是数据分析实训小案例。就用这个案例来好好巩固一下 python 数据分析三剑客。

a17348的博客 1237

入侵检测领域数据集总结

本文数据引用自以下文献:数据集后括号内值依次对应:KDD99数据集由 Lee 和 Stolfo (2000) 从 DARPA 网络数据集文件创建。该数据集包含七周的网络流量,大约包含 490 万条记录 。攻击类型分为:(1)用户到root(U2R); (2)远程到本地(R2L); (3) 探查; (4) DoS。每个实例由三个类别的 41 个特征表示:(1)基本; (二)流量; (3) 内容。基本特征是从 TCP/IP 连接中提取的。流量特征分为具有相同主机特征或相同服务特征的流量特征。内容特征与数据部分的

airen的博客 1万+

手把手教你学Simulink--双足机器人的反步控制方法仿真

本文介绍了在Simulink中基于反步控制方法进行双足机器人仿真研究的步骤。主要内容包括:1)准备工作,包括MATLAB/Simulink安装和相关工具箱配置;2)构建简化双足机器人模型;3)设计反步控制器,阐述其递归设计原理及Lyapunov函数构造方法;4)通过MATLAB Function块实现控制逻辑并连接模型;5)仿真参数配置和结果分析。文章强调反步控制适用于非线性系统,通过逐步构造虚拟控制律保证系统稳定性,并指出需要多次调试和查阅文献来优化控制效果。该教程为研究双足机器人运动控制提供了实用的仿真

MHD0815的博客 151

黑猫带你学UFS协议第17篇:UFS安全模式详解(Secure Mode)

本文详细介绍了UFS协议中的安全模式,包括Erase, Discard, Purge和Wipe Device操作。Erase用于永久删除数据并确保无法恢复;Discard不保证数据清除;Purge类似于Sanitize,清除内部未映射的物理块数据;Wipe Device则是格式化设备。这些操作涉及逻辑单元、擦除单位、相关寄存器配置等,确保数据安全。" 126036669,12409270,MySQL 8.0 开窗函数详解,"['数据库理论', 'SQL']

黑猫奥利奥的博客 2559

KDD CUP99数据集预处理(Python实现)

...

weixin_41843972的博客 4759

微信小程序 - 最新详细实现调起手机摄像头拍摄身份证人像面和国徽面取景框功能,在拍照相机上增加身份证证件照的轮廓或自定义文字,支持替换扫描拍摄辅助线图片及文本,小程序实现拍照身份证时带取景轮廓框拍摄!

微信小程序,身份证,证件照,人像,证件照提示框模板,vue身份证拍照框,摄像机相机里有引导内容,取景框拍摄,微信小程序实现拍照界面自定义实现,自拍人相框拍摄,取景框,户口簿取景框,画布指定区域生成图片,微信小程序身份证正反面拍照如何加入辅助图片引导照片,身份证取景框拍摄,服务器,上传,正反面,调起手机摄像头: 拍摄身份证的正反面,自定义身份证取景框,在相机上绘制 “身份证轮廓“ 与提示文字,拍摄身份证时出现人像框怎么实现,在相机上增加图片和文字,微信小程序怎么给调起的相机加入自定义图片,小程序实现给相机上面

🏆 前端领域优质创作者 3403

基于网络的入侵检测数据集研究综述(A Survey of Network-based Intrusion Detection Data Sets)

入侵检测;数据集; 网络流量;

一智哇的博客 6651

海洋浮游生物识海洋浮游生物识别系统:基于YOLOv10的显微图像自动检测与UI别系统:基于海洋浮游生物识别系统:基于YOLOv10的显微图像自动检测与UI展示YOLOv10的显微图像自动检测与UI展示

本文介绍了如何利用YOLOv10模型进行海洋浮游生物的自动识别,旨在提高传统显微镜观测的效率与准确性。研究背景强调了浮游生物在海洋生态系统中的重要性,并指出传统方法的局限性。数据集选用WHOI-Plankton,包含70多种浮游生物的20000多张带标签图像。文章详细描述了YOLOv10模型的安装、数据集配置、训练与测试步骤,并提供了基于PyQt5的图形化检测界面代码。结果显示,模型在精度、召回率和mAP@0.5等指标上表现优异,推理速度达到约30 FPS。最后,文章提出了部署建议和未来优化方向,如集成摄像

YOLO 374

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 基于RK3588的高效音视频对讲系统设计与实现
下一篇: YOLOv8训练中的‘隐形‘参数:那些官方文档没告诉你的实用技巧
dapp9builder
博客等级 码龄1天 0粉丝 1648原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值