1. 程式人生 > 其它 >KDD CUP99資料集預處理(Python實現)

KDD CUP99資料集預處理(Python實現)

目錄

KDD CUP99資料集預處理

1、資料集下載

2、KDD99網路入侵檢測資料集介紹

3、基於KDD99資料集的入侵檢測分析

4、符號型特徵數值化

5、KDD CUP99資料集預處理(Python實現)

KDD CUP99資料集預處理
1、資料集下載
KDD CUP99資料集

2、KDD99網路入侵檢測資料集介紹
介紹一

介紹二

3、基於KDD99資料集的入侵檢測分析
Weka進階——基於KDD99資料集的入侵檢測分析

4、符號型特徵數值化
採用one-hot方法進行數值化

5、KDD CUP99資料集預處理(Python實現)
(1)字元型特徵轉換為數值型特徵(即符號型特徵數值化)

Python3對KDD CUP99資料集預處理程式碼實現(僅實現字元型特徵轉為數值型特徵)

#kdd99資料集預處理
#將kdd99符號型資料轉化為數值型資料

#coding:utf-8

import numpy as np
import pandas as pd
import csv
import time
global label_list #label_list為全域性變數

#定義kdd99資料預處理函式
def preHandel_data():
source_file='kddcup.data_10_percent_corrected'
handled_file='kddcup.data_10_percent_corrected.csv'
data_file=open(handled_file,'w',newline='') #python3.x中新增newline=''這一引數使寫入的檔案沒有多餘的空行
with open(source_file,'r') as data_source:
csv_reader=csv.reader(data_source)
csv_writer=csv.writer(data_file)
count=0 #記錄資料的行數,初始化為0
for row in csv_reader:
temp_line=np.array(row) #將每行資料存入temp_line數組裡
temp_line[1]=handleProtocol(row) #將原始檔行中3種協議型別轉換成數字標識
temp_line[2]=handleService(row) #將原始檔行中70種網路服務型別轉換成數字標識
temp_line[3]=handleFlag(row) #將原始檔行中11種網路連線狀態轉換成數字標識
temp_line[41]=handleLabel(row) #將原始檔行中23種攻擊型別轉換成數字標識
csv_writer.writerow(temp_line)
count+=1
#輸出每行資料中所修改後的狀態
print(count,'status:',temp_line[1],temp_line[2],temp_line[3],temp_line[41])
data_file.close()


#將相應的非數字型別轉換為數字標識即符號型資料轉化為數值型資料
def find_index(x,y):
return [i for i in range(len(y)) if y[i]==x]

#定義將原始檔行中3種協議型別轉換成數字標識的函式
def handleProtocol(input):
protocol_list=['tcp','udp','icmp']
if input[1] in protocol_list:
return find_index(input[1],protocol_list)[0]

#定義將原始檔行中70種網路服務型別轉換成數字標識的函式
def handleService(input):
service_list=['aol','auth','bgp','courier','csnet_ns','ctf','daytime','discard','domain','domain_u',
'echo','eco_i','ecr_i','efs','exec','finger','ftp','ftp_data','gopher','harvest','hostnames',
'http','http_2784','http_443','http_8001','imap4','IRC','iso_tsap','klogin','kshell','ldap',
'link','login','mtp','name','netbios_dgm','netbios_ns','netbios_ssn','netstat','nnsp','nntp',
'ntp_u','other','pm_dump','pop_2','pop_3','printer','private','red_i','remote_job','rje','shell',
'smtp','sql_net','ssh','sunrpc','supdup','systat','telnet','tftp_u','tim_i','time','urh_i','urp_i',
'uucp','uucp_path','vmnet','whois','X11','Z39_50']
if input[2] in service_list:
return find_index(input[2],service_list)[0]

#定義將原始檔行中11種網路連線狀態轉換成數字標識的函式
def handleFlag(input):
flag_list=['OTH','REJ','RSTO','RSTOS0','RSTR','S0','S1','S2','S3','SF','SH']
if input[3] in flag_list:
return find_index(input[3],flag_list)[0]

#定義將原始檔行中攻擊型別轉換成數字標識的函式(訓練集中共出現了22個攻擊型別,而剩下的17種只在測試集中出現)
def handleLabel(input):
#label_list=['normal.', 'buffer_overflow.', 'loadmodule.', 'perl.', 'neptune.', 'smurf.',
# 'guess_passwd.', 'pod.', 'teardrop.', 'portsweep.', 'ipsweep.', 'land.', 'ftp_write.',
# 'back.', 'imap.', 'satan.', 'phf.', 'nmap.', 'multihop.', 'warezmaster.', 'warezclient.',
# 'spy.', 'rootkit.']
global label_list #在函式內部使用全域性變數並修改它
if input[41] in label_list:
return find_index(input[41],label_list)[0]
else:
label_list.append(input[41])
return find_index(input[41],label_list)[0]

if __name__=='__main__':
start_time=time.clock()
global label_list #宣告一個全域性變數的列表並初始化為空
label_list=[]
preHandel_data()
end_time=time.clock()
print("Running time:",(end_time-start_time)) #輸出程式執行時間
該程式碼僅對10%的訓練集(kddcup.data_10_percent_corrected)進行處理

(2)數值標準化

設 X’ij為Xij數值標準化後的值

(3)數值歸一化

交流學習資料共享歡迎入QQ群:955817470
————————————————
版權宣告:本文為CSDN博主「Asia-Lee」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/asialee_bird/article/details/80491256