我是靠谱客的博主 兴奋羽毛,最近开发中收集的这篇文章主要介绍《web安全之机器学习入门》第6章决策树与随机森林算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

决策树识别pop3端口扫描(原书中识别暴力破解,实际上pop3协议的并没有guess_passwd类型的数据,所以改为识别port_sweep.):

待分析数据集:
KDD-99数据集,链接:http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html
该数据集是从一个模拟的美国空军局域网上采集来的9个星期的网络连接数据,分成具有标识的训练数据和未加标识的测试数据。
数据集已经进行了数据采集、清洗、提取特征、打标签等动作。每一行包括41个特征和1个标签,总共42列。
一个网络连接定义为在某个时间内从开始到结束的TCP数据包序列,并且在这段时间内,数据在预定义的协议下(如TCP、UDP)从源IP地址到目的IP地址的传递。每个网络连接被标记为正常(normal)或异常(attack),异常类型被细分为4大类共39种攻击类型,其中22种攻击类型出现在训练集中,另有17种未知攻击类型出现在测试集中。

从数据集中过滤出协议为pop3的(第2列),以及标签为normal.负类、port_sweep.正类的数据(第41列)

选取的特征:
列0:duration:连续类型:连接持续时间
列4:src_bytes:连续类型:从源主机到目标主机的字节数
列5:dst_bytes:连续类型:从目标主机到源主机的字节数
列6:land:离散类型:若连接来自/送达同一个主机/端口,则为1,否则为0[1 if connection from/to the same host/port;0 otheriwise]
列7:wrong_fragment:连续类型:错误分段数量
列22:count:连续类型:过去2s内,与当前连接具有相同目标ip的连接数目
列23:srv_count:连续类型:过去2s内,与当前连接具有相同服务的连接数目
列24:serror_rate:连续类型:过去2s内,与当前连接具有相同目标IP的连接中,出现"SYN"错误的连接的百分比
列25:srv_serror_rate:连续类型:过去2s内,与当前连接具有相同服务的连接中,出现"SYN"错误的连接的百分比
列26:rerror_rate:连续类型:过去2s内,与当前连接具有相同目标IP的连接中,出现"REJ"错误的连接的百分比
列27:srv_rerror_rate:连续类型:过去2s内,与当前连接具有相同服务的连接中,出现"REJ"错误的连接的百分比
列28:same_srv_rate:连续类型:在过去2s内,与当前连接具有相同目标主机的连接中,与当前连接具有相同服务的连接的百分比

列29:diff_srv_rate:连续类型:在过去2s内,与当前连接具有相同目标主机的连接中,与当前连接具有不同服务的连接的百分比


决策树算法的代码如下:

#coding:utf-8
import os
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
DATAPATH = os.path.dirname(os.path.abspath(__file__)) + "/data"
def parse_data():
FULLPATH = DATAPATH + "/kddcup.data.corrected"
test_data = list()
label_data = list()
with open(FULLPATH, "r") as f:
for line in f.readlines():
lines = line.strip().split(",")
label = 0
if lines[2] == 'pop_3' and (lines[-1] == 'normal.' or lines[-1] == 'portsweep.'):
if lines[-1] == 'portsweep.':
label = 1
test_data.append([lines[0]] + lines[4:8] + lines[22:30])
label_data.append(label)
return [test_data,label_data]
if __name__ == '__main__':
test_data, label_data = parse_data()
tree = DecisionTreeClassifier()
score = cross_val_score(tree, test_data, label_data, cv=10)
print score
print "precision:",np.mean(score)*100

代码执行效果如下:



随机森林的代码如下:

#coding:utf-8
import os
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
DATAPATH = os.path.dirname(os.path.abspath(__file__)) + "/data"
def parse_data():
FULLPATH = DATAPATH + "/kddcup.data.corrected"
test_data = list()
label_data = list()
with open(FULLPATH, "r") as f:
for line in f.readlines():
lines = line.strip().split(",")
label = 0
if lines[2] == 'pop_3' and (lines[-1] == 'normal.' or lines[-1] == 'portsweep.'):
if lines[-1] == 'portsweep.':
label = 1
test_data.append([lines[0]] + lines[4:8] + lines[22:30])
label_data.append(label)
return [test_data,label_data]
if __name__ == '__main__':
test_data, label_data = parse_data()
forest = RandomForestClassifier(n_estimators = 10)
score = cross_val_score(forest, test_data, label_data, cv=10)
print score
print "precision:",np.mean(score)*100

代码执行效果如下:


最后

以上就是兴奋羽毛为你收集整理的《web安全之机器学习入门》第6章决策树与随机森林算法的全部内容,希望文章能够帮你解决《web安全之机器学习入门》第6章决策树与随机森林算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部