当前位置: 首页 > 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.rkmt.cn/news/1406145.html

相关文章:

  • 如何快速构建你的智能网络收音机:YoRadio开源项目实战指南
  • 告别第三方软件:利用DDNS与端口映射打造专属远程桌面方案
  • w3x2lni:如何实现魔兽地图开发工作流的完整进化?
  • 基于NSGA-II的IRS辅助物联网多目标路径规划算法设计与实现
  • orange pi 驱动ws2812灯带
  • 2026年5月无线投屏软件实测榜,有哪些好用不收费的屏幕镜像软件
  • Awesome RSS Feeds高级技巧:with_category与without_category文件的区别与应用
  • 小米/红米手机可放心卸载的系统应用(设置里没有卸载按钮的)
  • Taotoken的API Key管理与审计日志功能如何保障企业调用安全
  • 深度解析:Arduino-ESP32如何重塑嵌入式开发体验
  • 如何在OpenClaw中集成Taotoken以驱动智能体工作流
  • 低成本Stewart平台球板系统:滑模控制与触摸屏传感实践
  • 别再瞎找了!2026年必备AI论文网站榜单,免费款也能高效产初稿
  • 如何在Windows上快速安装苹果设备驱动程序:1分钟解决iPhone连接问题
  • ESP32无线通信实战:如何构建智能物联网设备的无线交互系统?
  • AtlasOS:让Windows性能飙升45%的开源系统优化神器
  • 25个国家+34个分类!Awesome RSS Feeds让你一键获取全球优质内容
  • ChatGPT入职即遭封禁?——企业防火墙/代理/SSL解密策略冲突诊断图谱(含Wireshark抓包对照表)
  • 写论文如何又快又好?师兄推荐这几个AI论文软件
  • 编码照明优化:基于BTF与SDP的工业视觉检测光影计算
  • AI70年就绕不开150个概念?其实核心就这几类
  • 2026论文写作工具红黑榜:AI论文写作工具怎么选?一篇讲透:
  • 依赖注入与门面模式:从一坨代码到清晰架构的工程实践
  • 字节招聘超300个手机相关岗位,是做手机还是争夺AI终端控制权?
  • 数据指标是什么?终于有人把数据指标体系讲明白了
  • Linux字符设备驱动开发(三):引入并发控制——使用mutex保护共享数据
  • LibreCAD完全指南:5分钟掌握免费开源2D CAD绘图工具
  • YgoMaster完整指南:如何免费畅玩离线版游戏王大师决斗
  • 在Taotoken控制台创建与管理多个项目密钥的实操指南
  • AI视角下的CLAUDE.md编写指南:从规则清单到因果知识库