《多种机器学习视角下的入侵检测研究》论文复现Day01
机器学习在网络入侵检测领域可使用的数据非常有限。可用于机器学习具有 标签的数据集有两个分别为 DARPA/KDDCup99、UNB ISCX 2012。ISCX 2012 数据集是 2010 年收集用于代替 KDDCup99 的数据集,但是该数据集目前在 入侵检测方面的研究非常少,因此本文使用 KDDCup99 数据集作为实验数据。
KDDCup99数据集下载链接:KDD Cup 1999 Data (uci.edu)
本次下载的内容为:
- kddcup.data_10_percent.gz A 10% subset. (2.1M; 75M Uncompressed)
下载后得到
解压后得到
然后将符号型特征数值化
我使用的是VS Code,使用
1 #kdd99数据集预处理
2 #将kdd99符号型数据转化为数值型数据
3
4 #coding:utf-8
5
6 import numpy as np
7 import pandas as pd
8 import csv
9 import time
10 global label_list #label_list为全局变量
11
12 #定义kdd99数据预处理函数
13 def preHandel_data():
14 source_file='kddcup.data_10_percent_corrected'
15 handled_file='kddcup.data_10_percent_corrected.csv'
16 data_file=open(handled_file,'w',newline='') #python3.x中添加newline=''这一参数使写入的文件没有多余的空行
17 with open(source_file,'r') as data_source:
18 csv_reader=csv.reader(data_source)
19 csv_writer=csv.writer(data_file)
20 count=0 #记录数据的行数,初始化为0
21 for row in csv_reader:
22 temp_line=np.array(row) #将每行数据存入temp_line数组里
23 temp_line[1]=handleProtocol(row) #将源文件行中3种协议类型转换成数字标识
24 temp_line[2]=handleService(row) #将源文件行中70种网络服务类型转换成数字标识
25 temp_line[3]=handleFlag(row) #将源文件行中11种网络连接状态转换成数字标识
26 temp_line[41]=handleLabel(row) #将源文件行中23种攻击类型转换成数字标识
27 csv_writer.writerow(temp_line)
28 count+=1
29 #输出每行数据中所修改后的状态
30 print(count,'status:',temp_line[1],temp_line[2],temp_line[3],temp_line[41])
31 data_file.close()
32
33
34 #将相应的非数字类型转换为数字标识即符号型数据转化为数值型数据
35 def find_index(x,y):
36 return [i for i in range(len(y)) if y[i]==x]
37
38 #定义将源文件行中3种协议类型转换成数字标识的函数
39 def handleProtocol(input):
40 protocol_list=['tcp','udp','icmp']
41 if input[1] in protocol_list:
42 return find_index(input[1],protocol_list)[0]
43
44 #定义将源文件行中70种网络服务类型转换成数字标识的函数
45 def handleService(input):
46 service_list=['aol','auth','bgp','courier','csnet_ns','ctf','daytime','discard','domain','domain_u',
47 'echo','eco_i','ecr_i','efs','exec','finger','ftp','ftp_data','gopher','harvest','hostnames',
48 'http','http_2784','http_443','http_8001','imap4','IRC','iso_tsap','klogin','kshell','ldap',
49 'link','login','mtp','name','netbios_dgm','netbios_ns','netbios_ssn','netstat','nnsp','nntp',
50 'ntp_u','other','pm_dump','pop_2','pop_3','printer','private','red_i','remote_job','rje','shell',
51 'smtp','sql_net','ssh','sunrpc','supdup','systat','telnet','tftp_u','tim_i','time','urh_i','urp_i',
52 'uucp','uucp_path','vmnet','whois','X11','Z39_50']
53 if input[2] in service_list:
54 return find_index(input[2],service_list)[0]
55
56 #定义将源文件行中11种网络连接状态转换成数字标识的函数
57 def handleFlag(input):
58 flag_list=['OTH','REJ','RSTO','RSTOS0','RSTR','S0','S1','S2','S3','SF','SH']
59 if input[3] in flag_list:
60 return find_index(input[3],flag_list)[0]
61
62 #定义将源文件行中攻击类型转换成数字标识的函数(训练集中共出现了22个攻击类型,而剩下的17种只在测试集中出现)
63 def handleLabel(input):
64 #label_list=['normal.', 'buffer_overflow.', 'loadmodule.', 'perl.', 'neptune.', 'smurf.',
65 # 'guess_passwd.', 'pod.', 'teardrop.', 'portsweep.', 'ipsweep.', 'land.', 'ftp_write.',
66 # 'back.', 'imap.', 'satan.', 'phf.', 'nmap.', 'multihop.', 'warezmaster.', 'warezclient.',
67 # 'spy.', 'rootkit.']
68 global label_list #在函数内部使用全局变量并修改它
69 if input[41] in label_list:
70 return find_index(input[41],label_list)[0]
71 else:
72 label_list.append(input[41])
73 return find_index(input[41],label_list)[0]
74
75 if __name__=='__main__':
76 start_time=time.clock()
77 global label_list #声明一个全局变量的列表并初始化为空
78 label_list=[]
79 preHandel_data()
80 end_time=time.clock()
81 print("Running time:",(end_time-start_time)) #输出程序运行时间