CIC-IDS-2017 数据集包含良性和最新的常见攻击,类似真实世界数据(PCAPs)。
它的数据采集截至2017年7月7日(星期五)下午5时,共计5天。星期一是正常的一天,只包括正常的流量。实现的攻击包括暴力FTP、暴力SSH、DoS、Heartbleed、Web攻击、渗透、僵尸网络和DDoS。他们分别于周二、周三、周四和周五上午和下午被执行
CIC-IDS-2017 入侵检测数据集,包含以下8个CSV文件:可以用于机器学习的训练
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)
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()
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)
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)
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)
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)