二分类评估,从混淆矩阵提及

《理解交叉验证》一文中,咱们谈到了使用 AUC 来对比不一样模型的好坏,那么 AUC 是什么?它是如何衡量一个模型的好坏的呢?除了 AUC 之外,还有其余评估手段吗?本文咱们就来探讨下这几个问题。算法

混淆矩阵

要了解 AUC,咱们须要从另一个概念——混淆矩阵(Confusion Matrix)提及,混淆矩阵是一个 2 维方阵,它主要用于评估二分类问题(例如:预测患或未患心脏病、股票涨或跌等这种只有两类状况的问题)的好坏。你可能会问多分类问题怎么办?实际上,多分类问题依然能够转换为二分类问题进行处理。下图是一个用于评判是否患有心脏病的混淆矩阵:机器学习

cm1

纵向看混淆矩阵,它体现了真实状况下,患病和未患病的人数,上图中,真实患心脏病的人数为 True Positive + False Negative,未患心脏病的人数为 False Positive + True Negative;相似的,横向看混淆矩阵,它体现了模型预测出来患心脏病的人数为 True Positive + False Positive,而预测未患心脏病的人数为 False Negative + True Negative。post

两个方向一块儿看,预测患病且实际也患病,咱们称它为真阳性 (True Positive),预测未患病且实际也未患病,被称为真阴性 (True Negative),这两个区域是模型预测正确的部分;模型预测错误也分两种状况,假阳性 (False Positive) 表示预测患病,但实际却未患病,假阴性 (False Negative) 表示预测未患病,但实际却患了病的状况。学习

概念有点多,但并不难记,能够看到,这些名词都是围绕着预测来命名的——预测患病时被称为「True/False Positive」,预测未患病时被称为 「True/False Negative」。cdn

上图中,模型预测正确的部分用绿色填充,它所占的比例又被称为准确率 (Accuracy):blog

Accuracy = \frac {TP + TN} {TP + TN + FP + FN}

单靠准确率这一项,并不足以评估模型的好坏,例以下面这种状况,虽然准确率能够达到 80%,但在实际患病的人群中,该模型的预测成功率只有 50%,很明显它不是一个好模型。ci

患心脏病 未患心脏病
患心脏病 10 10
未患心脏病 10 70

Sensitivity 和 Specificity

因此,咱们须要引入更多的衡量指标,Sensitivity (或 Recall) 表示实际患者中,预测患病成功的几率,同时 Sensitivity 这个词也有"过敏"的意思,和患病对应,这样关联起来比较好记:get

Sensitivity = \frac{TP}{TP+FN}

既然有衡量患病(正样例)的指标,那确定也有衡量未患病(负样例)的指标,Specificity 就是用来表示实际未患病的人群中,预测未患病成功的几率,即it

Specificity = \frac{TN}{TN+FP}

Specificity 这个词有"免疫"的意思,能和未患病相关联,因此也很好记。io

这两个指标的出现,能更好的帮你比较模型间的差别,并在其中作出取舍。例如当两个模型的 Accuracy 相近时,若是你更看重于预测患病的效果,你应该选 Sensitivity 值较高的;相反,若是你更看重于预测未患病的效果,你就应该选择 Specificity 较高的。

ROC 曲线、AUC 和 F1 Score

更进一步,咱们还能够经过将这些指标图形化,以得到更直观的评估结果,ROC (Receiver Operating Characteristic) 曲线就是其中经常使用的一种。

咱们知道,分类模型(例如"逻辑回归”)的结果是一个大于 0 且小于 1 的几率,此时咱们还须要一个阈值,才能界定是否患病,一般咱们把阈值设为 0.5,这样当结果大于 0.5 时可断定为患病,不然断定为未患病。

而阈值能够取 0 到 1 之间的任意一个值,对每个阈值,都有一个混淆矩阵与之对应,有了混淆矩阵,咱们就能够求出一对 Sensitivity 和 Specificity,经过这两个数,咱们就能够在一个以 1-Specificity 为横坐标,Sensitivity 为纵坐标的坐标系上画一个点,把全部可能的阈值所产出的点连起来,就是 ROC 曲线。

下面咱们来看一个具体的例子,假设咱们对老鼠作研究,但愿经过老鼠的体重来预测其患心脏病的几率,咱们采用逻辑回归算法来建模,下图是预测结果,图中有 10 个老鼠样本点,其中红色点表明实际健康的老鼠,蓝色点表明实际患病的老鼠,这些点用一条逻辑回归曲线拟合,图中还有一条 P=0.5 的直线用来表示阈值为 0.5,能够看出,高于 P=0.5 的 5 只老鼠被预测为患病,而其余 5 只老鼠被预测为健康,预测成功率(Accuracy)为 80%:

下面咱们经过以上数据,来画一条 ROC 曲线。首先取阈值为 1,此时全部的老鼠都被预测为未患病,根据样本真实患病状况,咱们能够获得以下混淆矩阵

根据上述混淆矩阵,咱们就能够算出一组 Sensitivity 和 Specificity 的值。接着咱们不断调整阈值,以得到全部的 Sensitivity 和 Specificity 对,由于这里咱们的样本点较少,因此让阈值根据样本点来采样便可,依然用横线表示阈值,则全部阈值的采样状况以下:

咱们把这些阈值对应的混淆矩阵都列出来:

而后,计算这些混淆矩阵对应的 Sensitivity 和 1-Specificity:

Threshold Sensitivity 1- Specificity
1 0 0
0.99 0.2 0
0.97 0.4 0
0.94 0.4 0.2
0.90 0.6 0.2
0.71 0.8 0.2
0.09 0.8 0.4
0.043 1.0 0.4
0.0061 1.0 0.6
0.0003 1.0 0.8
0 1.0 1.0

根据该表格,以 1-Specificity 为横轴,Sensitivity 为纵轴做图,一般,在画 ROC 曲线时,咱们把 1-Specificity 对应的坐标轴记为 FPR (False Positive Rate),把 Sensitivity 对应的坐标轴记为 TPR (True Positive Rate),以下:

ROC 曲线有如下特色:

  1. 从 (0, 0) 点到 (1,1) 点的对角线上的每一个点,意味着在患者中,预测患病成功的几率(TPR),与未患病者中,预测未患病失败的几率(FPR)相等,对于模型来讲,TPR 越大越好,FPR 越小越好,因此咱们须要尽量的使 ROC 曲线沿左上角方向远离该对角线。
  2. ROC 曲线还能够帮助咱们选择合适的阈值,即 TPR 相同的状况下,ROC 上的点越靠左,效果越好,由于越靠左,意味着 FPR 越小。

根据 ROC 曲线的第 1 个特色:「曲线越靠近左上角,模型的效果越好」,意味着一个更好模型,其曲线下方的面积更大,咱们把 ROC 曲线下方的面积称为 AUC (Area Under Curve),有了这个概念后,只需一个数值就能够衡量模型的好坏了,上面示例模型的 AUC 以下:

一般状况下咱们都使用 AUC 来评估模型,既然是”一般”,那确定就有例外:当患病率 (或正样本占比) 很是小时,Ture Negative 就会很是大,这个值就会使影响 FPR,使 FPR 较小,为了不这种影响,咱们能够将 FPR 用另外一个指标代替:Precision

Precision = \frac{TP}{TP+FP}

Precision 的含义是预测患病的样本中,实际也患病的比例;这样,将 Precision 和 Sensitivity 结合起来,会让咱们更专一于患病 (正样本) 的预测效果,而机器学习中的另外一个效果指标:F1 Score,就是专门负责这件事儿的

F1~Score = 2\times \frac{Precision\times Recall}{Precision + Recall}

上面的公式中,Recall 等价于 Sensitivity,和 AUC 同样,两个模型互相比较,F1 Score 越大者,预测效果越好,并且 F1 Score 能更好的衡量正样本的预测效果。

总结

本文经过一个医学例子——是否患心脏病——来说述什么是混淆矩阵、ROC 曲线、AUC 及 F1 Score,其中,咱们还一块儿学习了 ROC 曲线是如何画出来的,最后,咱们还谈到了 AUC 和 F1 Score 以及它们之间细微的差异。

须要注意的是,二分类评估并不限于对患病及未患病这两种状况的分类,考虑到通用性,你彻底能够将本文中的患心脏病替换为正样本、把未患心脏病替换为负样本。

相关文章
相关标签/搜索