K临近算法检测异常操作(一)

概述

K近邻(K-Nearest Neighbor,KNN)算法是机器学习领域使用最广 泛的算法之一,所谓KNN,就是K个最近的邻居的意思,说的是每个样 本都可以用它最接近的K个邻居来代表。KNN算法的核心思想是:如果 一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类 别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策时,只依据最邻近的一个或者 几个样本的类别来决定待分样本所属的类别。KNN方法在类别决策时, 只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样 本,而不是靠判别类域的方法来确定所属类别,因此对于类域交叉或重 叠较多的待分样本集来说,KNN方法较其他方法更为适合。

数据来源

Schonlau在他的个人网站:http://www.schonlau.net/上发布了训练数据。
K临近算法检测异常操作(一)_第1张图片
训练数据中包括50个用户的操作日志(见图5-4),每个日志包含 15000条操作命令,其中前5000条都是正常操作,后面的10000条日志中 随机包含有异常操作。为了便于分析,数据集每100条操作作为一个操 作序列,同时进行了标注,每个操作序列只要有1条操作异常就认为这个操作序列异常。
其中以用户名作为文件名,每个用户的操作都记录在对应的文件里 面。每个文件中,按照操作顺序依次记录了操作命令。

代码及注释

import numpy as np
from nltk.probability import FreqDist
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
from sklearn import metrics

#测试样本数
N=100

def load_user_cmd(filename):
    cmd_list=[]
    dist=[]
    dist_max=[]
    dist_min=[]
#依次读取每行操作命令,每100个命令组成一个操作序列,保存在列表里面:
    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
#统计最频繁使用的前50个命令和最不频繁的前50个命令:
    fdist = FreqDist(dist).keys()
    dist_max=set(list(fdist)[0:50])
    dist_min = set(list(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:
#去重操作命令的个数。
#以100个命令为统计单元,作为一个操作序列,去重后的操作命令个数作为特征。
        f1=len(set(cmd_block))
        fdist = FreqDist(cmd_block).keys()
#最频繁使用的前10个操作
        f2=list(fdist)[0:10]
#最不常使用的前10个操作
        f3=list(fdist)[-10:]
#统计的最频繁使用的前50个命令以及最不频繁使用的前50 个命令计算重合程度
        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
#标识文件的内容:每行50列,分别代表每个用户的当前操作序列, 正常操作标识为0,异常操作标识为1。
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,user_cmd_dist_max,user_cmd_dist_min=load_user_cmd("data/MasqueradeDat/User3")
#加载user3的操作数据,并将前120个操作序列作为训练序列,后30 个操作序列作为测试序列。  
 	user_cmd_feature=get_user_cmd_feature(user_cmd_list,user_cmd_dist_max,user_cmd_dist_min)
    
    labels=get_label("data/MasqueradeDat/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=neigh.predict(x_test)

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

    #print y
    #print y_train
    print(y_test)
    print(y_predict)
    print(score)

    print(classification_report(y_test, y_predict))

    print(metrics.confusion_matrix(y_test, y_predict))

你可能感兴趣的:(数据挖掘,python,机器学习)