召回率、算法准确率和召回率、精确率

另外就是百度百科、《机器学习原理》

在分类任务下预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合,构成混淆矩阵(适用于多分类)

2、算法准确率和召回率、精确率、召回率和F值是选出目标的重要评价指标不妨先看看这些指标的定义:

(1)若一个实例是正类,但是被预测成为正类即为真正类(True Postive TP)

下表中:1代表正類,0代表负类:

FP:误报没有的匹配不正确 FN:漏报,没有找到正确匹配的数目 TN:正确的非匹配数目
  算法准确率和召回率(正确率)=所有预测正确嘚样本/总的样本 (TP+TN)/总 精确率= 将正类预测为正类 / 所有预测为正类 TP/(TP+FP) 召回率 = 将正类预测为正类 / 所有正真的正类 TP/(TP+FN) F值 = 精确率 * 召回率 * 2 / ( 精确率 + 召回率) (F 值即为精确率和召回率的调和平均值) 

在某些文章中还会出现"特异性"的概念特异性的公式是:

F1值用来综合评估精确率和召回率,它是精确率和召回率的调和均值当精确率和召回率都高时,F1值也会高

1、精确率预测结果为正例样本中真实为正例的比例(查得准)

其它分类标准,F1,反映了模型的稳健性

接受者操作特性曲线(receiver operating characteristic curve简称ROC曲线),又称为感受性曲线(sensitivity curve)它是指在特定刺激条件下,以被试茬不同判断标准下所得的虚报概率P(y/N)为横坐标以击中概率P(y/SN)为纵坐标,画得的各点的连线

ROC得名的原因在于曲线上各点反应着相同嘚感受性,它们都是对同一信号刺激的反应只不过是在击中不同的判定标准下所得的结果而已。接受者操作曲线就是以虚惊概率为横轴击中概率为纵轴所组成的坐标图,和被试在特定刺激条件下由于采用不同的判断标准得出的不同结果画出的曲线

纵轴: 真正类率(true postive rate TPR),也叫真阳性率计算公式:TP/(TP + FN),代表分类器 预测为正类中实际为正实例占 所有正实例 的比例

横轴FPR: FPR越大,预测正类中实际负类越多

理想目标:TPR=1,FPR=0即图中(0,1)点,此时ROC曲线越靠拢(0,1)点越偏离45度对角线越好。

如上图所示(a)图中实线为ROC曲线,(深绿色)线上每个点对应一个阈值(threshold)假设是二分类分类器,输出为每个实例预测为正类的概率那么通过设定一个特定阈值(threshold),预测为正类的概率值 大于等于 特定阈值的为 囸类小于 特定阈值的为 负类,然后统计TP、TN、FP、FN每个类别的数目然后根据上面的公式,就能对应的就可以算出一组 特定阈值下(FPR,TPR)的值即 茬平面中得到对应坐标点。如果这里没懂也没关系下面有详细的例子说明。

右上角的阈值最小对应坐标点(1,1);左下角阈值最大,对应坐標点为(0,0)从右上角到左下角,随着阈值的逐渐减小越来越多的实例被划分为正类,但是这些正类中同样也掺杂着真正的负实例即TPR和FPR会哃时增大。

4、分类模型评估API

在深度学习中分类任务评价指标是很重要的,一个好的评价指标对于训练一个好的模型极其关键;如果评价指标不对对于任务而言是没有意义的。

一般都是用算法准确率和召回率来作为评价指标然而对于类别不均衡的任务来说,或者在任务Φ某一个类的算法准确率和召回率非常重要如果再使用单纯的算法准确率和召回率肯定是不合理的,对任务来说 没有意义所以我们需偠一个好的评价指标来。目前一般都是用精确率召回率,F1分数来评价模型;

  y_true:类别的真实标签值类标签的列表 y_pred:预测值的标签,类标簽的列表 labels:labels: 报告中要包含的标签索引的可选列表;这个参数一般不需要设置(如果要设置比如200个类别,那么就应该如此设置:lable= range(200); 然后在sklearn.metrics.classification_report中将labels=label)可是有的时候不设置就会出错,之所以会出错是因为:比如你总共的类别为200个类但是,你的测试集中真实标签包含的类别只有199个囿一个类别缺失数据,如果不设置这个参数就会报错; target_names:与标签匹配的名称就是一个字符串列表,在报告中显示;也即是显示与labels对应的洺称 sample_weight:设置权重的参数一般不用,需要就可以用 digits:这个参数是用来设置你要输出的格式位数就是几位有效数字吧,大概就是这个意思即昰输出格式的精确度; output_dict:一般不用,好像没啥用;如果为True则将输出作为dict返回。 return:每个类别精确率与召回率 
  1. y_true 为样本真实标签y_pred 为样本预测标簽;
  2. support:当前行的类别在测试数据中的样本总量,如上表就是在class 0 类别在测试集中总数量为1;
  3. precision:精度=正确预测的个数(TP)/被预测正确的个数(TP+FP);人話也就是模型预测的结果中有多少是预测正确的
  4. recall:召回率=正确预测的个数(TP)/预测个数(TP+FN);人话也就是某个类别测试集中的总量,有多少样本预测囸确了;
  5. weighted avg:加权平均就是测试集中样本量大的,我认为它更重要给他设置的权重大点;比如第一个值的计算方法,(0.501 + 0.01 + 1.0*3)/5 = 0.70

打个赏呗您的支歭是我坚持写好博文的动力。

我本人原先是一名后端算法工程師后转为NLP算法工程师,具体负责的第一个任务就是实体识别实体识别和命名实体识别(NER)概念上的具体区别在这里简单阐述一下。我認为实体识别虽然通常不作为一个单独的概念和命名识别进行比较但是从工程的角度上两者是不同的,区别在于以下几点:

  • 研究领域不哃;命名实体识别一般用于开放领域(如:人机对话翻译),实体识别一般应用于具体的场景中(如汽车医药,电商等垂直领域)
  • 研究主体不同;一般来说,命名实体识别的任务就是识别出待处理文本中三大类(实体类、时间类和数字类)、七小类(人名、机构名、哋名、时间、日期、货币和百分比)命名实体在这里主要需要关注的是实体类,因为这是实体识别所关注的一类词在具体的领域中通瑺会有这个领域所特有的专有名词所构成的词典(医药行业的药名,汽车行业的车型、车系、品牌等)除了实体类以外的时间和数字,通常我们都可以使用正则匹配的方式来识别
  • 主要任务不同;从概念上讲命名实体识别(NER)的主要任务有两个(1)实体边界识别;(2)确萣实体类别(人名、地名、机构名或其他);而在工程实践中实体识别往往还要(3)确定“实体是什么?”这一步是两者特征上最显著嘚不同。

第三点主要任务的不同是两者从表征上讲最显著的不同,由这一点的不同出发将会延伸出不同的解决思路在这里我提供两种基本思路供大家参考:

  • 思路一:在拥有该领域标准词典的情况下,通过一定的算法一次性的划分出“疑似实体”在句子中的边界(疑似实體之间不存在边界冲突)并将“疑似实体”尝试转化为词典中的某一标准实体。
  • 思路二:在拥有该领域标准词典的情况下通过一定的算法找到句子中的所有“疑似实体”(可能存在位置冲突),再通过一定的算法将实体边界切分出来的同时转化为标准词典中的某一实体

简单说明一下,第一个思路第一步所做的就是确定(1)实体的边界通过这一步产生的实体的候选集之间边界是明确的且不存在冲突。苐二种思路的第一步是把所有可能成为实体的词都从句子中识别出来,即使他们之间存在位置冲突从第一步看,两者的区别类似于jieba分詞的精确模式和全模式之间的区别我们选择的是第二种思路,在这里再简单解释一下为什么不使用第一种思路我们来看第一种思路在笁程中的具体实践,1.通过人工标注或者自动标注的方式获得标注数据2.使用标注好的数据训练一个在该领域下的NER模型。3.通过训练好的模型對句子进行实体识别因为模型的识别结果总是不产生冲突的,我们只需要将模型的识别结果转化为对应类别下的词典中的标准实体就可鉯了

在这里我不是要具体评论哪一种思路更优,而是要提醒大家研究领域的重要性在开放领域,根本找不到满足所有实体类别的实体詞典在某一具体的垂直领域,你所在的公司或者组织往往拥有这个行业最专业和全面的实体词库而这些词库作为公司产品的护城河也昰不愿对外分享的。还有在电商领域数以亿计的商品名称,产品名称型号,编码信息无法完全被模型学习的到如果你现在要做的是某一垂直领域的实体识别,并且你所在的部门可以找到或者构建一份准确的行业字典你可以尝试思考和使用第二种思路。

下面我带领大镓重新梳理一下上文讲到的一些概念并将和大家一起探讨一下思路二如何在具体的工程中落地。首先你要确定你所在的领域,以及你昰否可以获得这样的领域的实体词词典第二步,你将如何如何将这些实体按照不同的实体类别划分和存储第三步,实体识别的主要任務是1.确定实体边界(这一步是否又可以理解为“分词”而“分词”是否又可以理解为“切词”以及“切词”之后的位置冲突解决)3. 确定實体是什么 2.确定实体类别(为什么3要放在2之前,是不是意味着我们可以先确定实体是什么再进一步的找到实体的类别)。从所讲的 1- 3 -2这样嘚解决问题的思路我们可以看出确定实体是什么?是解决整个问题的核心所在通常来讲,要解决实体是什么并不容易首先从开发的角度讲需要一个详尽并且准确的词典和一个优秀的算法。从应用场景上来讲用户的输入有些情况下是比较随意的会出现一些错误,这需偠我们的算法具有一定的纠错能力

下面我来讲解一下我们实体识别问题时所用到的核心算法——文本匹配校验算法:

用户输入错误的类型通常和他们的输入方式有关,比方说键盘输入可能会带来拼音拼写的错误五笔输入法会带来形近字的错误,语音输入又可能带来近音芓的错误文本的输入错误通常有以下几种形式:

  1. 文字错误 2. 标点错误 3. 数字错误 4. 其他字符错误
    在这几种错误中,文字错误的比例通常要占90%鉯上标点错误 占5%左右。

下面展开讲解文字错误的两种主要错误类型:

错字 (指一个汉字错成另一个汉字) 同音或近音错字:例如“传祺”?“传奇” 同形错字:例如“自己”?“自已” 编码相近错字:例如“晶”?“昌” 多字代换错误 正确字是一个错误字串是两个或哆个 正确字串是两个或多个,错误字是一个正确和错误字串都是多个 缺字错误:例如“计算机”?“计算” 加字错误:例如“逃跑”?“逃跑步” 换位错误:例如“秘密”?“密秘” 在文字替换中代换错误占80%左右缺字错误占15%左右,加字 错误占5%左右 错误类型的占比囷错误来源有关:撰写人员,输入人员输入系 统(如语音输入系统,OCR系统)

为了能够解决用户输入的句子中可能出现的各种错误情况需要我们的实体识别算法具有一定的纠错能力。基于以上推理提出文本匹配校验算法:

基于字符的编辑距离。两个中西文混合字符串 A、B 嘚基于字符的编辑距离( 简称字符距离) 等于将 A 转换为 B 需要插入、删除、替换的中文字符或英文字符的最少个数记做 D_e( A,B) 
基于拼音编码的编輯距离。记做D_p ( AB )
基于五笔编码的编辑距离。记做D_w ( AB )
得出备选实体和词典中实体的相似度
 

上面的算法解决了两个问题,一个是文本的纠错问題(在用户输入方式为语音输入时文本纠错显得尤其重要),另一个是解决了切分出的实体备选集可能是词典中的对应实体以及置信喥(由混合相似度算法的得分给出)。

这里的冲突解决有两种含义1. 如果通过匹配算法一个备选实体匹配到了词典中的多个标准实体或者备選实体对应着多个实体类别(实体冲突或者实体类别冲突)2. 不同的备选实体之间存在着位置冲突在句子里一个或几个字不可能同时属于兩个不同的词。

举两个汽车领域的例子:用户输入“宝马X”就可以对应着多个实体宝马X5/宝马X3/宝马X7多个车型或者是“宝马X”系列,这个例孓里是因为备选实体可能对应多个实体出现了实体冲突而对应的多个实体的实体类别是不同的所以有潜在的实体类别冲突;再比如说“丠京”,既可以指一个城市又可以是指一个汽车品牌这说明在我们的实体词典中一个实体词本身就是“多义词”;
实体词的位置冲突会哽加常见,如“华为p30 pro”可以看作一个词也可以看作“华为”,“P30”,”pro”按照顺序的排列组合的多种组合方式之间的位置冲突更不用说各种原因导致切分出的词语首尾出现了粘连或者全包含的情况。

按照之前的思路我们要优先解决实体是什么的问题,就必须要先解决冲突问题下面我会分成两种情况来提供不同的解决问题的方法或思路。

第一种情况:实体词典中的大部分词都对应着多个实体类别实体類别对我不重要或者我会提供额外的信息来获得实体类别。
第二种情况:实体词典中的几乎所有此词都只对应着一个实体类别实体类别對我很重要。

针对情况一可以使用递归的方式解决冲突递归的思路是:

1. 顺序优先:发生冲突时,先被识别出的实体替换掉后识别的实体
2. 长度优先:发生冲突时,长的实体可以替换掉短的实体
3. 分数优先:发生冲突时,分数高的实体可以替换掉分数低的实体
4. 2+3:发生冲突时,两个相邻的实体如果后者和前者长度相近且分数较高,后者可以替代前者 
合并重复的实体,递归直到所有切分出的字符串,在位置上不相关或者首尾相接

给出以上逻辑的一段代码仅供参考:

对于第二种情况,我们需要在解决冲突中使用更加精细的方式来处理具體的做法是在切分出句子中的实体词备选集之后,我们可以引入模型来辅助判断模型可以是通过人工标注或者自动标注训练好的模型,吔可以是引入了词典后的jieba分词
引入模型的辅助判断和刚刚介绍的递归解决的思路相比不仅可以避免递归的方式,还可以:

模型的结果结匼匹配算法的分值可以判定一个备选实体是不是匹配到的实体
模型对于实体词的切分方式具有唯一性,在存在位置冲突时可以参考模型嘚切分结果
模型对于实体类别的结果判断是唯一的,可以解决实体类目的冲突

关于规则和模型并行的实体识别方法,在实践中的实际操作是首先完善规则的实体识别算法将规则标注的实体结果用来训练模型。再通过两者并行的实体识别算法进行数据标注再次使用标紸的数据对模型进行优化,可以在最短的工期内实现整套的实体识别算法

文末,稍微补充关于匹配算法的内容一般采用Trie-tree + 词典的方式,這种方式个人经验是千万级别的词典对于字数不超过一百字的句子的实体识别时间不超过3ms如果实体词词典量级在十万词左右可以考虑使鼡Trie-tree + bk-tree + 词典的方式以保证召回率,个人经验是召回率95%覆盖率93%,一百字的句子识别时长不超过3ms这类实体识别算法主要考研的是1.实体词词典质量(词典的重要性占到80%) 2. 好的匹配算法 3. 好的冲突解决机制。匹配算法主要是考虑工程和数据结构上的能力是“多,快好,省”原则权衡下来的结果

版权声明:未经本人授权,禁止转载

正样本是指属于某一类别的样本,反样本是指不属于某一类别的样本
比如说在做字母A的图像识别字母A的样本就属于正样本,不是字母A的样本就属于负样本

由这四个概念,我们可以定义如下所示指标:

我要回帖

更多关于 算法准确率和召回率 的文章

 

随机推荐