前言
接着前面三篇学习笔记《约会对象魅力程度分类》、《使用sklearn中的KNN算法》和《KNN手写识别系统》,本节记录使用K近邻算法检测异常操作,主要参考《Web安全之机器学习》 。
转载请注明出处:http://blog.csdn.net/rosetta
使用K近邻算法检测异常操作之一
实验数据及情况
实验数据在Schonlau个人网站中:http://www.schonlau.net/
训练数据包含50个用户的操作日志(网站上对应红框处“Masquerade Data(zip File)”)和一个标签文件label.txt(网站上对应的红框处“WIndows ascii file”)
在本机解压后是这样子的:
实验数据一共收集了50个用户的操作命令(在理解代码时,只先考虑1个用户的即可),每个用户命令为15000条,前5000条是正常数据(这里隐含的一层意思是,我不需要特意指定标签了,你在代码中把我们全设置成0就可以了(本次实验就0表示正常操作;1表示异常操作)),后10000条随机包含了异常操作。
为了方便操作,会把数据集的每100个命令作为一个操作序列,所以15000条数据实际上看作150条,而前50条都是正常的,那么只有后面的100条需要标记,所以lable.txt中只有100条,而不是150条。在代码中使用KNN算法时,会把训练数据的label的前50条自动补上0,后100条从lable.txt中读取,这样就组合出了代码中实际的lable是150条的,和数据的条目能对应上了。
注意下本次实验样本数据的标签放在label.txt中,要以列方向去看,比如User1样本的标签对应第0列(因为加载到python list中是以0开始算的),User3就是第2列了。
另外在训练数据的时候,怎么把每组的100条数据清洗成易理解的数据?本实验是这么做的(针对1个用户来说):先统计15000条数据中最频繁使用的50个命令(后续称全局TOP50)和最不频繁使用的50个命令(后续称LOW50),然后统计每个100条数据中不重复命令的个数,及最频繁使用的前10个命令和是不频繁使用的10个命令,拿前10和后10分别和TOP50 LOW50取交集,生成一条数据的特征list:[无重复命令个数,和TOP50交集个数,和LOW50交集个数],生成这样的特征一共150条。
代码中的特征变量由user_cmd_feature list表示。