【科技小数据】这些让人头大的概念一文全讲清楚,召回、精确、准确( 三 )


我们再回到问题的场景当中 , 甲乙两个人 , 甲的召回更高 , 20个特务里找到了其中的12个 。 而乙的准确率更高 , 找出的10个人里面有8个是特务 , 命中率很高 。 那么这两个人究竟谁更强呢?
代入问题的场景 , 你会发现这个问题没有标准答案 , 答案完全取决于他们两人的上司 。 如果上司是一个利己主义者 , 更加注重业绩 , 宁可杀错不可放过 , 那么他显然会觉得甲更好 , 因为抓到的特务更多 。 如果上司是悲天悯人的仁者 , 他显然会更喜欢乙 , 少抓错一点就少给老百姓带来一些损伤 。 所以这并不是一个技术问题 , 而是一个哲学问题 。
哪一个更好完全取决于看待问题的角度和问题的场景 , 如果我们换一个场景就不一样了 。 如果是疾病筛查的场景 , 我可能会希望召回更高的 , 这样可以尽可能多地召回正例 。 至于检测结果不准确 , 我们可以多测几次来增加置信度 , 但是如果放过了一些样本就会带来患者漏诊的风险 。 如果是风控场景 , 由于查到了作弊行为后往往会采取严厉的处罚 , 我们当然更关注精确率 , 因为一旦抓错会给用户带来巨大的损伤 , 可能就卸载app再也不来了 , 所以宁可放过也不可杀错 。
有没有一个指标可以综合考虑召回和精确呢?还是有的 , 这个值叫做F1-score 。
它的定义是:
【科技小数据】这些让人头大的概念一文全讲清楚,召回、精确、准确
文章图片
如果熟悉数学的同学会发现f1-score本质上是recall和precision的调合平均数 , 我们可以用它来均衡recall和precision , 方便我们做取舍 。 我们也可以计算一下刚才甲和乙的f1-score , 计算下来 , 甲的f1-score是0.631 , 乙的f1-score是0.533 , 所以整体上来说还是甲更好 。
recall和precision的trade-off
我们继续刚才的例子 , 如果你们做过许多模型 , 你们会发现在机器学习领域当中 , recall和precision是不可调和的两个值 , 一个模型精确率高了 , 往往召回就低 , 而召回高了 , 精确率就低 , 我们很难做到精确和召回一起提升 , 这是为什么呢?
我用逻辑回归模型举例 , 我们来看下下面这张图:
【科技小数据】这些让人头大的概念一文全讲清楚,召回、精确、准确
文章图片
图中的l1 , l2和l3可以看成是3个不同的模型 , 显然我们可以看得出来l1的精确率最高 , 但是召回最低 , 而l3的精确最低 , 但是召回最高 。
这是由两个原因导致的 , 第一个原因是我们的样本存在误差 , 尤其是临界边缘的数据由于存在误差 , 会互相渗透 。 第二个原因是模型的拟合能力有限 , 比如在这个例子当中 , 我们用的是线性模型 , 我们只能以线性平面划分样本 。 如果扩大召回 , 就必然会导致混入更多错误样本 , 如果提升精度 , 必然召回会下降 。
显然 , 这是一个交易 , 英文是trade-off , 我们不能都要 , 必须要在两者之间做个选择 。 当然如果我们换成拟合能力更强大的模型 , 比如gbdt或者是神经网络 , 会取得更好的效果 , 但是也并非是没有代价的 , 越复杂的模型训练需要的样本数量也就越多 。 如果没有足够的样本 , 模型越复杂越难收敛 。
【科技小数据】这些让人头大的概念一文全讲清楚,召回、精确、准确
文章图片
这是一个考验算法工程师的经典场景 , 我们需要根据我们的场景做出合适的选择 。 究竟是要扩大召回 , 还是提高精确 。 以逻辑回归模型举例 , 我们以0.5位阈值来判断是正例还是负例 , 理论上来说 , 我们提升这个阈值 , 就可以提升模型的精确度 , 但是与此同时召回率也会下降 。 反之 , 如果我们降低这个阈值 , 我们会得到更多的正例 , 同时也意味着会有更多的负例被误判成了正例 , 精确度也就降低 。