5.4 示例:使用K近邻算法检测异常操作(二)

5.3示例中只比较了最频繁和最不频繁的操作命令,我们这次尝试进行全量比较。完整演示代码请见本书GitHub上的5-3.py。

1.数据搜集和数据清洗

我们使用词集的模型,将全部命令去重后形成一个大型向量空间,每个命令代表一个特征,首先通过遍历全部命令,生成对应的词集。


    with open(filename) as f:
    for line in f:
        line=line.strip('\n')
        dist.append(line)
fdist = FreqDist(dist).keys()

生成的词集为:


Dist:(['gs', 'tset', 'basename', 'uname', 'touch', 'find', 'ln', 'unpack', 'jar', 'tail', 'ls', 'lp', 'ld_', 'ksh', 'get', 'xdm', 'xterm', 'cpio', 'getpgrp', 'grep', 'gethost', 'mimencod', 'dbx', 'logname', 'as1', 'readacct', 'cfe', 'FIFO', 'fvwm', 'sed', 'ex', 'download', 'dirname', 'seecalls', 'sendmail', 'rm', 'wc', 'bc', 'netstat', 'nawk', 'post', 'xargs', 'rlogin', 'admin', 'od', 'xmodmap', '.java_wr', 'tcppost', 'col', 'ptelnet', 'postprin', 'tcpostio', 'javac', 'xsetroot', 'ugen', 'chmod', 'sccs', 'xrdb', 'diff', 'pr', 'ps', 'pq', 'java', 'dbxpcs', 'ppost', 'mkdir', 'MediaMai', 'hpost', 'rmdir', 'man', 'matlab', 'more', 'xhost', 'sim301bK', 'LOCK', 'telnet', 'sim301bS', 'delta', 'GoodStuf', 'true', 'netscape', 'stty', 'expr', 'tracerou', 'FvwmPage', 'cat', 'runnit', 'launchef', 'mailx', 'file', 'id', 'bdiff', 'egrep', 'generic', 'make', 'hostname', 'a.out', 'getopt', 'Xsession', 'driver', 'cpp', 'UNLOCK', 'awk', 'date', 'nslookup', 'sh', 'gzip'])

2.特征化

使用词集将操作命令向量化。


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

3.训练模型


user_cmd_list,dist=load_user_cmd_new("../data/MasqueradeDat/User3")
user_cmd_feature=get_user_cmd_feature_new(user_cmd_list,dist)
#print  user_cmd_feature
labels=get_label("../data/MasqueradeDat/label.txt",2)
y=[0]*50+labels
neigh = KNeighborsClassifier(n_neighbors=3)

4.效果验证

使用交叉验证,10次随机取样和验证,提高验证可信度。


cross_validation.cross_val_score(neigh, user_cmd_feature, y, n_jobs=-1,cv=10)

结果为:


[ 1.          1.          0.93333333  1.          1.          1.          1.
  1.          0.93333333  0.92857143]

准确率达到93%以上,非常不错了!