在第5章中,我们使用KNN检测异常操作,准确率约80%,不是很理想;本章基于同样的数据集合,使用NB看看效果如何。完整演示代码请见本书GitHub上的7-1.py。
1.数据搜集和数据清洗
与第5章一致,不再赘述。
2.特征化
本次我们使用词集模型,统计全部操作命令,去重后形成字典或者说词汇表:
with open(filename) as f: for line in f: line=line.strip('\n') dist.append(line) fdist = FreqDist(dist).keys()
通过处理user3用户的全部命令操作,去重后得到的结果为:
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'])
以该词汇表作为向量空间,将每个命令序列转换成对应的向量:
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.训练模型
使用NB训练:
clf = GaussianNB().fit(x_train, y_train)
4.效果验证
验证效果:
y_predict=clf.predict(x_test) score=np.mean(y_test==y_predict)*100
准确率达到了92%,效果非常不错。