基于CICIDS2018数据集的网络入侵检测实战:从特征工程到模型优化

1次阅读
没有评论

共计 2852 个字符,预计需要花费 8 分钟才能阅读完成。

image.webp

背景痛点

网络入侵检测系统(NIDS)在网络安全中扮演着至关重要的角色,而数据驱动的机器学习方法正逐渐成为主流。CICIDS2018 数据集作为业内广泛认可的基准数据集,包含了多种常见攻击类型(如 Brute Force、XSS、DDoS 等)和正常流量,是研究网络入侵检测的理想选择。然而,使用该数据集时我们会面临几个典型挑战:

  • 样本不平衡问题 :数据集中正常流量与攻击流量的比例高达 85:1,这种极端不平衡会导致模型倾向于预测多数类,忽视少数类(即攻击流量)。
  • 高维特征空间 :原始数据包含 300 多个特征,其中不少是高度相关或冗余的,这不仅增加了计算成本,还可能导致模型过拟合。
  • 零日攻击识别困难 :传统基于签名的检测方法无法有效识别未见过的攻击模式,而机器学习模型在遇到分布外样本时也常常表现不佳。

技术方案

特征工程

高维特征是网络流量数据的典型特点,但并非所有特征都对检测攻击有用。我们采用以下策略进行特征选择:

  1. 互信息初步筛选 :首先计算每个特征与目标变量的互信息(Mutual Information),保留排名前 30% 的特征。互信息能够捕捉线性与非线性的关系,适合网络流量这种复杂数据。

  2. 递归特征消除(RFE):在初步筛选的基础上,使用 XGBoost 作为基模型进行 RFE,进一步压缩特征空间。通过交叉验证确定最优特征数量,最终将特征维度从 300+ 降至 35。

样本处理

针对样本不平衡问题,我们采用 SMOTE-ENN 混合采样策略:

  • SMOTE:在少数类样本之间进行插值,生成合成样本以平衡类别分布。
  • ENN(Edited Nearest Neighbours):随后移除那些被多数类样本包围的合成样本,避免在决策边界引入噪声。

这种组合方法既能缓解类别不平衡,又能保持数据分布的清晰性。

模型对比

我们对比了两种主流模型在测试集上的表现:

  1. XGBoost:通过设置类别权重(scale_pos_weight 参数)和早停机制(early_stopping_rounds),在保证效率的同时获得较高准确率。

  2. LSTM-Attention:利用 LSTM 捕捉流量序列的时间依赖性,并通过注意力机制突出关键时间点。虽然计算成本较高,但对某些攻击类型(如 DDoS)的检测效果更好。

通过 ROC 曲线对比发现,XGBoost 在整体性能上略胜一筹(AUC 0.98 vs 0.96),但 LSTM-Attention 在检测低频攻击(如 Web 攻击)时表现更稳定。

代码实现

特征处理 Pipeline

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, mutual_info_classif

# 自定义 Transformer 处理 IP 和端口特征
class IPPortTransformer(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None):
        return self

    def transform(self, X):
        # 示例:提取源 IP 的哈希编码
        X['src_ip_hash'] = X['Source IP'].apply(lambda x: hash(x) % 1000)
        return X.drop(['Source IP', 'Destination IP'], axis=1)

# 完整 Pipeline
pipeline = Pipeline([('ipport', IPPortTransformer()),
    ('scaler', StandardScaler()),
    ('selector', SelectKBest(mutual_info_classif, k=100)),
    ('rfe', RFE(estimator=XGBClassifier(), n_features_to_select=35))
])

模型训练与早停

import xgboost as xgb
from sklearn.model_selection import train_test_split

# 划分数据集时确保分层抽样
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)

# 设置类别权重(根据样本比例自动计算)scale_pos_weight = len(y_train[y_train==0]) / len(y_train[y_train==1])

model = xgb.XGBClassifier(
    scale_pos_weight=scale_pos_weight,
    eval_metric='aucpr',  # 对不平衡数据 PR 曲线比 ROC 更敏感
    n_estimators=1000,
    early_stopping_rounds=50
)

model.fit(
    X_train, y_train,
    eval_set=[(X_val, y_val)],
    verbose=True
)

避坑指南

在实际项目中,我们总结了以下几个常见问题及解决方案:

  1. 数据泄漏
  2. 错误做法:在整个数据集上计算标准化参数(如均值、方差)后再划分训练 / 测试集。
  3. 正确做法:将 StandardScaler 等预处理步骤放入 Pipeline,确保只在训练集上 fit。

  4. UDP 洪水攻击检测

  5. 单条流记录难以识别 UDP Flood,需要基于时间窗口统计特征(如每秒包数)。
  6. 实现方式:使用滑动窗口(如 5 秒)聚合原始数据,生成新的统计特征。

  7. 在线部署特征对齐

  8. 训练时使用的特征顺序和类型必须与线上数据严格一致。
  9. 建议保存 Pipeline 的完整配置(如使用 joblib),部署时直接加载整个预处理流程。

可视化与结果

混淆矩阵(XGBoost)

基于 CICIDS2018 数据集的网络入侵检测实战:从特征工程到模型优化

从混淆矩阵可以看出,模型对 Brute Force 和 DDoS 攻击的识别率较高(Recall > 95%),但对低频的 Web Attack 仍有漏报。

特征重要性

前 5 重要特征分别是:

  1. Flow Duration
  2. Total Fwd Packets
  3. Total Length of Fwd Packets
  4. Flow IAT Mean
  5. Fwd Packet Length Max

这些特征与网络流量的基本统计特性相关,符合领域知识。

总结与展望

通过本项目的实践,我们验证了特征选择和样本平衡对提升网络入侵检测效果的重要性。XGBoost 凭借其优秀的默认参数和高效的实现,适合作为基线模型;而 LSTM 等深度模型则在特定场景下展现潜力。

未来可以探索的方向包括:

  • 加密流量分析:如何通过 TLS 握手特征识别恶意通信。
  • 在线学习:适应不断变化的攻击模式。
  • 模型解释性:提供可理解的攻击证据。

完整代码已上传 Colab:[实战项目链接](示例链接,实际使用时需替换)

思考题
1. 在不牺牲模型性能的前提下,如何进一步压缩特征维度?
2. 当遇到全新的攻击类型时,现有模型可能失效,有哪些应对策略?
3. 如何处理数据集中缺失的时间戳信息?

正文完
 0
评论(没有评论)