XGBoost识别恶意程序

XGBoost,全称eXtreme Gradient Boosting。XGBoost本身是GBDT的一个高性能的开源库,是陈天奇等人于2014年开发,即可用于分类,也可用于回归。
我们从三个方面来学习XGBoost:
Tree Ensemble Model: 提升树模型
Object Function:XGBoost 目标函数及其求解
Optimization:寻找最佳分裂点
Tree Ensemble Model
首先,XGBoost与GBDT一样,也是boosting模型,对于boosting decision tree, 下面这张图片可以很好的表达出来:
在这里插入图片描述

在上图中可以看到,输入样本的最终预测值等于各个树的预测值之和.
给定n个样本,m个特征的数据集D={(Xi,yi)}(|D|=n,Xi∈ℝm,yi∈ℝ),提升树模型采用K次迭代的结果作为输出结果。对于Xi的输出为ŷ i,表达式为:
在这里插入图片描述

其中
在这里插入图片描述

,表示提升树结构空间集,各个变量的含义如下:

q表示树的结构,可以将样本映射到相应的叶子节点;
T表示提升树叶子节点的数量;
每个fk都对应独立的树结构q和权重w
Object Function
XGBoost的目标函数表达式与GBDT不一样,有着进一步的优化,如下:
在这里插入图片描述

上式看起来很简单,分两部分,第一部分为loss function,第二部分为regularization。各个变量的含义:yi为true label,ŷ i为predicted label,l为损失函数,fk则表示第k颗树的结构,Ω为正则项,表达式如下:
在这里插入图片描述

在XBGoost里面,正则项又包含两部分:一部分是提升树叶子节点的数量T,用于控制树的复杂度,可以达到剪枝的效果;另一部分为每颗树的叶子节点的权重w的平方和。正则项可以让学习器尽可能的避免over-fitting。 通过上面的目标函数,XGBoost的每颗子树就会倾向于学习比较简单的树,另外,当正则项参数为0时,目标表达式就会退化为传统的gradient tree boosting模型。
目标函数求解
对于上面的目标函数,如何求取最优解呢?对于损失函数部分,XGBoost采用了二阶泰勒展开式。对于XGBoost模型,对于第t次迭代,其表达式可扩展为:
在这里插入图片描述

我们对上面的式子通过泰勒展开式展开,可以得到如下表达式:
在这里插入图片描述

红色部分为泰勒展开式部分,其中
在这里插入图片描述

分别为损失函数的一阶和二阶梯度。在计算过程中,我们还可以忽略常数项
在这里插入图片描述

,因此,目标式子可以简化为:
在这里插入图片描述

根据上式可以看出,目标函数会同时依赖每个数据点的在损失函数上的一阶导数和二阶导数。此外,我们看到右侧还有个正则部分,可以将正则项公式代入进去,扩展公式可以进一步化解
在这里插入图片描述

第一行中的ft(Xi)等于wq(Xi),表示第t次迭代中(下标表示迭代次数),样本Xi落在第t个树结构ft中某个叶子节点的叶子权重值,代入后得到第二行,从第二行到第三行只是将各个样本的权重与一阶导和二阶导乘积之和,按照叶子节点进行分组,分组归并到各个叶子节点上的样本之和。最后化解得到第三行表达式,其为参数w的函数,为了求解它,我们可以通过求导并令导数等于0来求出w的极值点,然后将其回代到公式中,计算出目标表达式的值:
在这里插入图片描述

可以计算得到
在这里插入图片描述

将上式带入上面倒数第三个式子,可以推导出目标函数的表达式
在这里插入图片描述

表示的就是第t次迭代数的结构score,表示各个叶子节点上各个样本的一阶平方和与二阶加和之商的加和再加上树结构复杂度控制项。应用上式,只需要计算出每个叶子节点上各个样本的一阶梯度和二阶梯度的统计信息,就可以计算出整颗树的结构score,下图是XGBoost paper里面的图解:
在这里插入图片描述

对上式简化,就可以得到上图中的公式
在这里插入图片描述

那么对于决策树的单个节点,该如何进行划分呢?XGBoost与之前的GBDT、RF、ID3等树模型的计算方法都不一样,但是有一个共性就是计算分裂增益,通过比较分裂增益选择特征的切分点。分裂增益大小计算如下(T=1),分裂增益值为L−Lleft−Lright,推导步骤如下:
在这里插入图片描述

通过上式就可以计算出分裂的增益,然后确定分裂方式。关键是如何计算出最优分裂点呢?
寻找最佳分裂点
第一种是Exact Greedy Algorithm,一种贪心算法,列举出每个特征每个切分点的增益,然后将增益最大的切分点作为分裂点,这种方法固然会寻找到最优点,但是计算量特别大:

在这里插入图片描述

第二种是Approximate Algorithm,近似算法,首先根据特征的百分位数获取候选的划分点(采用的是Weighted Quantile Sketch),然后将连续特征映射到采用候选值划分之后的若干个bucket中,然后基于划分数据数据的切分点采用上面的方式计算出最大的增益点,可在一定程度上提升算法的性能
在这里插入图片描述

在XGBoost paper提到,采用的是样本的二阶梯度hi作为样本的权重
在这里插入图片描述

第三种是针对稀疏特征的分裂方式,XGBoost可以自动学习稀疏特征的分裂方向:
在这里插入图片描述

Sparsity Aware Split Finding算法会对比将特征值为missing的样本分配到左叶子结点和右叶子结点的两种情形,还可以为缺失值或者指定的值指定默认分裂方向,这种方式可以大大提升算法的效率。
这里归纳下XGBoost的模型特性:
目标表达式:XGBoost优化了GBDT的目标函数。一方面,在GBDT的基础上加入了正则项,包括叶子节点的个数和每个叶子节点输出的L2模的平方和,正则项可以控制树的复杂度,让模型倾向于学习简单的模型,防止过拟合;另外,XGBoost还支持线性分类器,传统的GBDT是以CART算法作为基学习器。
Shrinkage:对每棵树的预测结果采用了shrinkage,相当于学习率,降低模型对单颗树的依赖,提升模型的泛化能力。
列采样:XGBoost借助了RF的优点,采用了列采样,进一步防止过拟合,加速训练过程,而传统的GBDT则没有列采样。
优化方法:XGBoost对损失函数的展开采用了一阶梯度和二阶梯度,而传统的GBDT只采用了一阶梯度。
增益计算:对分裂依据进行了优化。不同于CART算法,XGBoost采用了新的基于一阶导数和二阶导数的统计信息作为树的结构score,采用分列前的结构与分裂后的结构score的增益作为分裂依据,选择增益最大的特征值作为分裂点,替代了回归树的误差平方和。
最佳增益节点查找:XGBoost在寻找最佳分离点的方式上采用了近似算法,基于权重的分位数划分方式(权重为二阶梯度hi):Weighted Quantile Sketch。主要是对特征取值进行分桶,然后基于桶的值计算增益。
预排序。在寻找最佳增益节点时,将所有数据放入内存进行计算,得到预排序结果,然后在计算分裂增益的时候直接调用。
稀疏值处理:XGBoost可以自动学习稀疏值的分裂方向,也可以指定默认方向,这种方式大大可以大大提升模型的性能。
并行方式:XGBoost的并行在于特征层面,在训练每颗树之前,对特征进行预排序,后续的并行迭代过程中重复使用这个排序结果,可以大大减少计算量,并提升模型性能。在查找最佳分裂点的时候,需要选择增益最大的特征取值作为分裂点,那么各个特征的增益计算就可以采用并行的方式进行计算,采用的是多线程方式计算各个特征的各个值得分裂增益。

接下来看看本次实验使用的数据集
本次实验使用的数据集来自Malware Instruction Set for Behaviour Analysis(MIST)
目前的样本包括
在这里插入图片描述

MIST通过分析大量的恶意程序,提取静态的文件特征以及动态的程序行为特征,特征获取的过程如下所示
在这里插入图片描述

MIST的特征提取主要使用CWSandBox,以分析kernel32.dll为例,它调用了load_dll,CWSandBox的表示如下图a所示,而MIST将其表示为图b所示的结构化字符串,然后保存至json文件中
在这里插入图片描述

MIST数据集把每个恶意程序的特征以json格式保存,常见的特征如下所示
‘file_access’: 138759,
‘sig_infostealer_ftp’: 13114,
‘sig_modifies_hostfile’: 5,
‘sig_removes_zoneid_ads’: 16,
‘sig_disables_uac’: 33,
‘sig_static_versioninfo_anomaly’: 0,
‘sig_stealth_webhistory’: 417,
‘reg_write’: 11942,
‘sig_network_cnc_http’: 132,
‘api_resolv’: 954690,
‘sig_stealth_network’: 71,
‘sig_antivm_generic_bios’: 6,
‘sig_polymorphic’: 705,
‘sig_antivm_generic_disk’: 7,
以crypto文件下的某个json文件为例,打开后如下所示
在这里插入图片描述

特征在properties中,上图可以看到file_access,往下滑动可以看到其他的
在这里插入图片描述

比如上图中的file_write,str等等。
关于数据集的介绍就到这里,接下来看看如何代码实现XGBoost识别恶意程序

从文件夹下加载文件,由于数据集中的恶意文件家族大体分为APT,Crypto,Locker,Zeus四类,所以以此进行过滤
在这里插入图片描述

对应加载的四类文件,分别给这四个文件夹下的文件打标签为0,1,2,3
在这里插入图片描述

加载数据后,从文本中提取特征。CountVectorizer是属于常见的特征数值计算类,是一个文本特征提取方法。对于每一个训练文本,它只考虑每种词汇在该训练文本中出现的频率。
CountVectorizer会将文本中的词语转换为词频矩阵.这里Ngram_range()指定词组切分的长度范围,Ngram_range()=(2,2)即表示使用2-gram;token_pattern指定过滤规则,表示token的正则表达式,这里的token_pattern=r’\b\w+\b’表示以单词为单位切分
接着通过fit_transform拟合模型,并返回文本矩阵
接着使用TF-IDF进一步处理,以提升分类性能,再fit_transform拟合模型,并返回文本矩阵
然后通过train_test_split将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集,这里的test_size=0.4表示测试集占比40%
在这里插入图片描述

接着使用XGboost算法进行训练,之后使用训练好的模型进行预测,并通过classification显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息
在这里插入图片描述

测试如下
在这里插入图片描述

这里介绍下出现的结果指标
accuracy指的是正确预测的样本数占总预测样本数的比值,它不考虑预测的样本是正例还是负例。而precision指的是正确预测的正样本数占所有预测为正样本的数量的比值,也就是说所有预测为正样本的样本中有多少是真正的正样本。可以看出precision只关注预测为正样本的部分,而accuracy考虑全部样本。
Recall可以称为召回率、查全率,指的是正确预测的正样本数占真实正样本总数的比值,也就是从这些样本中能够正确找出多少个正样本。
F1-score相当于precision和recall的调和平均,recall和precision任何一个数值减小,F1-score都会减小,反之亦然
来看对应的公式
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述

上式中的
FN:False Negative,被判定为负样本,但事实上是正样本。
FP:False Positive,被判定为正样本,但事实上是负样本。
TN:True Negative,被判定为负样本,事实上也是负样本。
TP:True Positive,被判定为正样本,事实上也是证样本。
举个例子,以下表的结果为例
在这里插入图片描述

可以知道tp=40,fp=20,fn=10,tn=30
所以通过上式可以计算得到
Precision: 40 / 40 + 20 = 0.67
Recall: 40 / 40 + 10 = 0.80
F1-Score: 2 * (0.67 * 0.8)/(0.67 + 0.8) = 0.73
Accuracy: 30 + 40 / 100 = 0.70
回过来,我们看看实验的结果,Accuracy是对检测结果一个均衡的评价,可以知道本次实验的准确度(Accuracy)达到了97%,是非常不错的了

参考:
1.https://blog.csdn.net/weixin_38278334/article/details/82320307
2.https://marcoramilli.com/2016/12/16/malware-training-sets-a-machine-learning-dataset-for-everyone/
3.https://www.youtube.com/watch?v=Vly8xGnNiWs&feature=youtu.be
4.https://www.csuldw.com/2019/07/20/2019-07-20-xgboost-theory/#mjx-eqn-7
5.《机器学习之web安全》
6.https://github.com/duoergun0729/1book/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值