logo

二分类评价指标

王哲峰 / 2023-03-19


目录

混淆矩阵

混淆矩阵:

img

混淆矩阵及其相关指标:

img

错误率

定义:

$$E(f; D)=\frac{1}{N}\sum_{i=1}^{N}I(f(x_{i}) \neq y_{i})$$

$$ErrorRate(\hat{y}_{i}, y_{i})=\frac{1}{N}\sum_{i=1}^{N}I(\hat{y}_{i} \neq y_{i})$$

$$ErrorRate = \frac{FP+FN}{TP+FP+FN+TN}$$

其中:

准确率

定义:

$$E(f; D)=\frac{1}{N}\sum_{i=1}^{N}I\Big(f(x_{i}) = y_{i}\Big)$$

$$Accuracy(\hat{y}_{i}, y_{i}) = \frac{1}{N}\sum_{i=1}^{N}I(\hat{y}_{i} = y_{i})$$

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

其中:

针对准确率问题,目前常采用的损失函数为 Binary Log Loss/Binary Cross Entropy,其数学形式如下:

$$LogLoss = -\frac{1}{N}\sum_{i=1}^{N}\Big(y_{i}log p_{i} + (1 - y_{i})log(1 - p_{i})\Big)$$

其中:

查准率和查全率以及 F1

错误率和精度并不能满足所有任务中的需求。如在信息检索中, 经常会关心“检索出的信息中有多少比例是用户感兴趣的”(Precision)、 “用户感兴趣的信息中有多少被检索出来了”(Recall)。 需要查准率(Precision)和查全率(Recall)来进行此类需求的性能度量

二分类问题中,将样例根据真实类别与分类器预测类别的组合, 可以分为真正例(true positive)、假正例(false positive)、 真反例(true negative)和假反例(false negative)四种情形, 即 TP、FP、TN、FN,显然有 TP + FP + TN + FN = 样例总数

查准率

查准率,Precision

根据混淆矩阵,查准率 Precision 的定义为:

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

查准率是对于自己模型的预测而言的,它表示在所有预测的正例中预测正确的比例,即真正例的比例。 想提高查准率,可以只对自己有信心预测正确的样本进行预测,假如模型预测出一个正例而且为真正例, 其查准率为 100%,而预测 10 个正例其中有 9 个真正例,其查准率则为 90%。 所以有句话怎么说的来着?多说多错,少说少错,不说不错。当然,这里只是体现一下思想

在信息检索中,查准率也可以看成是检索出来的条目(文档、网页)有多少是准确的(准确的定义为所关心的正好被检索出来)

$$Precision = \frac{某类被正确分类的关系实例个数}{被判定为某类的关系实例总数}$$

查全率

根据混淆矩阵,查准率 Recall 的定义为:

$$Recall = \frac{TP}{TP + FN}$$

查全率是对于真实答案而言的,它表示预测出的真正例覆盖了多少原样本的正例。 体现了“宁可错杀千人,不可放过一个”的思想,就算是找遍全天下所有人,也要把目标找出来。 把目标名单里所有人都找到,就成功了(查全率高),而不在乎找错了多少人

在信息检索中,查全率也可以看成是所有准确的条目有多少被检索出来了:

$$Recall = \frac{某类被正确分类的关系实例个数}{测试集中某类的关系实例总数}$$

F1

可以看出,查准率和查全率其实是矛盾的。想提高查准率就要谨慎判断每一个抓到的人是不是该杀的目标, 杀错一个就会降低查准率;而想提高查全率就要把每一个抓到的疑似目标都杀掉, 这样虽然可能会误杀很多人但是放过目标的概率会比较低。所以为了平衡查准率和查全率, 提出​ $F1$ 度量,其是基于查准率与查全率的调和平均定义的

$$\frac{1}{F1} = \frac{1}{2} \cdot (\frac{1}{Precision} + \frac{1}{Recall})$$

转换为:

$$F1 = \frac{2 \times Precision \times Recall}{Precision + Recall} = \frac{2 \times TP}{样例总数 + TP - TN}$$

在特定的应用场景中,对查准率和查全率的重视程度会有所不同。 如商品推荐系统中,为尽可能少打扰用户,更希望推荐内容是用户感兴趣的, 此时查准率比较重要;而在逃犯信息检索系统中,更希望尽可能少漏点逃犯, 此时查全率更重要。由此我们引入​ $F1$ 度量的一般形式 $F_{\alpha}$

$$F_{\alpha} = \frac{(\alpha^{2}+1)Precision \times Recall}{(\alpha^{2} \times Precision) + Recall}$$

其中:

举例

举个例子,某池塘有 1400 条鲤鱼,300 只虾,300 只鳖。 现在以捕鲤鱼为目的,撒一大网,逮着 700 条鲤鱼,200 只虾,100 只鳖, 那么 Precision, recall, F1 分别如下:

$$Precision = \frac{700}{700 + 200 + 100}=70\%$$

$$Recall = \frac{700}{1400} = 50\%$$

$$F1 = \frac{2 \times 70\% \times 50\%}{70\% + 50\%} = 58.3\%$$

不妨看看如果把池子里的所有的鲤鱼、虾和鳖都一网打尽,这些指标又有何变化:

$$Precision = \frac{1400}{1400 + 300 + 300}=70\%$$

$$Recall = \frac{1400}{1400} = 100\%$$

$$F1 = \frac{2 \times 70\% \times 100\%}{70\% + 100\%} = 82.35\%$$

由此可见,查准率(Precision)是评估捕获的成果(被判定为关心的类别样本)中目标成果(关心的类别样本)所占的比例; 召回率(Recall)就是从关注领域(关心的类别样本)中,召回目标类别(被判定为关心的类别中关心的类别)的比例; F1 值则综合这两者指标的评估指标,用于综合反映整体领域的指标

和准确率指标优化类似,此处使用 Binary Cross Entropy 进行优化即可, 不同之处在于,在得到最终的预测概率之后,需要通过一些策略寻找最优阈值

还有的时候会对损失函数进行加权优化;例如标签为 1 的样本的权重就设置大一些等

Precision Recall Rate

Log Loss

Log Loss 也称为逻辑回归损失或交叉熵损失。它基本上定义在概率估计上, 并测量分类模型的性能,其中输入是介于 0 和 1 之间的概率值

通过精确区分,可以更清楚地理解它。准确度是我们模型中预测的计数(预测值=实际值), 而对数损失是预测的不确定性量,基于它与实际标签的差异。借助对数损失值, 可以更准确地了解模型的性能

$$LogLoss = -\frac{1}{N}\sum_{i=1}^{N}\Big(y_{i}log p_{i} + (1 - y_{i})log(1 - p_{i})\Big)$$

其中:

因为 Logloss 是可以直接进行优化的函数,一般我们会直接基于 LogLoss 函数进行优化

混淆矩阵 以及 ROC 和 AUC

二分类问题中,很多分类器​会生成一个预测概率,然后将预测概率与分类阈值(threshold)进行比较, 若大于阈值则分为正类,否则为反类。若分类阈值为 0.5,预测概率结果在 $[0, 1]$, 然后将这个值与 0.5 进行比较,若大于 0.5 判为正例,否则判为反例。

ROC

img

根据预测结果,可以将样本进行排序,将模型认为最可能是正例的样本(预测概率最高)排在最前面, 模型认为最不可能是正例的样本排在最后,这样一来,分类过程就可以看作某个截断点将样本一分为二, 前一部分为正例,后一部分为反例。排序本身质量的好坏基本体现了模型泛化性能的好坏, ROC 曲线就是从这个角度出发来研究学习器泛化性能的。

ROC 全称为“受试者工作特征”(Receiver Operating Characteristic),把排好顺序的样本逐个作为正例进行预测, 每次预测得到两个值:真正例率(True Positive Rate, TPR)、假正例率(False Positive Rate, FPR), 分别定义如下:

$$TPR = \frac{TP}{TP + FN}$$

$$FPR = \frac{FP}{TN + FP}$$

然后以​ FPR 为横坐标,​ TPR 为纵坐标,得到当前情况的坐标点,直至最后, 然后将所有的点连线就得到了​ ROC 曲线

下面详细描述一下​曲线的画法:现有 20 个样本,正例 10 个,反例 10 个,正例用 $P$ 表示,反例用 $​N$ 表示, 模型预测出每个样本为正例的概率,然后从高到低进行排序,如下:

$P1, P2, P3, N1, P4, N2, P5, P6, P7, N3, N4, N5, P8, N6, P9, N7, N8, N9, P10, N10$

需要从上面 20 个样本得到 22 个坐标点

理论上来讲,无限个样本可以绘出圆滑的 ROC 曲线,而现实中通常是利用有限个样本来绘制 ROC 曲线, 生成的是有棱角的近似曲线

将之前得到坐标点的方法进行归纳:有​ $m^{+}$ 个正例和​ $m^{-}$ 个反例, 按预测为正例的概率大小排好序后,设前一个标记点坐标为 $(x, y)$,若当前为真正例, 则坐标为​ $(x, y + \frac{1}{m^{+}})$;若当前为假例,则坐标为 $(x+\frac{1}{m^{-}}, y)$

img

直观理解,随机猜测的​ ROC 曲线应该是 $y = x$ 直线。若 ROC 曲线在此直线上面, 即向上走得比向右走得“快”,真正例率大于假正例率,说明模型比随机猜测好, 大部分正例都排在反例的前面,预测模型较好。若有新的​ ROC 曲线可以完全包括之前的 ROC 曲线, 则新模型的性能要优于原来的模型。如果两个​ ROC 曲线有交叉部分, 我们就需要计算​曲线下的面积大小来判断哪个模型的性能优越了

AUC

ROC 曲线下的面积被称为​ AUC(Area Under ROC Curve), 它可以通过相邻两个坐标点与 $x$​ 轴形成的矩形或梯形的面积累加得到。 之所以存在梯形,是因为如果有几个预测概率相同的正反样例, 把哪个排前面哪个排后面都不太好,就用其形成的矩形的对角线来表示这几个正反样例的 ROC 曲线

所以可以用如下公式来计算​ AUC,矩形也是一种特殊的梯形, 所以直接用梯形求和公式来计算两个坐标点与 $x$轴形成的面积。$x_{i} - x_{i-1}$ 是梯形的高, ​$y_{i-1}$$y_{i}$ ​分别为梯形的上底和下底

$$AUC = \sum_{i = 2}^{m}\frac{(x_{i} - x_{i-1})\times (y_{i} + y_{i-1})}{2}$$

AUC 值其实是一个概率值,当随机挑选出一个正样本和负样本对, 当前的分类算法根据计算得到的 Score 值将这个正样本排在负样本前面的概率就是 AUC 值, AUC 值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。 最理想的情况就是所有的正样本全部在负样本前面,这样就可以以其分界线作为阈值将正负样本完全分开, 这是最好的模型情况,$AUC = 1$

有一点需要特别声明,​AUC 只能用来做二分类模型的性能度量,而且当正负样本不均衡时效果不理想。 生成坐标时向上走一步​ $\frac{1}{m^{+}}$,向右走一步 $\frac{1}{m^{-}}$, 若​ $m^{+}$ 与​ $m^{-}$ 相差比较大,比如​ $m^{+}$ 远大于 $m^{-}$, 则​ ROC 曲线向上走得要比向右走得快,更有可能被判断为性能好的模型, 但其实只是因为正负样本不均衡造成的

AUC 的数值都不会大于 1。又由于 ROC 曲线一般都处于 $y=x$ 这条直线的上方, 所以 AUC 的取值范围在 0.5 和 1 之间。AUC 越接近 1.0,检测方法真实性越高。 等于 0.5 时,一般就无太多应用价值了

最为常见的还是基于 LogLoss 函数的优化

Normalized Gini Coefficient

$$Gini = 2 \times AUC - 1$$

参考