NLP评价性能指标
基于综述Survey on deep learning with class imbalance,以及网上找到的一些博客,总结一下NLP任务中的常用性能指标,主要以分类任务为准。
目录
混淆矩阵
对于二分类问题,标签和模型的预测结果经过组合有四种情况,将四种情况列在一个矩阵中就是混淆矩阵。
对于多分类问题,标签和模型的预测结果经过组合有n2种,情况,将其列在一个矩阵中就是混淆矩阵。以下主要以二分类的混淆矩阵为例。
FP对应第一型错误:标签是负类,但是预测为正类,可能是噪音或是故意的扰动干扰了模型
FN对应第二型错误:标签是正类,但是预测为负类,可能是模型学到的特征不足
准确率(Accuracy)和错误率(Error Rate)
正确率和错误率是在评估分类结果的时候最常用的指标。但是当处理类不平衡问题时这两个指标都是不充分的,因为实验结果由数据多的类所决定,也就是负类。当数据集中正类所占的比例只有1%时,一个把所有数据归为负类的分类器可以到达99%的准确率。当然,这样一个模型是没有实际价值的。
正确率(Precision)、召回率(Recall)、选择率(Selectivity)
- 正确率Precision衡量在标记为正类的样本中确实是正类的比例。正确率对于类不平衡数据敏感因为它考虑到了负样本中被不正确地标为正类的数量(FP)。但是只用正确率一个指标是不充分的,因为它完全没有考虑正样本中被不正确地标为负类的数量(FN)。
- 召回率Recall也叫做TPR(Ture Positive Rate),用于衡量正类样本中被模型正确标记为正类的比例。召回率不会受不平衡影响因为它只取决于正类。召回率没有考虑到负样本中被标记为正样本的数量,这在处理有许多负样本的类不平衡数据时会出现问题。
正确率和召回率之间是一个权衡,性能指标的重要性随着问题不同而变化。正确率以模型标记的正类为底,召回率以实际标签标记的正类为底。
- 选择率(Selectivity)也叫做TNR(True Negative Rate),衡量负类样本中被模型正确标记为负类的比例。相当于负类的召回率。
F1值(F-Measure)、G-Mean、Balanced Accuracy
- F-Measure,也叫做F1值,用调和平均数结合了正确率和召回率,系数β用于调整正确率和召回率的相对重要性。β一般取1。
- G-Mean,用平方根结合了TPR和TNR来衡量性能。
- Balanced Accuracy也结合TPR和TNR来计算指标以使得模型对于数据少的类更加敏感。
ROC、AUC、PR曲线
ROC
ROC(receiver operating characteristics)曲线,它绘制了TPR(召回率)和FPR(False positive rate,FPR=FP/(FP+TN))之间的关系,每个点的横坐标是FPR,纵坐标是TPR,从而创建了一个描绘被正确分类的正样本(TP)和被错误分类的负样本(FP)之间的权衡的可视化图像。
对于二值分类问题,实例的值往往是连续值,我们通过设定一个阈值,将实例分类到正类或者负类(比如大于阈值划分为正类)。因此我们可以改变阈值,根据不同的阈值进行分类,根据分类结果计算得到ROC空间中相应的点,连接这些点就形成ROC curve。 因此对于产生连续概率的模型,阈值可用于在ROC空间创建一系列的点来形成ROC曲线。
AUC
AUC(the area under the ROC curve)常用来比较模型之间的性能。AUC的值就是ROC曲线下方的那部分面积的大小,通常AUC的值介于0.5到1.0之间,较大的AUC代表了较好的性能。 加权的AUC指标,用于在计算面积的时候将成本偏好加入到考虑中。
PR曲线
PR曲线(Precision-Recall),ROC曲线可能会在高度偏斜的数据集上显示过于乐观的结果,在这种情况下,应该用Precision-Recall(PR)曲线来代替ROC曲线。P指的是正确率,R指的是召回率,一般情况下把召回率设为横坐标,正确率设为纵坐标。
通过选择不同的阈值进行不同的计算,一条模型对应多个阈值得到一条曲线。性能通过曲线下方的面积大小进行比较,更常用的是平衡点F1,平衡点是P=R时的取值。刚好就是β为1时的F1值。
微观与宏观指标
在n个二分类混淆矩阵上综合考虑正确率和召回率
宏macro-F1:在各混淆矩阵上分别计算正确率和召回率,再计算平均值
微micro-F1:先将各混淆矩阵的对应元素取平均,再基于这些平均值计算F1值。
参考文献和博客
综述:Survey on deep learning with class imbalance
博客:
原文地址:https://www.cnblogs.com/erable/p/15058593.html
- java 中的异步回调
- 澳大利亚域名管理机构多年敲竹杠?
- ASP.NET中使用HttpWebRequest调用WCF
- scala 学习笔记(06) OOP(下)多重继承 及 AOP
- Angular企业级开发(4)-ngResource和REST介绍
- CSS魔法堂:"那不是bug,是你不懂我!" by inline-block
- scala 学习笔记(03) 参数缺省值、不定个数参数、类的属性(Property)、泛型初步
- Cmd Markdown编辑器简明语法手册
- 如何让spring mvc web应用启动时就执行特定处理
- CSS魔法堂:小结一下Box Model与Positioning Scheme
- jboss EAP 6.2+ 通过代码控制JNDI数据源
- jboss CLI 命令行接口学习(适用JBOSS EAP 6.2+)
- WebComponent魔法堂:深究Custom Element 之 面向痛点编程
- 修复bootstrap daterangepicker中的3个问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法