《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

代码执行效果如下:


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值