网络流量入侵检测数据集CIC-IDS-2017数据预处理

CIC-IDS-2017 数据集包含良性和最新的常见攻击,类似真实世界数据(PCAPs)。

它的数据采集截至2017年7月7日(星期五)下午5时,共计5天。星期一是正常的一天,只包括正常的流量。实现的攻击包括暴力FTP、暴力SSH、DoS、Heartbleed、Web攻击、渗透、僵尸网络和DDoS。他们分别于周二、周三、周四和周五上午和下午被执行

下载数据集

CIC-IDS-2017 入侵检测数据集,包含以下8个CSV文件:可以用于机器学习的训练

  1. Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv
  2. Friday-WorkingHours-Afternoon-PortScan.pcap_ISCX.csv
  3. Friday-WorkingHours-Morning.pcap_ISCX.csv
  4. Monday-WorkingHours.pcap_ISCX.csv
  5. Thursday-WorkingHours-Afternoon-Infilteration.pcap_ISCX.csv
  6. Thursday-WorkingHours-Morning-WebAttacks.pcap_ISCX
  7. Tuesday-WorkingHours.pcap_ISC
  8. Wednesday-workingHours.pcap_ISCX

1.去掉特征行

import pandas as pd
file_path=r"E:\CIC-IDS-2017\Friday-WorkingHours-Morning.pcap_ISCX.csv"
data=pd.read_csv(file_path,header=None)
print(data)
data2 = data.drop([0],axis=0)
print(data2)
data2.to_csv('E:\CIC-IDS-2017\Friday1-WorkingHours-Morning.pcap_ISCX.csv', sep=',',header=False,index=False)

2.文本转化为数值


import numpy as np
import pandas as pd
import csv
global label_list  # label_list为全局变量
#在编写程序的时候,如果想为一个在函数外的变量重新赋值,并且这个变量会作用于许多函数中时,就需要告诉python这个变量的作用域是全局变量。此时用global语句就可以变成这个任务,也就是说没有用global语句的情况下,是不能修改全局变量的。
# 定义数据预处理函数
def preHandel_data():
    source_file = 'E:\CIC-IDS-2017\Friday1-WorkingHours-Morning.pcap_ISCX.csv'  # 源文件
    handled_file ='E:\CIC-IDS-2017\Friday2-WorkingHours-Morning.pcap_ISCX.csv'  # 处理后的文件
    data_file = open(handled_file, 'w', newline='')  # python中添加newline=''这一参数使写入的文件没有多余的空行
    # W 打开一个文件只用于写入。。如果该文件不存在,创建新文件。
    # r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    with open(source_file, 'r') as data_source:  # 只读方式打开源文件
        csv_reader = csv.reader(data_source)  # 读取源文件
        # 返回一个reader对象,该对象将遍历csv文件中的行。从csv文件中读取的每一行都作为字符串列表返回。
        csv_writer = csv.writer(data_file)  # 写入文件
        count = 0  # 记录数据的行数,初始化为0
        for row in csv_reader:  # 读取csv中每一行为一个list
            temp_line = np.array(row)  # 将每行数据存入temp_line数组里
            # temp_line[1] = handleProtocol(row)  # 数组的第一列为handprotocal函数处理后的值
            # temp_line[2] = handleService(row)
            # temp_line[3] = handleFlag(row)
            temp_line[78] = handleLabel(row)
            csv_writer.writerow(temp_line)  # 将转换后的文件存入csv_write中
            count += 1
            # 输出每行数据中所修改后的状态
            # print(count, 'status:', temp_line[1], temp_line[2], temp_line[3], temp_line[78])
            print(count, 'status:', temp_line[78])
        data_file.close()  # 关闭处理后的文件
def find_index(x, y): #x表示数组元素,y表示数组元素的索引
    return [i for i in range(len(y)) if y[i] == x] #从0行开始遍历到结束行,如果这一列里面有对对应的字符串,返回对应的数字表示
# 定义将源文件行中攻击类型转换成数字标识的函数(训练集中共出现了22个攻击类型,而剩下的17种只在测试集中出现)
def handleLabel(input):
    global label_list  # 在函数内部使用全局变量并修改它
    if input[78] in label_list:
        return find_index(input[78], label_list)[0]
    else:
        label_list.append(input[78])
        return find_index(input[78], label_list)[0]
if __name__ == '__main__':
    global label_list  # 声明一个全局变量的列表并初始化为空
    label_list = []
    preHandel_data()

3.删除里面的缺失值所在行

import numpy as np
import pandas as pd
#读取数据,将空值形式的缺失值转换为可识别的类型
from numpy import NaN
data = pd.read_csv('E:\CIC-IDS-2017\Friday2-WorkingHours-Morning.pcap_ISCX.csv',encoding='GBK')
print(np.isnan(data).any())
data1=data.dropna(axis = 0)
print(data1)
data1.to_csv('E:\CIC-IDS-2017\Friday3-WorkingHours-Morning.pcap_ISCX.csv', sep=',',header=False,index=False)

4.删除标签列,得到训练所用特征集

import pandas as pd
file_path=r"E:\CIC-IDS-2017\Friday3-WorkingHours-Morning.pcap_ISCX.csv"
data=pd.read_csv(file_path,header=None)
print(data)
data2 = data.drop([78],axis=1)
print(data2)
data2.to_csv('E:\CIC-IDS-2017\Friday4-WorkingHours-Morning.pcap_ISCX.csv', sep=',',header=False,index=False)

5.对特征数据进行归一化


import numpy as np
import csv
data=np.loadtxt(open("E:\CIC-IDS-2017\Friday4-WorkingHours-Morning.pcap_ISCX.csv","rb"),delimiter=",",skiprows=0)
mmax =np.max(data, axis=0)
mmin =np.min(data, axis=0)
for i in range(len(mmax)):
    if mmax[i] == mmin[i]:
        mmax[i] += 0.000001 #avoid getting devided by 0
    data1= (data- mmin) / (mmax - mmin)  # 最小最大规范化
print(data1)
with open("E:\CIC-IDS-2017\Friday5-WorkingHours-Morning.pcap_ISCX.csv", "w+", newline='') as csvfile:
    writer =csv.writer(csvfile)
    # 写入多行用writerows
    writer.writerows(data1)

6.对标签列进行独热编码

from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder
df=pd.read_csv('E:\CIC-IDS-2017\Friday3-WorkingHours-Morning.pcap_ISCX.csv',header=None,index_col=None)
col=df.iloc[:,78] #所有行,第79列
arrs=col.values  #返回由这一列构成的表
#输出结果
print(arrs)
data=np.array(arrs)
values = array(data)
print(values)
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print(integer_encoded)
data3 = pd.DataFrame(integer_encoded) # header:原第一行的索引,index:原第一列的索引
data3.to_csv("E:\CIC-IDS-2017\Friday6-WorkingHours-Morning.pcap_ISCX.csv",header=None,index=0)
# # binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded)
data4 = pd.DataFrame(onehot_encoded) # header:原第一行的索引,index:原第一列的索引
data4.to_csv("E:\CIC-IDS-2017\Friday7-WorkingHours-Morning.pcap_ISCX.csv",header=None,index=0)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐