赞
踩
这里,我们来考察一下NLP分类问题中常用的metrics定义。
它们主要包括:
当然,由于序列标注问题本质上也就是对序列中的每一个元素进行标签分类,因此,这里讨论的metrics定义事实上也完全可以适用。
这里,需要注意的是,分类问题的标签集合之间应该是相互独立且互斥的,不同标签之间的距离应该认为是平权的,这样,上述的指标才会合理。
Accuracy大约是分类问题中最直接的指标了,其定义也极其简单,只要将测试集中预测正确的结果除以总的预测量即可,写作公式形式即为如下:
A c c u r a c y = N ( y p r e d = y t r u e ) N t o t a l Accuracy = \frac{N(y_{pred} = y_{true})}{N_{total}} Accuracy=NtotalN(ypred=ytrue)
但是,简单的代价是会带来表征能力的不足,在大多数的分类问题中,事实上我们更关心的其中的某一些标签的预测结果。
比如说,我们要找出大量无效数据中的有效数据,对这样一个二分类问题,Accuracy指标就会明显地失衡,因为显然即便当模型效果极差,将所有的数据都识别为无效数据时,依然可以得到一个极高的Accuracy指标,导致我们完全无法从中获取有效信息。
针对这类问题,一种有效的优化就是使用下述F1指标。
要考察F1 score,我们首先要考察TP, FP, FN以及TN四个定义。
我们以二分类问题为例,显然,所有的预测结果均可归结为下述4种情况之一:
给出一个简单的例子如下:
则我们可以将结果用下述表格进行显示:
P | N | |
---|---|---|
T | 15 | 70 |
F | 10 | 5 |
而针对多分类问题,事实上,我们也都是将其拆分为多个二分类问题进行考察,对每一个类别,将其他的所有类别全部视为负例,那么我们就可以同上计算得到TP、FP、FN以及TN的值。
准确率(Precision)的定义是在预测为真的结果中预测正确的数据的占比。其定义公式如下所示:
P r e c i s i o n = T P T P + F P Precision = \frac{TP}{TP + FP} Precision=TP+FPTP
可以看到,准确率更关注的是预测结果的可信度,而不关心真实结果是否被找全,因此其适用场景为相对不太关心覆盖率的场景,譬如内容推荐,你可以没有推出最合适的内容,但是你推荐的内容一定要和用户的搜索强相关,否则就会非常影响用户的搜索体验。
与准确率相反,召回率更在乎预测结果的覆盖率,它的定义为:在所有结果为真的数据中,被成功预测出来的数据占比。给出定义公式如下:
R e c a l l = T P T P + F N Recall = \frac{TP}{TP + FN} Recall=TP+FNTP
因此,召回率适用的场景为高覆盖率要求场景,即漏判成本远高于误判成本的情况。典型的例子就是疾病诊断,误判也就是增加了医生的工作成本,但是漏判将会带来极为严重的后果。
F1 score综合了准确率和召回率的优点,是一个联合指标,它的定义也极其简单,就是准确率和召回率的调和平均,其定义公式如下:
2 F 1 = 1 P r e c i s i o n + 1 R e c a l l \frac{2}{F1} = \frac{1}{Precision} + \frac{1}{Recall} F12=Precision1+Recall1
需要注意的是,上述论述都是针对二分类的,对于多分类问题,如果我们要考察其中某一标签的F1,那么上述的讨论也不会有任何问题,但是如果要考察所有标签的整体效果,那么上述讨论就无法顺利工作了。
对此,F1 score针对多分类问题会有两个变种的定义,分别为micro F1以及macro F1,下面,我们就来具体看一下这二者。
由上述F1的定义公式,我们有:
F 1 = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F1 = \frac{2 \times Precision \times Recall}{Precision + Recall} F1=Precision+Recall2×Precision×Recall
展开得到:
F 1 = 2 × T P 2 × T P + F P + F N F1 = \frac{2 \times TP}{2 \times TP + FP + FN} F1=2×TP+FP+FN2×TP
而对于每一个标签,我们都可以得到各自的TP、FP以及FN,我们对其进行整体的计算,即可得到micro F1的值。
其公式表达如下:
F 1 m i c r o = ∑ i 2 × T P i ∑ i ( 2 × T P i + F P i + F N i ) F1_{micro} = \frac{\sum_{i}{2 \times TP_{i}}}{\sum_{i}{(2 \times TP_{i} + FP_{i} + FN_{i})}} F1micro=∑i(2×TPi+FPi+FNi)∑i2×TPi
micro F1的优点在于其考虑了不同标签之间的数据量分布差异,因此,可以更为准确地表达整体模型在多分类问题中的性能表现;但是,其缺点同样来源其考虑了不同标签的数据量之间的差异,导致个别数据量较少的标签的性能表达将会淹没在其他标签中,无法在micro F1指标中有效的表现出来。
与micro F1不同,macro F1则是在宏观上直接暴力地对各个标签的F1指标求平均,其表达公式如下所示:
F 1 m a c r o = ∑ i F 1 i = ∑ i 2 × T P i 2 × T P i + F P i + F N i F1_{macro} = \sum_{i}{F1_{i}}= \sum_{i}{\frac{2 \times TP_{i}}{2 \times TP_{i} + FP_{i} + FN_{i}}} F1macro=i∑F1i=i∑2×TPi+FPi+FNi2×TPi
因此,和micro F1相反,macro F1指标无视标签的数据量,可以平权的表达模型各个分类标签的分类效果,但是其缺点就在于当某一标签的数据量极小时,其训练误差带来的扰动也会体现到最终的macro F1指标当中,导致最终的指标失真。
下面,我们给出Precision、Recall以及F1指标的实现代码样例。
事实上,由于上述定义是非常明晰的,因此,我们完全可以自己实现,也没啥难度,就是效率可能会低一点,然后展示效果可能差一点,但是就难度而言确实不高,这里也就不再多赘述了。
我们在这里只给出sklearn的调用代码如下:
from sklearn import metrics
metrics.classification_report(y_true, y_pred)
直接调用即可。
基于上述准确率、召回率以及F1指标的定义,我们可以引申出ROC曲线以及AUC的定义,他们可以表征某一模型针对某一分类问题的整体学习能力的强弱。
ROC全称为Receiver Operating Characteristic,他是二维平面上的一条曲线,其横轴定义为FPR(False Postive Rate: F P R = F P / ( T P + F P ) FPR = FP/(TP + FP) FPR=FP/(TP+FP)),纵轴定义为TPR(True Positive Rate: T P R = T P / ( T P + F P ) TPR = TP/(TP + FP) TPR=TP/(TP+FP)),而AUC即为ROC曲线下面的面积。
给出wiki上的图片链接如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KrGINRTK-1596873853857)(https://upload.wikimedia.org/wikipedia/commons/6/6b/Roccurves.png)]
当ROC曲线越往上凸,即AUC面积越大,则代表模型的表达能力越强。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。