共计 2306 个字符,预计需要花费 6 分钟才能阅读完成。
CICIDS2017 数据集介绍
CICIDS2017 是加拿大网络安全研究所(CIC)发布的网络入侵检测基准数据集,包含正常和多种攻击类型(如 Brute Force、XSS、infiltration 等)的实时流量数据。数据集特点包括:

- 真实性 :基于真实网络环境采集,包含完整 PCAP 文件及 CSV 格式流量统计
- 多样性 :覆盖 7 种常见攻击类型,时间跨度 5 天
- 标注完善 :每个流量记录均有详细标签(BENIGN/ATTACK)
常见使用挑战
- 数据量大 :原始 PCAP 文件超过 50GB,CSV 特征文件约 3GB
- 特征维度高 :83 个原始特征包含混合类型(数值型、类别型)
- 样本不均衡 :攻击类型分布差异显著(如 Heartbleed 攻击仅 11 条记录)
数据处理完整流程
1. 数据预处理
PCAP 文件处理
建议使用 CIC 提供的预处理后 CSV(CICFlowMeter 生成),若需从头处理:
- 安装 tshark:
sudo apt install tshark - 提取流特征:
tshark -r Wednesday-WorkingHours.pcap -T fields -e frame.time [...] > output.csv
数据清洗关键步骤
import pandas as pd
# 加载数据(使用 dtype 优化内存)dtypes = {'Flow Bytes/s': 'float32', 'Flow Packets/s': 'float32'}
df = pd.read_csv('Wednesday-WorkingHours.csv', dtype=dtypes)
# 处理缺失值
print(df.isnull().sum()) # 检查各列缺失情况
df.dropna(subset=['Flow Bytes/s'], inplace=True)
# 处理无限值
import numpy as np
df.replace([np.inf, -np.inf], np.nan, inplace=True)
df.fillna(df.median(), inplace=True)
2. 特征工程
核心特征选取(基于论文《A Detailed Analysis of the CICIDS2017 Dataset》)
- 基础流量特征 :Flow Duration, Total Fwd/Bwd Packets
- 时序特征 :Flow Packets/s 的滑动窗口统计(均值 / 标准差)
- 协议特征 :TCP/UDP 标志位的组合特征
# 示例:创建交互特征
df['Packet_Size_Ratio'] = df['Total Length of Fwd Packets'] / df['Total Length of Bwd Packets']
df['Packet_Size_Ratio'].replace([np.inf, -np.inf], 0, inplace=True)
# 类别型编码(避免 One-Hot 内存爆炸)from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['Protocol'] = le.fit_transform(df['Protocol'])
3. 内存优化技巧
- 类型降级 :将 float64 转为 float32,int64 转为 int8
- 分块处理 :
pd.read_csv(chunksize=50000) - 稀疏矩阵 :对 One-Hot 特征使用
scipy.sparse
# 内存优化示例
def reduce_memory(df):
for col in df.select_dtypes(include=['float64']):
df[col] = pd.to_numeric(df[col], downcast='float')
return df
常见问题解决方案
特征泄露(Data Leakage)
- 错误做法 :在整个数据集上计算归一化参数
- 正确做法 :只在训练集计算,应用到验证 / 测试集
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train) # 仅用训练集
X_test = scaler.transform(X_test) # 应用相同参数
样本不均衡处理
- 过采样 :SMOTE(注意仅对训练集使用)
- 欠采样 :Tomek Links
- 损失函数加权 :
class_weight='balanced'
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X_train, y_train)
模型训练建议
- 基线模型 :先尝试 Random Forest(对特征缩放不敏感)
- 深度学习 :使用 TF/Keras 构建 LSTM 处理时序特征
- 评估指标 :不要只看 Accuracy,关注 Recall@K(K= 攻击类型)
# 随机森林示例
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=100,
class_weight='balanced',
n_jobs=-1
)
rf.fit(X_train, y_train)
思考题
如何处理实时网络流量数据的特征提取?考虑以下方向:
- 滑动窗口机制的设计(窗口大小 / 步长)
- 增量式特征统计(指数加权移动平均)
- 在线学习(Online Learning)架构
提示:参考论文《Flow-Based Network Traffic Generation Using Generative Adversarial Networks》中的流特征提取方法
正文完
发表至: 未分类
近一天内
