Tensorflow-tf-metrics

作为一名小白中的小白(苦笑脸),澜子的每一步都走得艰难万分(哭),好在身边还是有很靠谱的小伙伴能给我很多帮助,能让我艰难且缓慢无比的进度得到不小的提升。
所以,对于最近踩坑很多的 tf.metrics,特地记录一下。
当然,如果大噶发现博客中我理解过程中的任何错误,一定记得告诉我啊,这样才能更好地进步哇。

之所以会接触到这个API,是因为最近在做一个二分类的问题,然后希望用多个评价指标包括:召回率(Recall),精确率(Precision),F_Score,AUC对模型进行综合评估,而不仅仅只是准确率(Accuracy) 的单一指标。

评价指标简介

混淆矩阵

混淆矩阵是理解众多评价指标的基础。先贴一张图,经典的混淆矩阵是长这个样子滴。

理解混淆矩阵以及下文所涉及到的其他的评价指标之前,我们首先要了解一下 TP,FP,TN,FN 这四个被广泛应用于二分类评价中的基本概念。这一篇文章 图文并茂,解释得很不错,我也截取了几张很好看的图,会依次出现在后续的文章中。下图便很好地解释了四个基本概念。

  • TP:True Positive,预测为正例,实际也为正例。
  • FP:False Positive,预测为正例,实际却为负例。
  • TN:True Negative,预测为负例,实际也为负例。
  • FN:False Negative,预测为负例,实际却为正例。

准确率(Accuracy)

首先上图一张,颜值即正义,有这么好看的图,应该很好理解其中的含义吧。准确率 即指所有预测正确的样本(无论预测的是正例还是负例)占所有样本的比例。

精确率(Precision)

高颜值的美图继续。精确率就是指 当前划分到正样本类别中,被正确分类的比例,即真正的正样本所占所有预测为正样本的比例。

其实我自己在没有真正运用这些指标之前,并不是很理解其中的含义。针对我自己这段时间的经历,我的理解是 运用精确率,可以发现模型的潜在问题:比如我自己第一个尝试的模型,就出现了模型的预测输出一直为零的情况。但是,由于我之前并没有加入精确率的指标,只关注了模型的准确率,导致模型的准确率结果虽然有90%,但是精确率出现了NAN

我自己分析出现这个结果的原因是:第一,样本的数据量很大且比较稀疏;第二,小白如我在数据预处理方面做得很糟糕,导致数据分布就很不合理,也就意味着会出现 一个batch里面label中0的数量远大于1,进而模型一直在学0的情况。而我们如果仅仅只看准确率,模型似乎没有那么糟糕,然而其实模型的效果是很差的,准确率没有很低只是因为batch本身比较稀疏,所以就算模型输出一直是零,也不会出现很低的准确率。那么,有了 精确率 就够了吗?当然不是,我们接着看一个简单的例子。

比如:我们有一个样本数量为50的数据集,其中正样本的数量为20。但是,在我们所有的预测结果中,只预测出了一个正样本,并且这个样本也确实是正样本,那么 TP=1,FP=0,Precision = TP/(TP+FP) = 1.0,那么我们的模型是不是就很好了呢?当然不是,我们还有19个正样本都没有预测成功呢。所以,是时候使出 召回率 这一绝招啦。

召回率(Recall)

美图接着上。召回率即指 当前被分到正样本类别中,真实的正样本占所有正样本的比例,即召回了多少正样本的比例。

接着上文继续说,精确率和召回率之间存在着什么关系呢?我们当然希望 Precision 和 Recall 的值越高越好。在上文的例子中,我们得到模型的精确率为1,但并不表示模型就很好,因为 FN=19,可以得到 召回率 Recall = TP/(TP+FN)= 0.05。所以,如果仅仅只靠精确率,显然也是不够的。

那么问题又来了,有没有一个能够结合两者的评价指标呢?必杀技 F_Score 来也。

F_Score

此处没有美图了。F_Score其实就是 Precision和 Recall的加权调和平均:

$$\ F= \frac{(\alpha^2+1)P*R}{\alpha^2)(P+R)}$$

当 $\alpha = 1$ 时,即是我们最常用的F1_Score

$$\ F_1= \frac{2PR}{(P+R)}$$

因为 $ F_1$ 综合了 Precision 和 Recall 的结果,所以当 $F_1$ 或者 F_Score 较高时,说明结果较为理想。

AUC(Area under the ROC curve)

呜啦啦,我最近涉及到的最后一个指标啦。在介绍AUC之前,首先要了解什么是 ROC曲线,他是这个样子滴。ROC曲线上的每一个点对应于一个 threshold,对于一个分类器,每个threshold下会有一个TPR和FPR

这里的 threshold怎么理解呢?举一个简单的例子:对于某个二分类分类器来说,输出结果 是0还是1,往往取决于输出的概率以及预定的概率阈值,比如常见的阈值就是0.5,大于0.5的认为是正样本,小于0.5的认为是负样本。

  • 横轴:False Positive Rate(假阳率,FPR)
  • 纵轴:True Positive Rate(真阳率,TPR)

理解了 ROC曲线之后,AUC就很好理解啦,其指的就是ROC曲线包围的面积啦,也就是图中的绿色部分。
ROC曲线一定程度上可以反映分类器的分类效果,但是不够直观,我们希望有一个直观的指标,我们可以通过观察其数值的大小,直接判断分类器的分类性能,于是AUC横空出世啦。AUC可以直观地反映了ROC曲线表达的分类能力。

  • AUC = 1,代表完美分类器
  • 0.5 < AUC < 1,优于随机分类器
  • 0 < AUC < 0.5,差于随机分类器

好气哦,每次总是越写越多(苦笑脸),正文还没有写,就已经七七八八敲了一堆,澜子要去赶车了,正文放在下一篇继续。

大噶发现错误或者什么我理解得不对的地方,一定要告诉我啊,不能让我一直瞎写啊。