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%以上,非常不错了!