推荐系统遇上深度学习(九)--评价指标AUC原理及实践

2301_77724032 2023-06-10 15:13:25
作者:石晓文 Python爱好者社区专栏作者个人公众号:小小挖掘机 博客专栏: wenwen

引言

CTR问题我们有两种角度去理解,一种是分类的角度,即将点击和未点击作为两种类别。另一种是回归的角度,将点击和未点击作为回归的值。不管是分类问题还是回归问题,一般在预估的时候都是得到一个[0,1]之间的概率值,代表点击的可能性的大小。

如果将CTR预估问题当作回归问题,我们经常使用的损失函数是MSE;如果当作二分类问题,我们经常使用的损失函数是LogLoss。而对于一个训练好的模型,我们往往需要评估一下模型的效果,或者说泛化能力,MSE和LogLoss当然也可以作为我们的评价指标,但除此之外,我们最常用的还是AUC。

说了这么多,我们还不知道AUC是什么呢?不着急,我们从二分类的评估指标慢慢说起,提醒一下,本文二分类的类别均为0和1,1代表正例,0代表负例。

1、从二分类评估指标说起

1.1 混淆矩阵

我们首先来看一下混淆矩阵,对于二分类问题,真实的样本标签有两类,我们学习器预测的类别有两类,那么根据二者的类别组合可以划分为四组,如下表所示:

上表即为混淆矩阵,其中,行表示预测的label值,列表示真实label值。TP,FP,FN,TN分别表示如下意思:

TP(true positive):表示样本的真实类别为正,最后预测得到的结果也为正;FP(false positive):表示样本的真实类别为负,最后预测得到的结果却为正;FN(false negative):表示样本的真实类别为正,最后预测得到的结果却为负;TN(true negative):表示样本的真实类别为负,最后预测得到的结果也为负.

可以看到,TP和TN是我们预测准确的样本,而FP和FN为我们预测错误的样本。

1.2 准确率Accruacy

准确率表示的是分类正确的样本数占样本总数的比例,假设我们预测了10条样本,有8条的预测正确,那么准确率即为80%。

用混淆矩阵计算的话,准确率可以表示为:

虽然准确率可以在一定程度上评价我们的分类器的性能,不过对于二分类问题或者说CTR预估问题,样本是极其不平衡的。对于大数据集来说,标签为1的正样本数据往往不足10%,那么如果分类器将所有样本判别为负样本,那么仍然可以达到90%以上的分类准确率,但这个分类器的性能显然是非常差的。

1.3 精确率Precision和召回率Recall

为了衡量分类器对正样本的预测能力,我们引入了精确率Precision和召回率Recall。

精确率表示预测结果中,预测为正样本的样本中,正确预测为正样本的概率;召回率表示在原始样本的正样本中,最后被正确预测为正样本的概率;

二者用混淆矩阵计算如下:

精确率和召回率往往是一对矛盾的指标。在CTR预估问题中,预测结果往往表示会被点击的概率。如果我们对所有的预测结果进行降序排序,排在前面的是学习器认为最可能被点击的样本,排在后面的是学习期认为最不可能被点击的样本。

如果我们设定一个阈值,在这个阈值之上的学习器认为是正样本,阈值之下的学习器认为是负样本。可以想象到的是,当阈值很高时,预测为正样本的是分类器最有把握的一批样本,此时精确率往往很高,但是召回率一般较低。相反,当阈值很低时,分类器把很多拿不准的样本都预测为了正样本,此时召回率很高,但是精确率却往往偏低。

1.4 F-1 Score

为了折中精确率和召回率的结果,我们又引入了F-1 Score,计算公式如下:

对于F1 Score有很多的变化形式,感兴趣的话大家可以参考一下周志华老师的西瓜书,我们这里就不再介绍了。

1.5 ROC与AUC

在许多分类学习器中,产生的是一个概率预测值,然后将这个概率预测值与一个提前设定好的分类阈值进行比较,大于该阈值则认为是正例,小于该阈值则认为是负例。如果对所有的排序结果按照概率值进行降序排序,那么阈值可以将结果截断为两部分,前面的认为是正例,后面的认为是负例。

我们可以根据实际任务的需要选取不同的阈值。如果重视精确率,我们可以设定一个很高的阈值,如果更重视召回率,可以设定一个很低的阈值。

到这里,我们会抛出两个问题:1)设定阈值然后再来计算精确率,召回率和F1-Score太麻烦了,这个阈值到底该设定为多少呢?有没有可以不设定阈值来直接评价我们的模型性能的方法呢?

2)排序结果很重要呀,不管预测值是多少,只要正例的预测概率都大于负例的就好了呀。

没错,ROC和AUC便可以解决我们上面抛出的两个问题。

ROC全称是“受试者工作特征”,(receiver operating characteristic)。我们根据学习器的预测结果进行排序,然后按此顺序逐个把样本作为正例进行预测,每次计算出两个重要的值,分别以这两个值作为横纵坐标作图,就得到了ROC曲线。

这两个指标是什么呢?是精确率和召回率么?并不是的,哈哈。

ROC曲线的横轴为“假正例率”(True Positive Rate,TPR),又称为“假阳率”;纵轴为“真正例率”(False Positive Rate,FPR),又称为“真阳率”,

假阳率,简单通俗来理解就是预测为正样本但是预测错了的可能性,显然,我们不希望该指标太高。

真阳率,则是代表预测为正样本但是预测对了的可能性,当然,我们希望真阳率越高越好。

ROC计算过程如下:1)首先每个样本都需要有一个label值,并且还需要一个预测的score值(取值0到1);2)然后按这个score对样本由大到小进行排序,假设这些数据位于表格中的一列,从上到下依次降序;3)现在从上到下按照样本点的取值进行划分,位于分界点上面的我们把它归为预测为正样本,位于分界点下面的归为负样本;4)分别计算出此时的TPR和FPR,然后在图中绘制(FPR, TPR)点。

说这么多,不如直接看图来的简单:

AUC(area under the curve)就是ROC曲线下方的面积,如下图所示,阴影部分面积即为AUC的值:

AUC量化了ROC曲线表达的分类能力。这种分类能力是与概率、阈值紧密相关的,分类能力越好(AUC越大),那么输出概率越合理,排序的结果越合理。

在CTR预估中,我们不仅希望分类器给出是否点击的分类信息,更需要分类器给出准确的概率值,作为排序的依据。所以,这里的AUC就直观地反映了CTR的准确性(也就是CTR的排序能力)。

终于介绍完了,那么这个值该怎么计算呢?

2、AUC的计算

关于AUC的计算方法,如果仅仅根据上面的描述,我们可能只能想到一种方法,那就是积分法,我们先来介绍这种方法,然后再来介绍其他的方法。

2.1 积分思维

auc = 0.0height = 0.0for each training example x_i, y_i:  if y_i = 1.0:    height = height + 1/(tp+fn)  else     auc +=  height * 1/(tn+fp)return auc

每一个HTML文档中,都有一个不可或缺的标签:<head>,在几乎所有的HTML文档里, 我们都可以看到类似下面这段代码:

html{color:#000;overflow-y:scroll;overflow:-moz-scrollbars}
body,button,input,select,textarea{font-size:12px;font-family:Arial,sans-serif}
h1,h2,h3,h4,h5,h6{font-size:100%}
em{font-style:normal}
small{font-size:12px}
ol,ul{list-style:none}
a{text-decoration:none}
a:hover{text-decoration:underline}
legend{color:#000}
fieldset,img{border:0}
button,input,select,textarea{font-size:100%}
table{border-collapse:collapse;border-spacing:0}
img{-ms-interpolation-mode:bicubic}
textarea{resize:vertical}
.left{float:left}
.right{float:right}
.overflow{overflow:hidden}
.hide{display:none}
.block{display:block}
.inline{display:inline}
.error{color:red;font-size:12px}
button,label{cursor:pointer}
.clearfix:after{content:'\20';display:block;height:0;clear:both}
.clearfix{zoom:1}
.clear{clear:both;height:0;line-height:0;font-size:0;visibility:hidden;overflow:hidden}
.wordwrap{word-break:break-all;word-wrap:break-word}
.s-yahei{font-family:arial,'Microsoft Yahei','微软雅黑'}
pre.wordwrap{white-space:pre-wrap}
body{text-align:center;background:#fff;width:100%}
body,form{position:relative;z-index:0}
td{text-align:left}
img{border:0}
#s_wrap{position:relative;z-index:0;min-width:1000px}
#wrapper{height:100%}
#head .s-ps-islite{_padding-bottom:370px}
#head_wrapper.s-ps-islite{padding-bottom:370px}#head_wrapper.s-ps-islite #s_lm_wrap{bottom:298px;background:0 0!important;filter:none!important}#head_wrapper.s-ps-islite .s_form{position:relative;z-index:1}#head_wrapper.s-ps-islite .fm{position:absolute;bottom:0}#head_wrapper.s-ps-islite .s-p-top{position:absolute;bottom:40px;width:100%;height:181px}#head_wrapper.s-ps-islite #s_lg_img,#head_wrapper.s-ps-islite#s_lg_img_aging,#head_wrapper.s-ps-islite #s_lg_img_new{position:static;margin:33px auto 0 auto}.s_lm_hide{display:none!important}#head_wrapper.s-down #s_lm_wrap{display:none}.s-lite-version #m{padding-top:125px}#s_lg_img,#s_lg_img_aging,#s_lg_img_new{position:absolute;bottom:10px;left:50%;margin-left:-135px}<head><meta charset=utf-8><meta http-equiv=content-type content=text/html; charset=utf-8><meta name=renderer content=webkit/><meta name=force-rendering content=webkit/><meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1/><metahttp-equiv=Content-Typecontent=www.czjy.cn;charset=gb2312><meta name=viewport content=width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no></head>.s-ps-sug table{width:100%;background:#fff;cursor:default}.s-ps-sug td{color:#000;font:14px arial;height:25px;line-height:25px;padding:0 8px}.s-ps-sug td b{color:#000}.s-ps-sug .mo{background:#ebebeb;cursor:pointer}.s-ps-sug .ml{background:#fff}.s-ps-sug td.sug_storage{color:#7a77c8}.s-ps-sug td.sug_storage b{color:#7a77c8}.s-ps-sug .sug_del{font-size:12px;color:#666;text-decoration:underline;float:right;cursor:pointer;display:none}.s-ps-sug .sug_del{font-size:12px;color:#666;text-decoration:underline;float:right;cursor:pointer;display:none}.s-ps-sug .mo .sug_del{display:block}
.s-ps-sug .sug_ala{border-bottom:1px solid #e6e6e6}

head标签作为一个容器,主要包含了用于描述 HTML 文档自身信息(元数据)的标签,这些标签一般不会在页面中被显示出来。

...全文
188 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

624

社区成员

发帖
与我相关
我的任务
社区描述
主要分享大数据用的知识,包括开发语言,以及最新行业发展动向等,欢迎大家一起来交流
大数据数据仓库database 个人社区 北京·门头沟区
社区管理员
  • 80后大叔爱学习
  • Code Writers
  • 董可伦
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧