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

您所在的位置:网站首页 考拉系统检测异常操作 K临近算法检测异常操作(一)

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

2024-07-08 03:31| 来源: 网络整理| 查看: 265

概述

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

数据来源

Schonlau在他的个人网站:http://www.schonlau.net/上发布了训练数据。 在这里插入图片描述 训练数据中包括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))


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3