1.1.1 概念
K个最近的邻居,及每个样本都可以用它最接近的K个邻居代表。核心思想是如果样本附近的K个最相邻样本大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别样本的特性。(适合类域交叉或重叠较多的待分样本集)
1.1.2 算法步骤
step.1---初始化距离为最大值;
step.2---计算未知样本和每个训练样本的距离dist;
step.3---得到目前K个最临近样本中的最大距离maxdist;
step.4---如果dist小于maxdist,则将该训练样本作为K-最近邻样本;
step.5---重复步骤2、3、4,直到未知样本和所有训练样本的距离都算完;
step.6---统计K-最近邻样本中每个类标号出现的次数;
step.7---选择出现频率最大的类标号作为未知样本的类标号。
1.1.3 函数
>>> from sklearn.neighbors import NearestNeighbors
>>> NearestNeighbors(n_neighbors=n, algorithm=‘auto/ball_tree/kd_tree/brute’).fix(X)
1.1.4 实例
1.1.4.1 检测异常操作(一)
i、数据集:bash操作日志,依次读取每行操作命令,每100个命令组成一个操作序列,统计最频繁的前50个命令和最不频繁的前50个命令。
ii、特征化:以100个命令为统计单元,去重后的操作命令个数作为特征;用户前10个最频繁的命令(与i中前50个重合程度);用户前10个最不频繁的命令(与i中前50个重合程度)。
1.1.4.2 检测异常操作(二)
i、数据集:数据集不变,但不再统计最频繁和最不频繁的命令。
ii、特征化:将用户所有操作命令特征化,与总的命令词集对应,形成一个特征数组。
1.1.4.3 检测WebShell
i、数据集:ADFA-LD数据集,记录系统调用序列;
ii、特征化:将系统调用编号,则系统调用系列转换成序列向量。
1.2.1 概念
一棵从根节点不断做选择的树。
1.2.2 函数
>>>from sklearn import tree
>>>clf = tree.DecisionTreeClassifier()
1.3.1 概念
利用多棵决策树对样本进行训练,每棵树之间无关联,统计最后结果,少数服从多数。
1.3.2 函数
>>> from sklearn.ensemble import RandomForestClassifier
>>>clf=RandomForestClassifier(n_estimators=10, max_depth = None, min_samples_spilt = 2 )
n_estimators:森林中树的数量;
max_depth:树的最大深度;
min_samples_spilt:分割内部节点所需要的最小样本数量,就是子树继续划分的条件,如果少于设置的数字,则不根据最有特征划分进行划分。
1.4.1 概念
基于一个简单的假定:给定目标值时属性之间相互条件独立。
1.4.2 函数
>>> from sklearn.naive_bayes import GaussianNB
>>> gnb = GaussianNB()
1.4.3 实例
1.4.3.1检测Webshell(一)
i、数据集:WebShell文本作为黑样本,wordpress源码作为白样本。
ii、特征化:将一个PHP文件作为一个字符串处理,基于单词2-gram切割,遍历全部文件形成词汇表,再将样本数据特征化。
1.4.3.2 检测WebShell(二)
i、数据集:对黑样本集合以1-gram算法生成全局的词汇表(基于函数和字符串常量进行切割);
ii、特征化:将白样本特征化。
1.4.3.3 检测DGA域名
与检测WebShell(一)的手段一样。
1.5.1 概念
十分合适安全领域非黑即白的二分类问题,核心思想为线性可分(二维),若不可分则升维。一般升维会大大增加计算复杂度,但是这种算法基本不逊在这种问题。(具体原因是核函数的展开和计算理论,数学跟不上,不太明白。)
1.5.2 函数
>>> from sklearn import svm
>>> clf = svm.SVC(kernel = ‘linear’)
1.5.3 实例
1.5.3.1 识别XSS
i、数据集:数量相等的正常Web访问日志和XSS攻击的Web日志(来源:WVS仅扫描XSS相关漏洞即可获取)。
ii、特征化:url长度,url中包含第三方域名的个数(http、https),敏感字符的个数(<,>,’,”),敏感关键字的个数(alert,script=,onerror,onload,eval,src=)
1.5.3.2 区分僵尸网络DGA家族
i、数据集:1000个cryptolocker域名,1000个post-tovar-goz域名,alexa前1000域名。
ii、特征化:元音字母个数,去重后的字母数字个数与域名长度的比例,平均jarccard系数(两个集合交集与并集元素个数的比值)
1.6.1 概念
无监督算法,聚类算法。中心思想是以空间中k个点为中心进行聚类,通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
1.6.2 算法步骤
首先,从n个数据对象任意选择k个对象作为初始聚类中心;对于剩下的其他对象,则根据他们与这些聚类中心的相似度(距离),分别将他们分配给与其最相似的聚类。
然后,再计算每个所获新聚类的聚类中心(该聚类中所有对象的均值)。
不断重复这一过程直到标准测度函数开始收敛为止。
1.6.3 函数
>>> from sklearn.cluster import K-Means
>>> y_pred = KMeans(n_clusters = 3, random_state = random_state).fix_predict(X)
n_clusters:生成的聚类数;
random_state:用于初始化质心的生成器。
1.6.4 实例
1.6.4.1 检测DGA域名
与检测WebShell(一)的手段一样。
只列出了部分常见的机器学习算法,算法基本都差不多,没列出的算法更偏向于数据挖掘领域,用于比如广告推销之类。
这些算法难度不在于模型训练,这些实现方式瓶颈在于对数据的预处理上,需要手动编写函数去处理数据,将数据特征化。并且不同的处理方法可能会对结果准确度有很大的影响。训练速度慢的主要原因是对数据的处理还是在CPU上运行,后面的训练在GPU上运行,导致CPU限制了GPU,CPU负载满满而GPU却会闲着。