Time: 2019.09.14git
本文首发于 www.f1renze.me/ 转载请注明出处!github
如无特殊说明,文中提到的分类皆指二分类任务markdown
在了解 ROC 以前,先得了解什么是 Confusion Matrix (It really confused me when I see it first time. XD)。实际上混淆矩阵可以帮助咱们了解分类任务模型的偏好性,如正判(True)较多或误判(False)较多,或是更多预测为 Positive / Negative (取决于 threshold 取值)。机器学习
更专业地说它被用于机器学习分类任务的性能度量,即衡量模型泛化能力的评价标准。oop
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 表示模型预测的类别。
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 的不一样偏好。
β = 1 时为标准的 F1;β > 1 时 Recall 有更大影响,0 < β < 1 时 Precision 有更大影响。 ![]()
因为分类器分类过程其实是为样本计算出预测几率,根据几率与事先定义的 threshold (一般为 0.5)进行比较,若大于 threshold 为正例(Positive),反之为反例(Negative)。若根据预测几率对测试集样本进行排序,预测几率值最大的样本即为最可能为正例的样本,预测几率值最小的样本即为最可能为反例的样本。
在不一样的应用场景下采起不一样的 threshold 能获得更符合预期的结果,以上文中诊断流感的场景来看,因为咱们更重视 Recall,故采起较低的 threshold 会下降患流感病人被认为健康的几率(而后致使更多的误诊,逃);但若在商品推荐系统中,为了尽量少打扰用户,更但愿推荐的商品是用户更感兴趣的,此时咱们更看重 Precision,故调高 threshold 更符合指望。
所以排序质量决定了分类器在不一样任务下的指望泛化性能的好坏,而 ROC 曲线可以很好地表示整体状况下分类器的泛化性能。典型的 ROC 曲线以 False Positive Rate 为 x 轴,True Positive Rate 为 y 轴,定义以下:
TPR = TP / (TP + FN)
FPR = FP / (TN + FP)
ROC 曲线绘制原理 根据 n 个测试样本计算出的预测几率排序,轮询将每一个预测值设置为 threshold 并计算此时的 TPR & FPR 为 (x, y) 坐标,拟合 n 个坐标点造成的曲线即为 ROC 曲线。
AUC 的全称是 Area Under Curve,顾名思义其为 ROC 曲线下的面积,不一样的 AUC 值表示模型区分不一样样本的能力。
理想状况下,模型将样本彻底区分为2类,此时 ROC 曲线以下所示,AUC = 1。
大多数时候 ROC 曲线是下图这样的,曲线总体接近左上方;AUC = 0.7 表示 70% 的样本会被正确分类,于此同时也有 FN 和 FP 的样本。
ROC 曲线处于对角线时 AUC = 0.5,表示模型极可能有问题,由于其区分类型的能力与随机无异。
AUC 低于 0.5 甚至接近 0 时,未必是一件坏事,说明模型将样本类型区分反了,若此时将 1 - 几率的值置为新的几率,AUC就接近 1 了!(别问我为啥知道)
代码地址:gist.github.com/F1renze/6ae…
以下图所示: