认识 ROC / AUC 与 Confusion Matrix

Time: 2019.09.14git

本文首发于 www.f1renze.me/ 转载请注明出处!github

混淆矩阵(Confusion Matrix)

如无特殊说明,文中提到的分类皆指二分类任务markdown

在了解 ROC 以前,先得了解什么是 Confusion Matrix (It really confused me when I see it first time. XD)。实际上混淆矩阵可以帮助咱们了解分类任务模型的偏好性,如正判(True)较多或误判(False)较多,或是更多预测为 Positive / Negative (取决于 threshold 取值)。机器学习

更专业地说它被用于机器学习分类任务的性能度量,即衡量模型泛化能力的评价标准。oop

图片来源:dataschool

Confusion Matrix 由 4 个术语组成,咱们如今把分类问题假设为医生诊断病人是否患流感:性能

  • True Positive (TP)学习

    若病人实际上患了流感且医生确诊为流感,称为 TP。测试

  • True Negative (TN)spa

    若病人未患流感且医生诊断该病人未患流感,称为 TN。code

  • False Positive (FP)

    若病人未患流感但被误诊为已患流感,称为 FP,又称 “Type I error”。

  • False Negative (FN)

    若病人患流感但被误诊为未患流感,称为 FN,又称 “Type II error”。

因此实际上 Confusion Matrix 并不难理解,T / F 表示模型预测值与实际值是否符合,P / N 表示模型预测的类别。

由 Confusion Matrix 延伸的几个指标

  • Accuracy ,精度,最经常使用的指标。

    表示分类预测正确的样本数占整体样本的比例。

    (TP + TN) / (TP + FP + TN + FN)

  • Recall,又称查全率。

    表示全部实际为 Positive 类别的样本中被预测准确的几率。

    Recall = TP / (TP + FN)

  • Precision,又称查准率。

    表示全部被预测为 Positive 的样本中预测准确的几率。

    Precision = TP / (TP + FP)

    通常来讲 Precision 高时 Recall 会偏低,反之 Recall 高时 Precision 偏低,因此须要引入 F-Score 来比较不一样模型的性能。

  • F-Score,又称 F1-score。

    为 Precision 和 Recall 的调和平均值,值越接近 1 越好,反之越接近 0 越差。

    F-Score = 2*(Recall * Precision) / (Recall + Precision)

回到上文中诊断流感的例子来讲明这几个指标。
若 Accuracy 为 90%,表示用此模型预测时,每10个样本里有9个预测正确,1个预测错误。
若 Precision 为 80%,表示用此模型预测时,每10个被判断为患流感的例子中就有2例误诊。
若 Recall 为 70%,表示用此模型预测时,每10个实际患流感的病人中就有3个病人会被告知没有患流感。
因此在这个应用场景中咱们更看重的是 Recall,而 F-Score 的通常形式 Fβ 能表示模型对于 Precision / Recall 的不一样偏好。

Fß公式
β = 1 时为标准的 F1;β > 1 时 Recall 有更大影响,0 < β < 1 时 Precision 有更大影响。

什么是 ROC 曲线?

因为分类器分类过程其实是为样本计算出预测几率,根据几率与事先定义的 threshold (一般为 0.5)进行比较,若大于 threshold 为正例(Positive),反之为反例(Negative)。若根据预测几率对测试集样本进行排序,预测几率值最大的样本即为最可能为正例的样本,预测几率值最小的样本即为最可能为反例的样本。

在不一样的应用场景下采起不一样的 threshold 能获得更符合预期的结果,以上文中诊断流感的场景来看,因为咱们更重视 Recall,故采起较低的 threshold 会下降患流感病人被认为健康的几率(而后致使更多的误诊,逃);但若在商品推荐系统中,为了尽量少打扰用户,更但愿推荐的商品是用户更感兴趣的,此时咱们更看重 Precision,故调高 threshold 更符合指望。

所以排序质量决定了分类器在不一样任务下的指望泛化性能的好坏,而 ROC 曲线可以很好地表示整体状况下分类器的泛化性能。典型的 ROC 曲线以 False Positive Rate 为 x 轴,True Positive Rate 为 y 轴,定义以下:

  • TPR / Recall
    TPR = TP / (TP + FN)
  • FPR
    FPR = FP / (TN + FP)

ROC 曲线绘制原理 根据 n 个测试样本计算出的预测几率排序,轮询将每一个预测值设置为 threshold 并计算此时的 TPR & FPR 为 (x, y) 坐标,拟合 n 个坐标点造成的曲线即为 ROC 曲线。

什么是 AUC

AUC 的全称是 Area Under Curve,顾名思义其为 ROC 曲线下的面积,不一样的 AUC 值表示模型区分不一样样本的能力。

理想状况下,模型将样本彻底区分为2类,此时 ROC 曲线以下所示,AUC = 1。

auc_1.png
auc_1_roc.png

大多数时候 ROC 曲线是下图这样的,曲线总体接近左上方;AUC = 0.7 表示 70% 的样本会被正确分类,于此同时也有 FN 和 FP 的样本。

auc_0.7.png
auc_0.7_roc.png

ROC 曲线处于对角线时 AUC = 0.5,表示模型极可能有问题,由于其区分类型的能力与随机无异。

auc_0.5.png
auc_0.5_roc.png

AUC 低于 0.5 甚至接近 0 时,未必是一件坏事,说明模型将样本类型区分反了,若此时将 1 - 几率的值置为新的几率,AUC就接近 1 了!(别问我为啥知道)

auc_0.png
auc_0_roc.png

Python 实现

代码地址:gist.github.com/F1renze/6ae…

以下图所示:

30个随机数据生成的 ROC 曲线,threshold 取值 0.5

延伸阅读

相关文章
相关标签/搜索