news 2026/5/27 18:39:49

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 18:37:29

Atlas OS终极指南:5步打造轻量级高性能Windows系统

Atlas OS终极指南:5步打造轻量级高性能Windows系统 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and usability. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/…

作者头像 李华
网站建设 2026/5/27 18:36:03

YgoMaster完整指南:如何免费畅玩离线版游戏王大师决斗

YgoMaster完整指南:如何免费畅玩离线版游戏王大师决斗 【免费下载链接】YgoMaster Offline Yu-Gi-Oh! Master Duel 项目地址: https://gitcode.com/gh_mirrors/yg/YgoMaster 你是否渴望随时随地享受游戏王大师决斗的乐趣,却受限于网络连接或服务器…

作者头像 李华
网站建设 2026/5/27 18:34:12

AB下载管理器技术解析:高性能多线程下载解决方案与架构设计

AB下载管理器技术解析:高性能多线程下载解决方案与架构设计 【免费下载链接】ab-download-manager A Download Manager that speeds up your downloads 项目地址: https://gitcode.com/GitHub_Trending/ab/ab-download-manager AB下载管理器是一款基于Kotlin…

作者头像 李华
网站建设 2026/5/27 18:33:25

鸣潮终极自动化助手:解放双手的智能后台战斗完整方案

鸣潮终极自动化助手:解放双手的智能后台战斗完整方案 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves ok-ww鸣潮自动化工…

作者头像 李华
网站建设 2026/5/27 18:31:38

硅基流动DeepSeek V4-Pro限时2.5折解析(2026最新)

硅基流动DeepSeek V4-Pro限时2.5折解析(2026最新) SEO关键词:硅基流动、DeepSeek-V4-Pro、API价格、tokens计费、2.5折优惠、SiliconFlow、大模型API成本对比 最近在做大模型API接入时,看到硅基流动(SiliconFlow&…

作者头像 李华