近年来,越来越多的安全厂家把机器学习或人工智能纳入到产品里,但是实际真正购买或者试用后,往往效果并没有厂商宣称的那么好用,常 常出现大量误报,漏报的情况。如何去评估或者测试这些产品或者机器学习模型是否能够满足上线的需求以及对现有的防控体系有多少提升,往往是进行采购或者上线时需要对业务部门说明的基础信息。本文讨论的是如何去评估以及量化一个机器学习模型的过程,为了方便描述,本文虚构了一个采购智能识别恶意流量的软件的故事,注意的是采购这类软件需要考虑的因数非常的多,但是本文只关注有效性以及对其做出评估。
本文作者:wstart
本文属于安全脉搏专栏作者原创奖励计划,未经授权请勿擅自转载。
小明在一家证卷公司负责安全工作,公司使用的框架是struct2。由于struct2的RCE漏洞大量被暴,导致了小明的部门常常需要加班进行应急,在开发部门还是无法快速进行迁移到新框架前,部门的领导只好提高了WAF拦截的力度,同时安排小明看看有没有比较好用的可以直接鉴别异常流量的软件来进行辅助拦截应急。
机器学习基本围绕两大核心问题进行,回归和分类。而在安全领域,
大部分是属于分类问题:
是不是异常流量
属于哪一种攻击类型
是不是异常文件
...
当然也有回归,比如是不是符合用户使用的时间曲线之类判定。不同的模型有不一样的估计方法。但是使用什么方法去评估之前,我们得确定我们的问题是属于分类问题还是回归问题,如果是分类问题是多分类问题还是二分类的问题。小明需要采购的是可以识别正常流量和异常流量的软件。所以很明显是属于分类问题。如果只是识别正常和异常两种类型流量,那么是一个二分类的问题
注1:为了方便,后续的异常流量和正常流量分为成为正样本和负样本
注2:为啥称异常流量为正样本,因为触发了模型的规则,是我们需要拦截的,是需要敏感关注的,而正常流量是我们不关心的,所以是负样本
小明在和第三方厂商进行沟通时得到了测试软件,可以进行搭建线下的测试环境,但是在准备数据的时候,却犯了愁,正常的流量的数据找,随便上线上服务器抓包就有,但是异常数据却不知道如何获取。突然想起前一阵刚做完众测,应该有不少白帽子留下的异常流量。于是两者结合,构造测试数据。
由于打算正式部署在证卷交易的主站,涉及的接口主要是涉及用户数据以及交易接口等,所以在构造前,小明特意随机抽取主站的几个重要数据进行勘查,人工识别出来的异常流量大概占总流量的0.5%左右,基于此构造数据集:
1.每个时间段在正常的流量数据中采样,构建出9950条正常数据集。
2.在众测的异常流量数据中抽取数据,50一组,打散在正常数据集里面,共构建10小组数据。
3.在异常流量中抽取5000个异常数据,与正常的数据5000个构成
一组数据
4.最后再异常流量中抽取9500个异常数据,和50个正常数据再构
建成一组数据
最后构建出共三组数据集
- 10小组,每组总数为1W带有0.5%异常流量的数据
- 异常数据和正常数据均占50%的数据
- 异常数据偏多的,而正常流量只占0.5%的数据
我们在确定问题类型后,在对模型或者软件测试时,我们还需要确定模型或者软件的部署的范围,基于此来构建测试数据集。
一般来说数据分布对模型来说,会有比较大的影响。测试的数据集一般围绕这五种类型构建
常规数据集(基于真实的业务数据分布情况构建)
平均数据集(正样本和负样本占据一样多)
反常规数据集(基于真实的业务数据分布情况相反来构建)
全正样本数据集,即全部是正样本
全负样本数据集,即全部是负样本
通常这几种数据集基本可以看得出一个模型的真实的准确率是多少。
分类指标常用的评估的方法就是使用混淆矩阵去计算各个指标 而回归的指标通常是MAE或者RMSE各种计算损失的函数之类。
下面来看一下 混淆矩阵 :
其中
- TP 是指 实际为正样本 预测结果为正
- FP 是指 实际为负样本 预测结果为正
- FN 是指 实际为正样本 预测结果为负
- TN 是指 实际为负样本 预测结果为负
根据上面的四个数据,可以得出以下的指标:
准确率就是考究一个模型所做的判断的准确度有多高精准率考究模型判断为正样本的准确率有多高召回率则是考究模型对正样本的敏感程度有多高小明在和大数据部门的小红探讨后,决定采用F1来评估模型的好坏F1是同时评估精准率P和召回率R的数据指标 计算的公式是:
在宣传的时候,大多数产品会含糊其辞其词的告诉你一个99.9x%的准确 率,并不会告诉你怎么测出来的。
但是在大多数的情况下,这个指标并没有太大的特点,就好比如上述的常规数据集,全部的负样本都可以预测出来,但是就是检测不出来正样本,也就是无法检测异常流量,也有99.95%的准确率。但是这么高的准确率并没有实际的用途。
所以在产品没有告知它自身的测试环境情况下,需要自己准备好测试集的同时,还要自己选好合适的度量指标,这样才可以准确的判断产品或者模型的实际检测率。
另外,虽然 F1 同时评估了评估精准率P和召回率R,但是有时候实际上我们可能更加关注精准率P或者是召回率R某一个,可以采取加权的方式来提升某个指标的重要性
除此之外,还有根据P****R还可以绘制PR曲线图,可以根据这个PR曲线图来判断模型的优劣
PR曲线
y轴 Pricision 精准率
x轴 Reacll 查全率
选取样本中每一个点计算Pricision,Reacll画图
面积越大效果越好
选取最接近右上角的点作为阈值来确定正样本的分割点
对数据量变化敏感
简单的理解PR图,阈值越低,判断为正样本的数据越多,查全率越高,精准率越低,最终查全率为100%的时候,精准率是最低的时候。
由于PR图评估会受到数据分布变化而影响,当你的正样本非常多或者非常少的时候,PR曲线完全会不一样。但是ROC曲线图则有更好的鲁棒性,ROC曲线由真正率和假正率来绘制
ROC曲线
x轴 FPR 预测为正的正样本占正样本的比率
y轴 TPR 预测为正的负样本占负样本的比率
选取样本中每一个点计算FPR,TPR画图
AUC是ROC曲线下的面积,AUC越大,效果越好
取最接近左上角的点作为阈值划分效果最好
对数据量变化不敏感
简单的理解ROC图,阈值越低,越多的数据会被预测为正样本,预测为错误就越低,但是预测负样本为正样本也会高,导致真正的负样本率会降低查全率最终肯定会穿过点(1,1),当AUC越大,模型在最优阈值下有更高的TPR以及更低的FPR
以下是两组图,左边是ROC曲线,右边是PR曲线,第一层的表格在正负样本分布1:1,第二层的表格正负样本1:10,可以看到PR曲线对正负样本分布十分敏感,而ROC曲线则几乎不变。
小明按照上述小红提供的方式对试用的产品用自己做好的测试数据进行了评测,结果所有的产品都表现出来非常糟糕的结果,不过小明在和厂商讨论后,有厂商愿意根据测试数据进行针对性的调整模型以及学习的策略,厂商根据小明提供的测试数据重新训练了一份新的模型,小明导入新的模型后,效果虽然还是欠缺了点,但是比一开始的表现好太多了,于是小明重新部署数据到测试环境,然后尝试把整个季度的流量日志导入进行分析和处理,但是发现效果还是并不好,误报的情况还是非常的多,小明单独审查了这些数据,发现大多数的数据都是周六周日,或者是假期的数据,于是小明又再次联系厂商,询问是否可以针对这个时间也做一下处理,厂商重新调整模型后,效果终于达到了宣传中的99%以上。
其实准备了测试数据,也有了评估方法后,需要多次反复的对模型或者产品进行测试,甚至还可能需要和厂商以及业务部门进行沟通,有时候还会重新让厂商小修小改一下模型或者产品,使得评估的效果得到最优的同时,也更加贴合实际业务的场景。
就评估方法而言,单一的评估方法是不合理的,需要结合多个评估的方法来确认模型的有效性,就比如一开始可以直接用ROC曲线去评估模型,但是用多种数据分布的时候,会尝试用PR的曲线去评估模型的稳定性等。
小明根据前面的测试结果,按照文档格式写了很多说明后,绘制了以下的表格
常规数据集 | P | R | F1 | ROC | PR |
---|---|---|---|---|---|
产品A | x | x | x | x | x |
产品B | x | x | x | x | x |
平均数据集 | P | R | F1 | ROC | PR |
---|---|---|---|---|---|
产品A | x | x | x | x | x |
产品B | x | x | x | x | x |
..
递交给了部门领导进行下一步的审核
在最后考量的时候,还是要回归到问题本质,仅仅是分析异常流量这个一个点,也可以衍生很多思考的点
如果想要误报率更低,那么可能降低R的权重。重新计算F的分数。
如果仅仅看哪个模型效果更好,可能只需要看ROC曲线,但是如果还要考量模型的稳定性,那么还得看PR曲线。
等等...
在综合各种因素衡量后,99.99%准确率或者精准率才有了确切的意义。在面对业务部门或者进行采购的时候,才可以量化考核的指标来进行衡 量,以上是在工作上使用机器学习后的一些思考和经验的感悟,假托了一个虚拟的故事来展现了一次评估的过程。
本文作者:wstart
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/76731.html