基于CICIDS2017数据集的深度学习实战:从数据预处理到模型训练全流程解析

1次阅读
没有评论

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

image.webp

背景介绍

CICIDS2017 是加拿大网络安全研究所发布的网络入侵检测数据集,包含正常流量和多种攻击类型(如 DDoS、Brute Force、XSS 等)。它的价值在于:

基于 CICIDS2017 数据集的深度学习实战:从数据预处理到模型训练全流程解析

  • 基于真实网络环境采集,包含完整的网络流量特征(如数据包大小、协议类型、流量时序等)
  • 时间跨度长达 5 天,包含标记的攻击时间段
  • 被学术界广泛用于验证入侵检测算法

核心挑战

处理这个数据集时你会遇到几个典型难题:

  1. 类别极度不平衡 :正常流量占比超过 80%,某些攻击类型样本不足 1%
  2. 高维特征空间 :78 个原始特征,部分特征相关性低但噪声大
  3. 流量时序特性 :传统机器学习方法难以捕捉连续数据包间的关联

数据处理流程

数据清洗

首先加载数据集并处理脏数据:

import pandas as pd

# 加载数据
data = pd.read_csv('CICIDS2017.csv')

# 处理缺失值
print(f'缺失值占比: {data.isnull().mean().max():.2%}')

data = data.dropna()  # 本例中直接删除缺失值

# 处理无穷大值
import numpy as np
data.replace([np.inf, -np.inf], np.nan, inplace=True)
data = data.dropna()

特征工程

选择判别力强的特征(示例选取 10 个关键特征):

selected_features = [
    'Flow Duration',
    'Total Fwd Packets',
    'Total Backward Packets',
    'Fwd Packet Length Mean',
    'Bwd Packet Length Mean',
    'Flow Bytes/s',
    'Flow Packets/s',
    'Flow IAT Mean',
    'Fwd IAT Total',
    'Bwd IAT Total'
]

X = data[selected_features]
y = data['Label']

数据标准化

网络流量特征的量纲差异极大,必须标准化:

from sklearn.preprocessing import RobustScaler  # 抗离群点

scaler = RobustScaler()
X_scaled = scaler.fit_transform(X)

模型构建

使用 PyTorch 实现带类别权重的 LSTM 模型:

import torch
import torch.nn as nn

class LSTMModel(nn.Module):
    def __init__(self, input_size, hidden_size, num_classes):
        super().__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
        self.fc = nn.Linear(hidden_size, num_classes)

    def forward(self, x):
        # x 形状: (batch_size, seq_len, input_size)
        lstm_out, _ = self.lstm(x)
        # 只取最后一个时间步
        out = self.fc(lstm_out[:, -1, :])
        return out

# 计算类别权重(解决不平衡问题)from sklearn.utils.class_weight import compute_class_weight

class_weights = compute_class_weight('balanced', classes=np.unique(y), y=y)
class_weights = torch.FloatTensor(class_weights)

# 初始化模型
model = LSTMModel(input_size=10, hidden_size=64, num_classes=len(np.unique(y)))

# 定义加权交叉熵损失
criterion = nn.CrossEntropyLoss(weight=class_weights)

评估与优化

评估指标

不要使用准确率!推荐组合指标:

from sklearn.metrics import classification_report

y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred, target_names=class_names))
  • F1-score:精确率和召回率的调和平均,特别适合不平衡数据
  • ROC-AUC:综合考量模型在不同阈值下的表现

优化方向

  1. 使用 SMOTE 等过采样技术处理少数类
  2. 尝试 Attention 机制增强时序建模
  3. 用 Optuna 进行超参数优化

避坑指南

  1. 错误:直接使用原始数据训练
  2. 现象:模型始终预测多数类
  3. 解决:必须进行类别平衡处理

  4. 错误:忽略特征相关性

  5. 现象:模型收敛但效果差
  6. 解决:先做特征选择(如互信息法)

  7. 错误:错误划分时序数据

  8. 现象:数据泄漏导致虚高指标
  9. 解决:按时间顺序划分训练 / 测试集

进阶建议

  1. 特征选择:尝试 mRMR(最大相关最小冗余)算法
  2. 模型集成:将 LSTM 与随机森林结合
  3. 在线学习:适应网络流量的动态变化

思考题

  1. 如何设计实验验证模型对未知攻击类型的检测能力?
  2. 当遇到加密流量时,哪些特征会失效?如何调整方案?
  3. 对比传统机器学习方法,深度学习的优势在哪些攻击类型上最明显?
正文完
 0
评论(没有评论)