利用决策树检测针对Apache的DDos攻击实验报告

利用决策树检测针对Apache的DDos攻击

一、实验内容

DDos攻击通常会使企业的互联网业务造成巨大的损失——业务中断几个小时甚至几天。我们使用KDD99的样本数据,尝试使用决策树算法识别针对Apache的DDos攻击,计算出攻击的识别率。

二、实验原理

决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。Entropy(信息熵)= 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。

1、信息增益

信息熵定义:
在这里插入图片描述
熵越大,随机变量的不确定性越大
当随机变量只取两个值,0,1时,X的分布为:
在这里插入图片描述
熵为
在这里插入图片描述
此时,熵H§随概率p变化的曲线如下图所示(单位比特)在这里插入图片描述
当p=0或p=1时,H§=0,随机变量完全没有不确定性,当p=0.5时,H§=1,随机变量的不确定性最大信息增益:g(D,A) = H(D) - H(D|A)

2、衡量数据不纯度指标

(1)gini系数:值越小,不纯度越低,数据越纯,即数据越倾向于一个类别
在这里插入图片描述
(2)Entropy(信息熵):值越小,不纯度越低,数据越纯,即数据越倾向于一个类别。公式:
在这里插入图片描述
信息熵越低,数据越纯。信息增益 = 分叉前不纯度-分叉后的不纯度

3、DecisionClassifier: def init()重要参数
  1. criterion=“gini”:划分属性的选择标准 gini(基尼系数) entropy(信息增益)
  2. splitter=“best”: 在节点中选择分类的策略。 best(最好的分类) random(最好的随机分类)
  3. max_depth=None: 树最大深度。
  4. min_samples_split=2: 区分一个内部节点需要的最少的样本数
  5. min_samples_leaf=1: 叶子结点所需要的最小样本数
  6. min_weight_fraction_leaf=0.:一个叶节点的输入样本所需要的最小的加权分数
  7. max_features=None:分类时需要考虑的特征数
  8. random_state=None: 随机数字发生器种子。(用来保证输出结果的唯一性)
  9. max_leaf_nodes=None: 在最优方法中使用max_leaf_nodes构建一个树.(通常跟max_depth配合使用)
  10. min_impurity_decrease=0.: 如果该分裂导致杂质的减少大于或等于该值,则将分裂节点
  11. min_impurity_split=None: 节点停止分裂的阙值
  12. class_weight=None:与标点中的类所关联的标签的权重
  13. presort=False: 是否预先分配数据以加快拟合中最佳分裂的发现(小型数据集适合设置为True)
三、实验环境

Windows、Python3.7、PyCharm、Sklearn库、Graphviz库

四、实验步骤
1、数据集搜集和数据清洗

和DDos相关的特征主要位:网络连接基本特征、基于时间的网络流量统计特征
加载KDD99数据集中的数据
def load_kdd99(filename):
x = []
with open(filename) as f:
for line in f:
line = line.strip(’\n’)
line = line.split(’,’)
x.append(line)
return x
筛选标记位apache2和normal且是http协议的数据
def get_apache2andNormal(x):
v = [] w = [] y = []
for x1 in x:
if (x1[41] in [‘apache2.’, ‘normal.’]) and (x1[2] == ‘http’):
if x1[41] == ‘apache2.’:
y.append(1)
else:
y.append(0)

2、特征化

挑选与DDos相关的特征作为样本特征
x1 = [x1[0]] + x1[4:8] + x1[22:30] + x1[31:40]
v.append(x1)
for x1 in v:
v1 = []
for x2 in x1:
v1.append(float(x2))
w.append(v1)
return w, y

3、训练样本

实例化DecisionTreeClassifier()算法
clf=tree.DecisionTreeClassifier()

4、效果验证

绘图:
dot_data = tree.export_graphviz(clf, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png(‘tree1.png’) # 生成png文件
采用十折交叉验证,测试结果准确率99%左右。
print(model_selection.cross_val_score(clf, x, y, n_jobs=-1, cv=10))

五、输入输出样例

输入:
41个特征
在这里插入图片描述
输出:在这里插入图片描述
V:数据集;x选取x1 = [x1[0]] + x1[4:8] + x1[22:30] + x1[31:40]后值
Y:是否为恶意指令
在这里插入图片描述
十折交叉验证准确率
在这里插入图片描述决策树

六、遇到的问题及解决办法
1、环境的配置

安装的依赖库比如pillow、matplotlib在python程序运行时找不到,其中一个原因可能是因为安装的库不在对应python目录下,电脑的多个python版本导致安装python3之后,库里面既会同时有两个版本,对应的区分是pip3、pip,有什么区别呢?
比如在终端里使用pip install XXX ,则新安装的库会放在目录 :python2.7/site-packages 使用pip3 install XXX ,则新安装的库会放在目录:python3.6/site-packages因此,在安装依赖库的包时应注意自己要使用的环境是哪个版本的python环境,正确的使用pip3或pip。

2、如何选出最佳节点和最佳分支?

每一步都选择最好的节点分支。
衡量标准-熵:熵是表示随机变量不确定性的度量,即事物的混乱程度。H(X)=- ∑ pi * logpi, i=1,2, … n熵值低,相对稳定。p=0或p=1时,H§=0,没有不确定性。p=0.5时,H§=1,不确定性最大。
ID3:信息增益。特征属性值多的信息增益大,不能处理特征属性值连续的情况C4.5:信息增益率,考虑自身熵。CART:使用了GINI系数作为衡量标准。
决策树剪枝策略决策树过拟合风险很大,理论上可以完全分得开数据。
剪枝策略:预剪枝:边建立决策树边进行剪枝的操作,实用控制树的深度。 样本数和节点数叶子节点个数,叶子节点样本数,信息增益量后剪枝:完成决策树后进行剪枝操作通过一定的衡量标准叶子节点越多,损失越大。

七、实验源码
决策树识别
# -*- coding:utf-8 -*-
# 实验
import re
import matplotlib.pyplot as plt
import os
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import model_selection
import os
from sklearn.naive_bayes import GaussianNB
from sklearn import tree
from sklearn import svm
from sklearn import neighbors
from sklearn import ensemble
from sklearn.tree import export_graphviz
from sklearn import tree
import pydotplus
import graphviz

def load_kdd99(filename):
    x = []
    with open(filename) as f:
        for line in f:
            line = line.strip('\n')#移除字符串头尾指定字符
            line = line.split(',')#默认以空格分隔
            x.append(line)#在列表末尾添加新的数据
    return x

def get_apache2andNormal(x):
    v = []
    w = []
    y = []
    for x1 in x:
        if (x1[41] in ['apache2.', 'normal.']) and (x1[2] == 'http'):
            if x1[41] == 'apache2.':
                y.append(1)
            else:
                y.append(0)

            x1 = [x1[0]] + x1[4:8] + x1[22:30] + x1[31:40]
            # x1 = x1[4:8]
            v.append(x1)
    for x1 in v:
        v1 = []
        for x2 in x1:
            v1.append(float(x2))
        w.append(v1)
    return w, y
if __name__ == '__main__':
    #v = load_kdd99("../data/kddcup99/corrected")
v = load_kdd99('C:/Users/yf/PycharmProjects/RBF/kddcup99/corrected')
    x, y = get_apache2andNormal(v)
    clf=tree.DecisionTreeClassifier(criterion="entropy")#决策树
    clf = clf.fit(x, y)
    dot_data = tree.export_graphviz(clf, out_file=None)
    graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png('tree1.png')  # 生成png文件

    print(model_selection.cross_val_score(clf, x, y, n_jobs=-1, cv=10)) #k-fold  clfclassifier分类器

对于使用C4.5决策树算法来检测DDoS攻击,你可以在Python中使用一些开源的机器学习库来实现。下面是一个简单的步骤和示例代码: 1. 收集数据集:首先,你需要收集用于训练和测试的DDoS攻击数据集。这些数据集应包含有关网络流量、连接信息和攻击类型的相关特征。 2. 数据预处理:对数据进行预处理以准备用于训练决策树模型。这可能包括去除缺失值、标准化数据等。 3. 特征选择:使用C4.5算法需要确定哪些特征对于区分DDoS攻击和正常网络流量是最有信息量的。你可以使用信息增益或其他相应的指标来选择特征。 4. 构建决策树模型:使用选定的特征和标签数据来训练C4.5决策树模型。 5. 检测DDoS攻击:使用训练好的决策树模型来预测新的网络流量是否属于DDoS攻击。将新的特征数据输入到决策树模型中,观察模型的预测结果。 下面是一个使用scikit-learn库中的DecisionTreeClassifier来实现C4.5决策树算法的示例代码: ```python from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 1. 假设你已经有一个包含特征和标签的数据集 # 2. 数据预处理和特征选择步骤省略 # 3. 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42) # 4. 构建决策树模型 clf = DecisionTreeClassifier(criterion='entropy') clf.fit(X_train, y_train)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

migrant-worker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值