十二:朴素贝叶斯算法概述与其用于异常操作检测

Posted 司塔科信息安全

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十二:朴素贝叶斯算法概述与其用于异常操作检测相关的知识,希望对你有一定的参考价值。

一:朴素贝叶斯算法介绍

1朴素贝叶斯,之所以称为朴素,是因为其中引入了几个假设(不用担心,下文会提及)。而正因为这几个假设的引入,使得模型简单易理解,同时如果训练得当,往往能收获不错的分类效果,因此这个系列以naive bayes开头和大家见面。

因为朴素贝叶斯是贝叶斯决策理论的一部分,所以我们先快速了解一下贝叶斯决策理论。

假设有一个数据集,由两类组成(简化问题),对于每个样本的分类,我们都已经知晓。数据分布如下图(图取自MLiA):

 

现在出现一个新的点new_point (x,y),其分类未知。我们可以用p1(x,y)表示数据点(x,y)属于红色一类的概率,同时也可以用p2(x,y)表示数据点(x,y)属于蓝色一类的概率。那要把new_point归在红、蓝哪一类呢?

我们提出这样的规则:

如果p1(x,y) > p2(x,y),则(x,y)为红色一类。

如果p1(x,y) <p2(x,y),  (x,y)为蓝色一类。

换人类的语言来描述这一规则:选择概率高的一类作为新点的分类。这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策。

用条件概率的方式定义这一贝叶斯分类准则:

如果p(red|x,y) > p(blue|x,y), (x,y)属于红色一类。

如果p(red|x,y) < p(blue|x,y), (x,y)属于蓝色一类。

也就是说,在出现一个需要分类的新点时,我们只需要计算这个点的

max(p(c1 | x,y),p(c2 | x,y),p(c3 | x,y)...p(cn| x,y))。其对于的最大概率标签,就是这个新点的分类啦。

那么问题来了,对于分类如何求解p(ci| x,y)

没错,就是贝叶斯公式:

    十二:朴素贝叶斯算法概述与其用于异常操作检测

这里的X表示多个特征(词)x1,x2,x3...组成的特征向量。

利用贝叶斯公式,进行转换:

P(ad|X) = p(X|ad) p(ad) / p(X)

P(not-ad | X) = p(X|not-ad)p(not-ad) / p(X)

 

看到这儿,实际问题已经转为数学公式了。

看公式推导 

朴素贝叶斯分类的正式定义如下:

      1、设十二:朴素贝叶斯算法概述与其用于异常操作检测为一个待分类项,而每个ax的一个特征属性。

      2、有类别集合十二:朴素贝叶斯算法概述与其用于异常操作检测

      3、计算十二:朴素贝叶斯算法概述与其用于异常操作检测

      4、如果十二:朴素贝叶斯算法概述与其用于异常操作检测,则 十二:朴素贝叶斯算法概述与其用于异常操作检测

      那么现在的关键就是如何计算第3步中的各个条件概率。我们可以这么做:

      1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

      2、统计得到在各类别下各个特征属性的条件概率估计。即

      3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

              十二:朴素贝叶斯算法概述与其用于异常操作检测

      因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

              十二:朴素贝叶斯算法概述与其用于异常操作检测

 

  P(ad|X) = p(X|ad)p(ad) = p(x1, x2, x3, x4...xn | ad) p(ad)

假设所有词相互条件独立,则进一步拆分:

  P(ad|X) = p(x1|ad)p(x2|ad)p(x3|ad)...p(xn|ad) p(ad)

看公式p(ad|X)=p(x1|ad)p(x2|ad)p(x3|ad)...p(xn|ad) p(ad)



二:朴素贝叶斯算法例子之hello world

导入库以及数据集合,然后训练数据集,最后验证结果

十二:朴素贝叶斯算法概述与其用于异常操作检测



三:朴素贝叶斯算法例子之检测异常操作

我们使用KNN检测异常操作,准确率约80%,不是很理想;基于同样的数据集合,使用NB看看效果如何

1.数据搜集和数据清洗

http://www.schonlau.net/

2.特征化

本次我们使用词集模型,统计全部操作命令,去重后形成字典或者说词汇表:

十二:朴素贝叶斯算法概述与其用于异常操作检测

以该词汇表作为向量空间,将每个命令序列转换成对应的向量:

十二:朴素贝叶斯算法概述与其用于异常操作检测

3.训练模型

使用NB训练:


4.效果验证

验证效果:


完整代码为:

# -*- coding:utf-8 -*-

import sys

import urllib

import urlparse

import re

from hmmlearn import hmm

import numpy as np

from sklearn.externals import joblib

import htmlParser

import nltk

import csv

import matplotlib.pyplot as plt

from nltk.probability import FreqDist

from sklearn.feature_extraction.text import CountVectorizer

from sklearn.neighbors import KNeighborsClassifier

from sklearn.naive_bayes import GaussianNB

#测试样本数

N=90

def load_user_cmd_new(filename):

    cmd_list=[]

    dist=[]

    with open(filename) as f:

        i=0

        x=[]

        for line in f:

            line=line.strip('\n')

            x.append(line)

            dist.append(line)

            i+=1

            if i == 100:

                cmd_list.append(x)

                x=[]

                i=0

    fdist = FreqDist(dist).keys()

    return cmd_list,fdist

def load_user_cmd(filename):

    cmd_list=[]

    dist_max=[]

    dist_min=[]

    dist=[]

    with open(filename) as f:

        i=0

        x=[]

        for line in f:

            line=line.strip('\n')

            x.append(line)

            dist.append(line)

            i+=1

            if i == 100:

                cmd_list.append(x)

                x=[]

                i=0

    fdist = FreqDist(dist).keys()

    dist_max=set(fdist[0:50])

    dist_min = set(fdist[-50:])

    return cmd_list,dist_max,dist_min

def get_user_cmd_feature(user_cmd_list,dist_max,dist_min):

    user_cmd_feature=[]

    for cmd_block in user_cmd_list:

        f1=len(set(cmd_block))

        fdist = FreqDist(cmd_block).keys()

        f2=fdist[0:10]

        f3=fdist[-10:]

        f2 = len(set(f2) & set(dist_max))

        f3=len(set(f3)&set(dist_min))

        x=[f1,f2,f3]

        user_cmd_feature.append(x)

    return user_cmd_feature

def get_user_cmd_feature_new(user_cmd_list,dist):

    user_cmd_feature=[]

    for cmd_list in user_cmd_list:

        v=[0]*len(dist)

        for i in range(0,len(dist)):

            if dist[i] in cmd_list:

                v[i]+=1

        user_cmd_feature.append(v)

    return user_cmd_feature

def get_label(filename,index=0):

    x=[]

    with open(filename) as f:

        for line in f:

            line=line.strip('\n')

            x.append( int(line.split()[index]))

    return x

if __name__ == '__main__':

    user_cmd_list,dist=load_user_cmd_new("/Users/camel/Desktop/masquerade-data/User3")

    user_cmd_feature=get_user_cmd_feature_new(user_cmd_list,dist)

    labels=get_label("/Users/camel/Desktop/masquerade-data/label.txt",2)

    y=[0]*50+labels

    x_train=user_cmd_feature[0:N]

    y_train=y[0:N]

    x_test=user_cmd_feature[N:150]

    y_test=y[N:150]

    neigh = KNeighborsClassifier(n_neighbors=3)

    neigh.fit(x_train, y_train)

    y_predict_knn=neigh.predict(x_test)

    print y_train

    clf = GaussianNB().fit(x_train, y_train)

    y_predict_nb=clf.predict(x_test)

    score=np.mean(y_test==y_predict_knn)*100

    print "KNN %d" % score

    score=np.mean(y_test==y_predict_nb)*100

    print "NB %d" % score


以上是关于十二:朴素贝叶斯算法概述与其用于异常操作检测的主要内容,如果未能解决你的问题,请参考以下文章

机器学习算法--朴素贝叶斯

04-朴素贝叶斯

贝叶斯分类器(3)朴素贝叶斯分类器

机器学习朴素贝叶斯应用实例

机器学习朴素贝叶斯应用实例

朴素贝叶斯算法