当前位置: 首页 > news >正文

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

1. CIC-IDS-2017数据集简介与下载

CIC-IDS-2017是加拿大网络安全研究所发布的一个经典网络入侵检测数据集,它模拟了真实企业网络环境中的正常流量和多种攻击行为。这个数据集最大的特点是包含了完整的网络流量包(PCAP格式)和已经提取好的特征文件(CSV格式),特别适合用来训练机器学习模型进行异常流量检测。

数据集采集于2017年7月3日到7月7日的工作日期间,每天模拟不同的网络场景:

  • 周一:仅包含正常流量
  • 周二:暴力破解(FTP/SSH)攻击
  • 周三:DoS攻击和端口扫描
  • 周四:Web攻击和渗透测试
  • 周五:DDoS攻击和僵尸网络活动

下载数据集时你会看到8个主要的CSV文件,每个对应不同时段的网络活动。我建议直接从加拿大网络安全研究所官网下载完整压缩包(约3GB),解压后会得到这些关键文件:

Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv Friday-WorkingHours-Afternoon-PortScan.pcap_ISCX.csv Friday-WorkingHours-Morning.pcap_ISCX.csv Monday-WorkingHours.pcap_ISCX.csv Thursday-WorkingHours-Afternoon-Infilteration.pcap_ISCX.csv Thursday-WorkingHours-Morning-WebAttacks.pcap_ISCX.csv Tuesday-WorkingHours.pcap_ISCX.csv Wednesday-workingHours.pcap_ISCX.csv

2. 数据预处理完整流程

2.1 初始数据检查与特征行处理

刚拿到原始CSV文件时,我习惯先用pandas快速浏览数据结构:

import pandas as pd file_path = "Friday-WorkingHours-Morning.pcap_ISCX.csv" raw_data = pd.read_csv(file_path) print(raw_data.head(3))

你会发现第一行其实是特征描述(比如"Flow Duration"、"Total Fwd Packets"等),而不是真正的数据。这会导致pandas把特征名误认为第一行数据。我的处理方法是:

# 跳过第一行读取,并手动添加列名 with open(file_path) as f: columns = f.readline().strip().split(',') data = pd.read_csv(file_path, skiprows=1, header=None, names=columns)

2.2 缺失值处理实战技巧

这个数据集常见的缺失值表现为NaN、Infinity或空字符串。我推荐组合使用以下方法:

# 替换无穷大值 import numpy as np data.replace([np.inf, -np.inf], np.nan, inplace=True) # 删除缺失值超过50%的列 threshold = len(data) * 0.5 data = data.dropna(thresh=threshold, axis=1) # 对剩余缺失值用中位数填充 numeric_cols = data.select_dtypes(include=np.number).columns for col in numeric_cols: data[col].fillna(data[col].median(), inplace=True)

特别注意:某些特征列(如"Flow Bytes/s")在除数为零时会产生无穷大值,这类列需要特殊处理。

2.3 标签编码的工程实践

原始数据中的攻击标签是文本形式(如"BENIGN"、"DDoS"等),需要转换为数值。我建议采用两种方案:

方案一:简单标签编码

from sklearn.preprocessing import LabelEncoder le = LabelEncoder() data['Label'] = le.fit_transform(data['Label'])

方案二:自定义优先级编码

label_priority = { 'BENIGN': 0, 'PortScan': 1, 'DDoS': 2, # 其他攻击类型... } data['Label'] = data['Label'].map(label_priority)

第二种方法特别适合需要区分攻击严重程度的场景。记得保存编码映射关系,后续预测时需要反向解码。

3. 特征工程关键步骤

3.1 特征选择与降维

原始数据集包含80多个特征,很多存在高度相关性。我通常先做相关性分析:

import seaborn as sns corr_matrix = data.corr().abs() plt.figure(figsize=(20,15)) sns.heatmap(corr_matrix, annot=False) plt.show()

然后使用方差阈值法过滤低方差特征:

from sklearn.feature_selection import VarianceThreshold selector = VarianceThreshold(threshold=0.1) selected_features = selector.fit_transform(data[numeric_cols])

3.2 特征归一化实战

不同特征的量纲差异极大(比如数据包数量可能是几千,而持续时间是毫秒级),必须进行归一化。我常用的三种方法:

Min-Max归一化(适合均匀分布):

from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() scaled_data = scaler.fit_transform(data[numeric_cols])

Z-Score标准化(适合存在异常值):

from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaled_data = scaler.fit_transform(data[numeric_cols])

Robust Scaling(对异常值更鲁棒):

from sklearn.preprocessing import RobustScaler scaler = RobustScaler() scaled_data = scaler.fit_transform(data[numeric_cols])

4. 数据集划分与保存

4.1 时间序列敏感的分割方法

由于网络攻击具有时间相关性,我建议按时间顺序划分数据集而非随机分割:

split_idx = int(len(data)*0.7) train = data.iloc[:split_idx] test = data.iloc[split_idx:]

4.2 高效存储预处理结果

处理好的数据集建议保存为多种格式:

# 保存为CSV train.to_csv('train_processed.csv', index=False) # 保存为HDF5(适合大数据集) train.to_hdf('train_processed.h5', key='data', mode='w') # 保存为Pickle(保留数据类型) import pickle with open('train_processed.pkl', 'wb') as f: pickle.dump(train, f)

5. 实际应用中的经验分享

在多个实际项目中处理这个数据集后,我总结出几个关键经验:

  1. 内存优化:对于大文件,可以使用chunksize参数分块读取

    chunk_iter = pd.read_csv(file_path, chunksize=50000) for chunk in chunk_iter: process(chunk)
  2. 并行处理:对于特征计算可以使用多核加速

    from joblib import Parallel, delayed results = Parallel(n_jobs=4)(delayed(compute_feature)(col) for col in data.columns)
  3. 验证集构建:建议从训练集中再划分20%作为验证集,用于调参

    from sklearn.model_selection import train_test_split X_train, X_val, y_train, y_val = train_test_split( train_features, train_labels, test_size=0.2, stratify=train_labels)
  4. 类别不平衡处理:攻击样本通常远少于正常流量,需要采用过采样/欠采样

    from imblearn.over_sampling import SMOTE smote = SMOTE() X_res, y_res = smote.fit_resample(X_train, y_train)
http://www.jsqmd.com/news/898308/

相关文章:

  • MATLAB与STK互联实战:向量几何工具在卫星姿态与轨道分析中的应用
  • 如何彻底解决微信QQ消息撤回问题:RevokeMsgPatcher终极实战指南
  • RDS-SLAM:解锁动态场景新思路,并行语义线程如何实现实时鲁棒SLAM
  • Unity 2D物理画线避坑指南:从LineRenderer到EdgeCollider2D,5分钟搞定可交互的涂鸦系统
  • 如何永久保存微信聊天记录?这个开源工具给你完整解决方案
  • 实时语音识别延迟优化:从RTF到端到端延迟的评估与实战
  • 终极视频下载解决方案:一键保存微信视频号、抖音、小红书等平台资源
  • 编码照明优化:基于BTF与SDP的工业视觉检测光影计算
  • gte-micro-openmind开发者指南:如何自定义训练和微调文本嵌入模型
  • 如何快速搭建AI研究助手:arXiv MCP Server完整配置指南
  • NFS挂载疑难解析:从“access denied by server”错误到安全端口配置实战
  • AWS Iot 策略规则问题
  • DSView开源仪器软件:将电脑变身为专业逻辑分析仪和示波器的终极指南
  • TMS320F280049C ADC 配置实战:从SOC触发到结果处理的完整流程解析
  • 企业内训场景下利用Taotoken分发可控的AI实验环境
  • 如何在macOS系统中安全地自定义鼠标光标样式?
  • 基于NSGA-II的IRS辅助物联网多目标路径规划算法设计与实现
  • AI代码治理实战:从文本规则到物理约束的工程化验证体系
  • 用数据说话!2026年不容错过的专业AI论文写作软件
  • 告别手动!Word公式一键批量转MathType的终极方案与OMML2MML疑难杂症攻克
  • 3步解放双手:鸣潮自动化工具如何让你每天节省2小时游戏时间
  • YgoMaster完整指南:如何免费畅玩离线版游戏王大师决斗
  • 深度解析AI视觉瞄准系统的3大核心技术突破
  • 别再瞎找了!2026年必备AI论文网站榜单,免费款也能高效产初稿
  • AzurLaneAutoScript:构建开源自动化框架的模块化设计与智能调度系统
  • LiteIDE完整指南:如何让Go开发效率提升300%?
  • 【限时开源】ChatGPT用户画像生成SaaS套件v1.0(含12个预训练细分场景模型):仅开放首批200个API密钥
  • 终极指南:如何一键下载国家中小学智慧教育平台所有电子课本
  • 如何快速配置黑苹果:智能EFI工具OpCore-Simplify的完整方案
  • 大疆无人机固件下载终极指南:如何用DankDroneDownloader重获固件控制权