概述
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=[]
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(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:
f1=len(set(cmd_block))
fdist = FreqDist(cmd_block).keys()
f2=list(fdist)[0:10]
f3=list(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_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")
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_test)
print(y_predict)
print(score)
print(classification_report(y_test, y_predict))
print(metrics.confusion_matrix(y_test, y_predict))
|