博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
召回率与精确率
阅读量:7039 次
发布时间:2019-06-28

本文共 2727 字,大约阅读时间需要 9 分钟。

工业界往往会根据实际的业务场景拟定相应的业务指标。本文旨在一起学习比较经典的三大类评价指标,其中第一、二类主要用于分类场景、第三类主要用于回归预测场景,基本思路是从概念公式,到优缺点,再到具体应用(分类问题,本文以二分类为例)。

1.准确率P、召回率R、F1 值

定义 准确率(Precision):P=TP/(TP+FP)。通俗地讲,就是预测正确的正例数据占预测为正例数据的比例。

召回率(Recall)也叫查全率,可以认为查得全不全:R=TP/(TP+FN)。通俗地讲,就是预测为正例的数据占实际为正例数据的比例
F1值(F score):
思考
正如下图所示,F1的值同时受到P、R的影响,单纯地追求P、R的提升并没有太大作用。在实际业务工程中,结合正负样本比,的确是一件非常有挑战的事。
图像展示

下面附上源码

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmfig = plt.figure()ax = fig.add_subplot(111,projection='3d')x = np.linspace(0,1,100)p,r = np.meshgrid(x,x) #meshgrid函数创建一个二维的坐标网络z = 2*p*r/(p+r)ax.plot_surface(x,y,z,rstride=4,cstride=4,cmap=cm.YlGnBu_r)ax.set_title('F1') #标题ax.set_xlabel('precision') #x轴标签ax.set_ylabel('recall') #y轴标签plt.show()

 

2.ROC、AUC
概念
TPR=TP/(TP+FN)=TP/actual positives
FPR=FP/(FP+TN)=FP/actual negatives
ROC是由点(TPR,FPR)组成的曲线,AUC就是ROC的面积。AUC越大越好。
一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting
图像展示

附上代码

library(ROCR)p=c(0.5,0.6,0.55,0.4,0.7)y=c(1,1,0,0,1)pred = prediction(p, y)perf = performance(pred,"tpr","fpr")plot(perf,col="blue",lty=3, lwd=3,cex.lab=1.5, cex.axis=2, cex.main=1.5,main="ROC plot")

 

python版本计算AUC

from sklearn import metricsdef aucfun(act,pred):fpr, tpr, thresholds = metrics.roc_curve(act, pred, pos_label=1)return metrics.auc(fpr, tpr)

 

直接利用AUC优化分类任务(R语言版)
下面是代码

#生成训练数据set.seed(1999)x1 = rnorm(1000) x2 = rnorm(1000)z = 1 + 2*x1 + 3*x2 pr = 1/(1+exp(-z)) y = rbinom(1000,1,pr)#使用logloss作为训练目标函数df = data.frame(y=y,x1=x1,x2=x2)glm.fit=glm( y~x1+x2,data=df,family="binomial")#下面使用auc作为训练目标函数library(ROCR)CalAUC <- function(real,pred){rocr.pred=prediction(pred,real)rocr.perf=performance(rocr.pred,'auc')as.numeric(rocr.perf@y.values)}#初始值beta0=c(1,1,1)loss <- function(beta){z=beta[1]+beta[2]*x1+beta[3]*x2pred=1/(1+exp(-z))-CalAUC(y,pred)}res=optim(beta0,loss,method = "Nelder-Mead",control = list(maxit = 100))

 

3.PRC、ROC比较
AUC是ROC的积分(曲线下面积),是一个数值,一般认为越大越好,数值相对于曲线而言更容易当做调参的参照。
PR曲线会面临一个问题,当需要获得更高recall时,model需要输出更多的样本,precision可能会伴随出现下降/不变/升高,得到的曲线会出现浮动差异(出现锯齿),无法像ROC一样保证单调性。
在正负样本分布得极不均匀(highly skewed datasets)的情况下,PRC比ROC能更有效地反应分类器的好坏。
4.mape平均绝对百分误差
定义

技巧

在sklearn中,对于回归任务,一般都提供了mse损失函数(基于树的模型除外)。但有时我们会遇到sklearn中没有定义的损失函数,那么我们可以自定重写模型或者定义函数,下面以xgboost为模型,mape作为损失函数为例(grad、hess分别对应损失函数一阶导、二阶导)。
代码

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dfrom matplotlib import cmfig = plt.figure()ax = fig.add_subplot(111,projection='3d')x = np.linspace(0,1,100)p,r = np.meshgrid(x,x) #meshgrid函数创建一个二维的坐标网络z = 2*p*r/(p+r)ax.plot_surface(x,y,z,rstride=4,cstride=4,cmap=cm.YlGnBu_r)ax.set_title('F1') #标题ax.set_xlabel('precision') #x轴标签ax.set_ylabel('recall') #y轴标签plt.show()

 

转载于:https://www.cnblogs.com/echoboy/p/9933073.html

你可能感兴趣的文章
【cocos2d-x 3.x 学习笔记】对象内存管理
查看>>
T-SQL编程中的异常处理-异常捕获(try catch)与抛出异常(throw)
查看>>
微信小程序,前端大梦想(六)
查看>>
tomcat设置编码格式utf8
查看>>
sql中一列拆成两列
查看>>
让人恼火的经历——手机H5网页被注入广告
查看>>
LInq之Take Skip TakeWhile SkipWhile Reverse Union Concat 用法
查看>>
spring装配集合
查看>>
mysql高可用架构方案之中的一个(keepalived+主主双活)
查看>>
SpringMVC案例2----基于spring2.5的注解实现
查看>>
SpringBoot编写自定义的starter 专题
查看>>
北京服务业占GDP比重达81.7%
查看>>
2016年深圳市服务业占GDP比重首次突破六成
查看>>
Oracle基础(四)pl/sql
查看>>
Woody的Python学习笔记2
查看>>
虚函数相关问题分析
查看>>
js代码从页面移植到文件里失效或js代码改动后不起作用的解决的方法
查看>>
java点滴之volatilekeyword特性
查看>>
python 回溯法 子集树模板 系列 —— 13、最佳作业调度问题
查看>>
java位运算应用
查看>>