如何评估模型的召回和准确
在源代码中检测秘密就像在大海捞针中找到针头:针头比针头要多得多,而且您不知道大海捞针中可能有多少针。 在机密检测的情况下,您甚至都不知道所有的针头是什么样子!
这是我们在尝试评估机密检测等概率分类算法的性能时遇到的问题。 该博客将解释为什么准确性度量标准与秘密检测无关,并且将介绍另外两个要一起考虑的度量标准:精确度和召回率。
准确性,准确性和召回率指标可以回答三个非常不同的问题:
精度 :您用一根针刺一根针,用一根针刺一根针的百分比是多少?
精度 :查看您能找到的所有针,实际上针的百分比是多少?
回想一下 :在所有被发现的针中,您发现了多少百分比的针?
为什么准确性不能很好地衡量秘密检测的成功?
它们的描述之间的差异微妙,但可以带来巨大的差异。
回到针类比,如果我们取一组100个对象,98根棍子和2根针,那么我们将创建一个算法来检测所有针。 运行后,该算法正确地识别了所有摇杆,但仅识别了一根针,然后该算法在其核心目标上失败了50%,但由于它正确地检测到摇杆,因此仍具有99%的准确率。
所以发生了什么事? 精度是模型评估中常用的一种度量方法,但是在这种情况下,精度为我们提供的数据最少,这是因为在干草堆中,棍棒的数量多于针的数量,并且对两个假阳性都施加了相等的权重(该算法将一根针扎成一根针)和假阴性(该算法将一根针扎成一根针)。
这就是为什么准确性不是确定秘密检测算法成功与否的好方法。 精度和召回率着眼于算法的主要目标,并以此来评估其成功性,在这种情况下,可以正确识别出多少针,错过多少针。
高精度 =错误警报数量少
高召回率 =漏失的秘密数量少
创建具有100%召回率的算法真的很容易:将每次提交标记为秘密。 创建一个具有100%精度的算法也很容易:只标记一次,对于秘密,您最有信心的确是秘密。 这两种朴素的算法显然是无用的。 它将精度和召回率结合起来构成了挑战。
那么,我们如何正确评估秘密检测模型的性能呢?
让我们假设一种算法,该算法扫描1,000个源代码文件以查找潜在的机密。
在此示例中,我们将声明:
- 975个文件在源代码中没有任何秘密
- 源代码中包含秘密的25个文件
检测到的算法
- 950 真实否定词(TN):在没有秘密的情况下未检测到任何秘密
- 25误报(FP):检测到的不是真实秘密的秘密
- 15个真实肯定(TP):检测到存在秘密的秘密
- 10个假阴性(FN):在存在秘密的地方没有发现任何秘密
这可以显示在混淆矩阵 (如下)上, 混淆矩阵是用于分类算法的性能测量工具,可帮助可视化数据并计算概率。
我们可以使用此矩阵来收集一系列不同的数据,包括准确性,准确性和召回率。
那么这些结果说明了什么? 我们可以推断出我们的模型具有96.5%的准确率,这看起来还不错,并且您可能认为这意味着它可以在96.5%的时间内检测到机密。
这将是不正确的,因为此假设模型实际上仅对不检测不存在的秘密有用。 这类似于一种算法,可以很好地预测不会发生的车祸。
如果我们查看准确性以外的指标,则可以看到该模型如何开始失败。
精度= 40%
召回率= 60%
突然之间,该模型似乎没有用。 它仅返回60%的机密,而仅返回的总机密的40%是真实的肯定!
平衡方程式:实现高精度,高召回率秘密检测算法
平衡方程式以确保捕获尽可能多的秘密而不会标记太多错误结果是一个复杂而极其困难的挑战。
GitGuardian如此困难, 以至于整个团队专门训练秘密检测算法,并在高召回率和高检测率之间找到适当的平衡。
如果精度过高可能导致秘密泄漏无法检测到,而精度过低则会产生过多的错误警报,从而使该工具无用,那么这是至关重要的。
建立和完善算法时没有捷径可走。 他们需要接受大量数据的大量培训和不断的监督。
当谈论为什么某些模型失败时,来自Lucina healths的Scott Robinson谈到了训练AI算法时的三个核心失败:
“ No1:数据不足,
第2点:监管不足,
No3:“黑匣子故障 ”。
(黑匣子系统非常复杂,难以渗透)
同样重要的是要认识到,当为概率场景构建算法时,它们会随着时间而变化。 没有完美的解决方案可以保持不变,趋势将改变,秘密将改变,数据将改变,格式将改变,因此,您的算法将需要改变。
“人们可以创建一个算法,但是数据确实使它有用” -Kapil Raina
以GitGuardian为例
GitGuardian是秘密检测的全球领导者,这在很大程度上要归功于该算法通过了大量的信息。
每年扫描和评估的提交超过10亿,向开发人员和安全团队发送的警报超过50万。 我们收集了很多明确的(警报标记为true或false)和隐式的(提交或警报后删除存储库)反馈。 这是一个很好的例子,说明如何有效地对数据进行重新训练,尤其是在如此大规模的情况下,可以不断地提高算法的精度和查全率。
在2017年初,GitGuardian每天在GitHub上检测200个秘密,这是市场上其他产品设定的基准。 通过广泛的模型培训,GitGuardian现在每天可检测到3,000多个,精度达到91%。
构建算法没有捷径可走。 我们已经在数十亿次提交(数十亿日元)的公共GitHub上对我们的算法进行了实战测试,这些算法现在也可以用于检测私有存储库中的秘密。 如果不首先在公共GitHub上启动私有存储库中的检测,那将是不可能的。
测试GitGuardian的自动机密检测
先前发布在 https://blog.gitguardian.com/secrets-detection-accuracy-precision-recall-explained/
如何评估模型的召回和准确