首页 > 代码库 > 第四次任务计划书

第四次任务计划书

计划安排时间 计划完成内容 是否完成
 2017.3.25---2017.4.1 完成数据预处理,以及尝试使用伪代码描述算法  
 2017.4.2---2017.4.8 尝试进行代码实现,并进行小规模数据集作为输入,进行测试  
 2017.4.9---2017.4.15 完善具体代码,并着手进行毕业论文撰写  
 2017.4.16---2017.4.22 进行Python更加深入学习,利用一些扩展包,尝试对数据结果进行展示  
 2017.4.23---2017.4.29 撰写毕业论文,并且与老师共同修改   
 2017.4.30---2017.5.6 继续完善毕业设计,与老师沟通  
 2017.5.7---2017.5.12 毕业论文定稿,准备毕业答辩  

二、本周研究内容。

1、 数据预处理:

  步骤一:将离散值转化为连续值:对于非连续的属性,如:protocol_type(3种类型),service(70种类型),flag (11种类型),以及最后的label属性(23种类型)分为进行编号,将离散型转换化成连续型。

  步骤二:属性取值情况较少的属性删除 
  (1)land属性及land攻击的删除:所有的land属性取值为1的22条连接记录中有21条均属于land攻击,且land攻击和normal 之间,除land 属性之外的其他属性之间并无明显区别,因此可以忽略。(2)urgent 属性的删除:该属性值几乎全部为 0,只有 4 条记录取值不为 0。只要将这四条记录加以标记,便可以删除该属性。(3)su_attempted和 num_shells
属性的删除:属性值几乎全部为0,只有个别连接记录的值为1或2,将特殊值记录加以标识便可以删除该属性。

  步骤三:数据分块

  根据service(网络服务类型)数据分块可以看出,有42种服务类型基本上攻击类型为neptune,其他的攻击类型较样本来说影响较小。还有7种服务类型基本上也对应着是normal则同理其他的攻击类型可以忽略。这样一来,数据集就从66减少到17个。在剩下的服务类型中,cr_i网络服务类型占了一大半的数据量,但是通过数据集分块,该数据集中只有6 个决策类型,同时通过属性的二次删除,其特征属性的个数也只剩下13 个。而对于决策类型较多的三个数据集块 ftp、ftp_data 和 telnet 来说,其特征属性个数也相对较多,但是其连接记录条目一般并不多,最多也只有四千多条而已。

2、参考的部分朴素贝叶斯的代码:

from numpy import *

class NaiveBayesClassifier(object):
   
    def __init__(self):
        self.dataMat = list()
        self.labelMat = list()
        self.pLabel1 = 0
        self.p0Vec = list()
        self.p1Vec = list()

    def loadDataSet(self,filename):
        fr = open(filename)
        for line in fr.readlines():
            lineArr = line.strip().split()
            dataLine = list()
            for i in lineArr:
                dataLine.append(float(i))
            label = dataLine.pop() # pop the last column referring to  label
            self.dataMat.append(dataLine)
            self.labelMat.append(int(label))


    def train(self):
        dataNum = len(self.dataMat)
        featureNum = len(self.dataMat[0])
        self.pLabel1 = sum(self.labelMat)/float(dataNum)
        p0Num = zeros(featureNum)
        p1Num = zeros(featureNum)
        p0Denom = 1.0
        p1Denom = 1.0
        for i in range(dataNum):
            if self.labelMat[i] == 1:
                p1Num += self.dataMat[i]
                p1Denom += sum(self.dataMat[i])
            else:
                p0Num += self.dataMat[i]
                p0Denom += sum(self.dataMat[i])
        self.p0Vec = p0Num/p0Denom
        self.p1Vec = p1Num/p1Denom

    def classify(self, data):
        p1 = reduce(lambda x, y: x * y, data * self.p1Vec) * self.pLabel1
        p0 = reduce(lambda x, y: x * y, data * self.p0Vec) * (1.0 - self.pLabel1)
        if p1 > p0:
            return 1
        else:
            return 0

    def test(self):
        self.loadDataSet(‘testNB.txt‘)
        self.train()
        print(self.classify([1, 2]))

if __name__ == ‘__main__‘:
    NB =  NaiveBayesClassifier()
    NB.test()

 

三、你本周的体会及需要改进地方。

数据预处理方面还是存在着一些问题。算法暂时还没有和数据入口对接,算法的一些细节部分仍然需要完善,整体设计思路还是要重新整理,多参考一些硕士论文,Python部分也要多去学习,还有很多东西需要补充。

五、你本周参考的文献。

 1、KDDCUP99数据集的数据分析研究_吴建胜

2、http://www.cnblogs.com/Finley/p/5334987.html

第四次任务计划书