使用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 获取文件列表(或是目录例表)
Mar 25 Python
Python 多线程抓取图片效率对比
Feb 27 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
pycharm远程调试openstack代码
Nov 21 Python
基于anaconda下强大的conda命令介绍
Jun 11 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
python基于property()函数定义属性
Jan 22 Python
Python如何把多个PDF文件合并代码实例
Feb 13 Python
python实现随机加减法生成器
Feb 24 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
Apr 27 Python
Python flask路由间传递变量实例详解
Jun 03 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 或网站服务器日志,并正确配置 PHP 安装最快的解决办法
2010/08/01 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
PHP利用递归函数实现无限级分类的方法
2019/03/22 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
javaScript call 函数的用法说明
2010/04/09 Javascript
JS俄罗斯方块,包含完整的设计理念
2010/12/11 Javascript
checkbox使用示例
2013/08/23 Javascript
js的正则test,match,exec详细解析
2014/01/29 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
BootStrapValidator校验方式
2016/12/19 Javascript
详解Nodejs的timers模块
2016/12/22 NodeJs
react.js 翻页插件实例代码
2017/01/19 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
vue中导出Excel表格的实现代码
2018/10/18 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
多个应用共存的Django配置方法
2018/05/30 Python
mac下如何将python2.7改为python3
2018/07/13 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
什么是组件架构
2016/05/15 面试题
UNIX文件系统分类
2014/11/11 面试题
3分钟演讲稿
2014/04/30 职场文书
商铺门面租房协议书
2014/10/21 职场文书
工作失职自我检讨书
2015/05/05 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python