二分类评价指标
wangzf / 2023-03-19
目录
混淆矩阵
混淆矩阵:
混淆矩阵及其相关指标:
错误率
- Error Rate:错误率
- 错误率是分类错误的样本数占样本总数的比例
定义:
$$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}$$
其中:
$I(\cdot)$
为示性函数$N$
为测试样本个数$y_{i} \in \{0, 1\}$
表示样本$i$
对应的真实标签$\hat{y}_{i}\in \{0, 1\}$
表示样本$i$
对应的预测结果
准确率
- Accuracy:准确率
- 精度则为分类正确的样本数占样本总数的比例
定义:
$$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}$$
其中:
$I(\cdot)$
为示性函数$N$
为测试样本个数$y_{i} \in \{0, 1\}$
表示样本$i$
对应的真实标签$\hat{y}_{i}\in \{0, 1\}$
表示样本$i$
对应的预测结果
针对准确率问题,目前常采用的损失函数为 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)$$
其中:
$p_{i}$
为模型对第$i$
个样本的预测概率
查准率和查全率以及 F1
- Precision:查准率、精度
- Recall:查全率、召回率
- F1:F1 Measure / F1 Score
错误率和精度并不能满足所有任务中的需求。如在信息检索中, 经常会关心“检索出的信息中有多少比例是用户感兴趣的”(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}$$
其中:
$\alpha, \alpha>0$
度量了查全率(Recall)对查准率(Precision)的相对重要性$\alpha = 1$
时为标准$F1$
$\alpha > 1$
时查全率(Recall)有更大的影响$0 < \alpha < 1$
时查准率(Precision)有更大的影响
举例
举个例子,某池塘有 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
- TODO
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)$$
其中:
$p_{i}$
为模型对第$i$
个样本的预测概率
因为 Logloss 是可以直接进行优化的函数,一般我们会直接基于 LogLoss 函数进行优化
混淆矩阵 以及 ROC 和 AUC
二分类问题中,很多分类器会生成一个预测概率,然后将预测概率与分类阈值(threshold)进行比较,
若大于阈值则分为正类,否则为反类。若分类阈值为 0.5,预测概率结果在 $[0, 1]$
,
然后将这个值与 0.5 进行比较,若大于 0.5 判为正例,否则判为反例。
ROC
根据预测结果,可以将样本进行排序,将模型认为最可能是正例的样本(预测概率最高)排在最前面, 模型认为最不可能是正例的样本排在最后,这样一来,分类过程就可以看作某个截断点将样本一分为二, 前一部分为正例,后一部分为反例。排序本身质量的好坏基本体现了模型泛化性能的好坏, 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 个坐标点
- 第一个是
$(0, 0)$
,即将分类的阈值设为最大,这样所有的样例均预测为反例,TPR 和 FPR 均为 0- 然后将分类阈值依次设为每个样例的预测值,即
$P1$
为正例,其他为反例, 此时,,所以第二个坐标为$(0, \frac{1}{10})$
- 依次向后,得到坐标点
$(0, \frac{2}{10})$
、$(0, \frac{3}{10})$
、$(\frac{1}{10}, \frac{3}{10})$
、$(\frac{1}{10}, \frac{4}{10})$
…- 第 22 个坐标为
$(1,1)$
,即所有样本均预测为正例:$TPR = 1$
,$FPR = 1$
理论上来讲,无限个样本可以绘出圆滑的 ROC 曲线,而现实中通常是利用有限个样本来绘制 ROC 曲线, 生成的是有棱角的近似曲线
将之前得到坐标点的方法进行归纳:有 $m^{+}$
个正例和 $m^{-}$
个反例,
按预测为正例的概率大小排好序后,设前一个标记点坐标为 $(x, y)$
,若当前为真正例,
则坐标为 $(x, y + \frac{1}{m^{+}})$
;若当前为假例,则坐标为 $(x+\frac{1}{m^{-}}, y)$
直观理解,随机猜测的 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$$