Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

这篇具有很好参考价值的文章主要介绍了Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.引言

推荐场景下需要使用上述指标评估离、在线模型效果,下面对各个指标做简单说明并通过 spark 程序全部搞定。

二.指标含义

1.TP、TN、FP、FN

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

搜广推场景下最常见的就是 Ctr 2 分类场景,对于真实值 real 和预测值 pre 分别有 0 和 1 两种可能,从而最终 2x2 产生 4 种可能性:

- TP 真正率 对的预测对,即 1 预测为 1,在图中体现为观察与预测均为 Spring

- FP 假正率 错的预测对,即 0 预测为 1,在图中体现为 NoSpring 预测为 Spring

- FN 假负率 对的预测错,即 1 预测为 0,在图中体现为 Spring 预测为 NoSpring

- TN 真阴率 错的预测错,即 0 预测为 0,在图中体现为 NoSpring 预测为 NoSpring

整理后如下图所示:

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

2.Accuracy、Precision、Recall、F1-Score

根据上面提到的 TP、TN、FP、FN,有了上述几个指标的定义:

- Accuracy 准确率

即不管是0还是1,预测正确即可

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

- Precision 精度

即预测为1的样本中确实为1的样本比例,该指标只管预测为1的样本

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

- Recall 召回率

即样本中正样本有多少预测为正,该指标只管真实为1的样本

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

- F1-Score

平衡分数,用于定义 Precision 与 Recall 的调和平均数

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

- Fβ-Score

平衡分数,相比于 F1 更加灵活的调和平均数

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

通过调节 β 参数,可以使指标更偏向于不同的 metrics,β>1 例如 F2-Score 时,Recall 的权重高于 Precision,相反如果 β < 1例如 F0.5-Score 则 Precision 权重高于 Recall,这个把分子拆分开即可轻松得出结论。

3.AUC

AUC(Area Under Curve)被定义为ROC曲线下的面积,针对给定的一批对正负样本,用分类器分别预测一对正负样本,正样本预测概率大于负样本预测概率的概率即对应面积大小。

3.1 常规计算

假定这批样本中存在 M 个正样本,N 个负样本,分类器为 Tk,则 AUC 计算公式如下:

其中 P 的计算根据学习器 Tk:

I 为示性函数:

3.2 快速计算

上面是基础的 AUC 计算公式,由于需要对每一对正负样本预测概率进行比对,而实际场景下 M 与 N 都非常大从而造成运行速度缓慢的问题,优化后公式如下:

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

简单约分下:

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

这个公式也比较好理解,由于 AUC 并不关注分数而是关注正负样本的序,因此我们将全部预测样本排序,针对每个正样本,其序就代表了它超过了多少个样本的预测值,针对每个正样本可以得到总的序为:

但是由于每一次序的排列中,除了负样本外还有正样本,针对 rank 最高的正样本,其下有 M-1 个正样本,rank 第二高的,其下有 M-2 个正样本,依次类推,共有:

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

所以需要在 ∑ rank 的基础上再减去 (M-1)·M / 2,至于为什么有公式是 M·(M+1) 有的是 (M-1)·M,这个其实和你计算的序即 rank 是从 0 开始还是从 1 开始,如果从 1 开始,则等差数列求和公式结果就是 M·(M+1) 反之即为  (M-1)·M。

3.3 手推计算

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

按照 M-1 即从 0 开始的 rank 计算:

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

按照 M+1 即从 1 开始的 rank 计算:

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

最后用最原始的方法计算一下,即将所有组合进行遍历:

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

这里 I 为上面提到的示性函数。

Tips:

这里还有一种特殊情况即有多个正负样本分值相同,此时排序后其 rank 值可以取所有相同分数的 rank 值平均代表其 rank,不过在大数据且 CTR 精度较高条件下,这个 rank 带来的影响可以近似忽略。

三.Spark 实现

1.数据预处理

    val rankResult = inputRdd.map { case (realLabel, preLabel, preScore) => {
      // val preLabel = if (preScore > 0.5) "1" else "-1"

      (realLabel, preLabel, preScore)
    }
    }.filter(_._3 >= 0)

    rankResult.persist(StorageLevel.MEMORY_AND_DISK_SER_2)

原始数据格式为 realLabel 和 preScore,这里可以通过 preScore + 阈值进行推理推断出 preLabel,即可得到三列元组的 RDD。实际计算过程中,你的 RDD 元祖只要有:

- Real Label 真实标签

- Predict Score 模型预测分

两个元素即可。

2.计算 TP、FP、FN、TN

    /*
      计算相关数值
        TP: 真正率 对的预测对
        FP: 假正率 错的预测对
        FN: 假负率 对的预测错
        TN: 真阴率 错的预测错
     */
    val threshold = 0.5
    val dataTP = rankResult.filter(x => x._1 == 1 && x._3 >= threshold).cache()
    val dataFP = rankResult.filter(x => x._1 != 1 && x._3 >= threshold).cache()
    val dataFN = rankResult.filter(x => x._1 == 1 && x._3 < threshold).cache()
    val dataTN = rankResult.filter(x => x._1 != 1 && x._3 < threshold).cache()

    val TP = dataTP.count()
    val FP = dataFP.count()
    val FN = dataFN.count()
    val TN = dataTN.count()
    val total = TP + FN + FP + TN

根据定义计算指标即可:

- TP 真正率 对的预测对

- FP 假正率 错的预测对

- FN 假负率 对的预测错

- TN 真阴率 错的预测错

Tips:

这里阈值常规为 0.5,大家也可以根据自己场景的需求进行阈值调整,对于 AUC 而言,其计算只关注序不关注分数,而 TP、TN 这些指标则与阈值分数相关。其次这里一定要加 persist,否则性能会慢很多。

3.计算 Precision、Recall、Accuracy、F1-Score

基于 TP、FP、FN、TN 计算 Precision、Recall 与 Accuracy,最后计算 F1-Score,大家也可以自定义 β,实现 F-β 参数。

    val Precision = if ((TP + FP) > 0) (TP * 1.0) / (TP + FP) else 0.0
    val Recall = if ((TP + FN) > 0) (TP * 1.0) / (TP + FN) else 0.0
    val Accuracy = if (total > 0) (TP + TN) * 1.0 / total else 0.0
    val F1Score = if ((Precision + Recall) > 0.0) (2 * Precision * Recall) / (Precision + Recall) else 0.0

4.计算 AUC

    // sort by predict
    val sorted = rankResult.sortBy(x => x._3)
    val numTotal = sorted.count() // M + N
    val numPositive = rankResult.filter(x => x._1 == 1).count // M
    val numNegative = numTotal - numPositive // N
    val sumRanks = sorted.zipWithIndex().filter(x => x._1._1 == 1).map(x => x._2 + 1).reduce(_ + _)
    val AUC = if (numNegative > 0 & numPositive > 0) {
      sumRanks * 1.0 / numPositive / numNegative - (numPositive + 1.0) / 2.0 / numNegative
    } else 0.0

直接根据 predict  分排序即可,这也再次呼应前面 Tips 提到的,AUC 只关注正负样本的序,最后套用约分后的公式即可:

Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

其中 M = numPositive,N = numNegative。

四.总结

AUC  评估的优点是:

- 对数据不平衡的情况有很好的适应能力,不受正负样本比例影响

- 评估结果简单,易于理解

- 不会受到分类器的阈值选择的影响

AUC 评估的缺点是:

- 不直接给出分类器的分类阈值

- 不适用于多分类问题

针对不同问题,除了 AUC 还有很多指标可供参考,大家需要根据自己的场景需求选择最优的评估指标,或者基于现有指标进行拓展。文章来源地址https://www.toymoban.com/news/detail-433940.html

到了这里,关于Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • YOLO 模型的评估指标——IOU、Precision、Recall、F1-score、mAP

    YOLO是最先进的目标检测模型之一。目标检测问题相比分类问题要更加复杂,因为目标检测不仅要把类别预测正确,还要预测出这个类别具体在哪个位置。 我将目标识别的评估指标总结为两部分,一部分为预测框的预测指标,另一部分为分类预测指标。 预测框的准确率用IOU来

    2024年02月04日
    浏览(51)
  • python:多分类-计算混淆矩阵confusion_matrix、precision、recall、f1-score分数

    多分类,计算混淆矩阵confusion_matrix,以及accuracy、precision、recall、f1-score分数。 1)使用sklearn计算并画出 混淆矩阵(confusion_matrix) ; 2)使用sklearn计算 accuracy(accuracy_score) ; 3)使用sklearn计算多分类的 precision、recall、f1-score分数 。以及计算每个类别的precision、recall、f1-

    2024年02月06日
    浏览(40)
  • 【计算机视觉 | 目标检测】术语理解3:Precision、Recall、F1-score、mAP、IoU 和 AP

    在图像目标检测中,常用的评估指标包括以下几项: 精确率(Precision):也称为查准率,表示被分类为正类别的样本中真正为正类别的比例。计算公式为:Precision = TP / (TP + FP),其中TP是真正例(模型正确预测为正类别的样本数),FP是假正例(模型错误预测为正类别的样本数

    2024年02月13日
    浏览(42)
  • 在分类任务中准确率(accuracy)、精确率(precision)、召回率(recall)和 F1 分数是常用的性能指标,如何在python中使用呢?

    在机器学习和数据科学中,准确率(accuracy)、精确率(precision)、召回率(recall)和 F1 分数是常用的性能指标,用于评估分类模型的性能。 准确率是模型预测正确的样本数占总样本数的比例。 精确率是指在预测为正的样本中,实际为正的比例。它关注的是预测为正的样本

    2024年01月19日
    浏览(50)
  • 机器学习分类器评价指标详解(Precision, Recall, PR, ROC, AUC等)(一)

    为了系统性地理解机器学习模型的不同评价指标及其之间的关系,我们将从其定义出发,探究其物理含义及彼此之间的联系,并从数学上给出相应的公式推导,以方便后续用到时复习理解。由于篇幅较长,因此将其分为两篇,这是第一部分,第二部分参见:机器学习分类器评

    2024年02月04日
    浏览(45)
  • Lesson 5.2 混淆矩阵与 F1-Score

    接下来,我们重点讨论关于分类模型评估指标相关内容。 分类模型作为使用场景最为广泛的机器学习模型,相关模型评估指标也伴随着使用场景的拓展而不断丰富。 除了此前所介绍的准确率以外,常用的二分类模型的模型评估指标还有召回率(Recall)、F1 指标(F1-Score)、受

    2024年02月05日
    浏览(44)
  • 准确率、精确率、召回率、F1-score

    TP(True Positives):真正例,即正例预测为真(预测为正例而且实际上也是正例); FP(False Positives):假正例,即负例预测为真(预测为正例然而实际上却是负例); FN(false Negatives):假负例,即正例预测为假(预测为负例然而实际上却是正例); TN(True Negatives):真负例,即

    2024年02月03日
    浏览(45)
  • NLP NER 任务中的精确度(Precision)、召回率(Recall)和F1值

    在自然语言处理(NLP)中的命名实体识别(NER)任务中,精确度(Precision)、召回率(Recall)和F1值是评估模型性能的关键指标。这些指标帮助我们了解模型在识别正确实体方面的效率和准确性。 精确度(Precision) : 精确度是指模型正确识别的命名实体数与模型总共识别出

    2024年01月23日
    浏览(54)
  • 【机器学习笔记15】多分类混淆矩阵、F1-score指标详解与代码实现(含数据)

    参考文章 4.4.2分类模型评判指标(一) - 混淆矩阵(Confusion Matrix)_进击的橘子猫的博客-CSDN博客_混淆矩阵 之前在逻辑回归的文章中简单提到过F1-score,但并没有详细对其进行说明和代码实现。这里补一下。 混淆矩阵 (又称 误差矩阵 )是评判模型结果的指标,属于模型评估的

    2023年04月17日
    浏览(45)
  • Python手动输入混淆矩阵,并计算混淆矩阵的准确率、精确率、召回率、特异度、F1-score

    其中json格式的文件如下: {     \\\"0\\\": \\\"13\\\",     \\\"1\\\": \\\"18\\\",     \\\"2\\\": \\\"23\\\",     \\\"3\\\": \\\"28\\\",     \\\"4\\\": \\\"33\\\" } 可以按照以上格式(以5分类为例),先写在记事本上再更改后缀名 *注意最后一个后面没有 “,”  没有扩展名的看下面这个图给它调出来↓ 代码部分参考如下:  参考文献:使用

    2024年02月13日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包