使用keras实现Precise, Recall, F1-socre方式


Posted in Python onJune 15, 2020

实现过程

from keras import backend as K
def Precision(y_true, y_pred):
 """精确率"""
 tp= K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) # true positives
 pp= K.sum(K.round(K.clip(y_pred, 0, 1))) # predicted positives
 precision = tp/ (pp+ K.epsilon())
 return precision
 
def Recall(y_true, y_pred):
 """召回率"""
 tp = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) # true positives
 pp = K.sum(K.round(K.clip(y_true, 0, 1))) # possible positives
 recall = tp / (pp + K.epsilon())
 return recall
 
def F1(y_true, y_pred):
 """F1-score"""
 precision = Precision(y_true, y_pred)
 recall = Recall(y_true, y_pred)
 f1 = 2 * ((precision * recall) / (precision + recall + K.epsilon()))
 return f1

补充知识:分类问题的几个评价指标(Precision、Recall、F1-Score、Micro-F1、Macro-F1)

四个基本概念

TP、True Positive 真阳性:预测为正,实际也为正

FP、False Positive 假阳性:预测为正,实际为负

FN、False Negative 假阴性:预测与负、实际为正

TN、True Negative 真阴性:预测为负、实际也为负。

【一致判真假,预测判阴阳。】

以分类问题为例:(word公式为什么粘不过来??头疼。)

使用keras实现Precise, Recall, F1-socre方式

首先看真阳性:真阳性的定义是“预测为正,实际也是正”,这个最好理解,就是指预测正确,是哪个类就被分到哪个类。对类A而言,TP的个位数为2,对类B而言,TP的个数为2,对类C而言,TP的个数为1。

然后看假阳性,假阳性的定义是“预测为正,实际为负”,就是预测为某个类,但是实际不是。对类A而言,FP个数为0,我们预测之后,把1和2分给了A,这两个都是正确的,并不存在把不是A类的值分给A的情况。类B的FP是2,"3"和"8"都不是B类,但却分给了B,所以为假阳性。类C的假阳性个数为2。

最后看一下假阴性,假阴性的定义是“预测为负,实际为正”,对类A而言,FN为2,"3"和"4"分别预测为B和C,但是实际是A,也就是预测为负,实际为正。对类B而言,FN为1,对类C而言,FN为1。

具体情况看如下表格:

A B C 总计
TP 2 2 1 5
FP 0 2 2 4
FN 2 1 1 4

感谢这两位的指正

使用keras实现Precise, Recall, F1-socre方式

精确率和召回率

使用keras实现Precise, Recall, F1-socre方式

计算我们预测出来的某类样本中,有多少是被正确预测的。针对预测样本而言。

使用keras实现Precise, Recall, F1-socre方式

针对原先实际样本而言,有多少样本被正确的预测出来了。

套用网上的一个例子:

某池塘有1400条鲤鱼,300只虾,300只鳖。现在以捕鲤鱼为目的。撒一大网,逮着了700条鲤鱼,200只虾,100只鳖。那么,这些指标分别如下:

精确率 = 700 / (700 +200 + 100) = 70%

召回率 = 700 / 1400 =50%

可以吧上述的例子看成分类预测问题,对于“鲤鱼来说”,TP真阳性为700,FP假阳性为300,FN假阴性为700。

Precison=TP/(TP+FP)=700(700+300)=70%

Recall=TP/(TP+FN)=700/(700+700)=50%

将上述例子,改变一下:把池子里的所有的鲤鱼、虾和鳖都一网打尽,观察这些指标的变化。

精确率 = 1400 / (1400 +300 + 300) = 70%

召回率 = 1400 / 1400 =100%

TP为1400:有1400条鲤鱼被预测出来;FP为600:有600个生物不是鲤鱼类,却被归类到鲤鱼;FN为0,鲤鱼都被归类到鲤鱼类去了,并没有归到其他类。

Precision=TP/(TP+FP)=1400/(1400+600)=70%

Recall=TP/(TP+FN)=1400/(1400)=100%

其实就是分母不同,一个分母是预测为正的样本数,另一个是原来样本中所有的正样本数。

作为预测者,我们当然是希望,Precision和Recall都保持一个较高的水准,但事实上这两者在某些情况下有矛盾的。比如极端情况下,我们只搜索出了一个结果,且是正确的,那么Precision就是100%,但是Recall就很低;而如果我们把所有结果都返回,那么比如Recall是100%,但是Precision就会很低。因此在不同的场合中需要自己判断希望Precision比较高或是Recall比较高,此时我们可以引出另一个评价指标—F1-Score(F-Measure)。

F1-Score

F1分数(F1 Score),是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的精确率和召回率。F1分数可以看作是模型精确率和召回率的一种加权平均,它的最大值是1,最小值是0。(出自百度百科)

数学定义:F1分数(F1-Score),又称为平衡F分数(BalancedScore),它被定义为精确率和召回率的调和平均数。

使用keras实现Precise, Recall, F1-socre方式

更一般的,我们定义Fβ分数为:

使用keras实现Precise, Recall, F1-socre方式

除了F1分数之外,F0.5分数和F2分数,在统计学中也得到了大量应用,其中,F2分数中,召回率的权重高于精确率,而F0.5分数中,精确率的权重高于召回率。

Micro-F1和Macro-F1

最后看Micro-F1和Macro-F1。在第一个多标签分类任务中,可以对每个“类”,计算F1,显然我们需要把所有类的F1合并起来考虑。

这里有两种合并方式:

第一种计算出所有类别总的Precision和Recall,然后计算F1。

例如依照最上面的表格来计算:Precison=5/(5+4)=0.556,Recall=5/(5+4)=0.556,然后带入F1的公式求出F1,这种方式被称为Micro-F1微平均。

第二种方式是计算出每一个类的Precison和Recall后计算F1,最后将F1平均。

例如上式A类:P=2/(2+0)=1.0,R=2/(2+2)=0.5,F1=(2*1*0.5)/1+0.5=0.667。同理求出B类C类的F1,最后求平均值,这种范式叫做Macro-F1宏平均。

本篇完,如有错误,还望指正。 以上这篇使用keras实现Precise, Recall, F1-socre方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 网络编程起步(Socket发送消息)
Sep 06 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
Python 如何访问外围作用域中的变量
Sep 11 Python
python3模块smtplib实现发送邮件功能
May 22 Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
pytorch索引查找 index_select的例子
Aug 18 Python
解决Pytorch训练过程中loss不下降的问题
Jan 02 Python
Python爬虫headers处理及网络超时问题解决方案
Jun 19 Python
python 利用zmail库发送邮件
Sep 11 Python
pyqt5蒙版遮罩mask,setmask的使用
Jun 11 Python
基于python和flask实现http接口过程解析
Jun 15 #Python
基于nexus3配置Python仓库过程详解
Jun 15 #Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 #Python
在keras里面实现计算f1-score的代码
Jun 15 #Python
Python流程控制语句的深入讲解
Jun 15 #Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 #Python
python语言是免费还是收费的?
Jun 15 #Python
You might like
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
php中的ini配置原理详解
2014/10/14 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
2016/03/08 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
php抽象方法和抽象类实例分析
2016/12/07 PHP
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
python基础知识小结之集合
2015/11/25 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
Python编程argparse入门浅析
2018/02/07 Python
Python使用sort和class实现的多级排序功能示例
2018/08/15 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
python文件读取失败怎么处理
2020/06/23 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
美国隐形眼镜网上商店:Lens.com
2019/09/03 全球购物
如何写出高性能的JSP和Servlet
2013/01/22 面试题
绘画设计学生的个人自我评价
2013/09/20 职场文书
中学家长会邀请函
2014/02/03 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
2015年管理人员工作总结
2015/05/13 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS
【2·13】一图读懂中国无线电发展
2022/02/18 无线电