7.3 示例:检测异常操作

在第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%,效果非常不错。