前阵子因为指标踩了很多坑,花了很多时间, 我想还是有必要总结一下, 梳理一下知识点啥的...
从classification开始说起.
只要在网上查一下分类模型评价指标, 基本都是列出accuracy, precision, recall的计算公式给我们算. 但是实际上对一个分类模型进行evaluate的时候必须要考虑到模型本身是二分类还是多分类模型. 原因是accuracy, recall这些指标在概念上并不完全通用与所有的分类模型.
二分类模型(binary classification)就是一个非黑即白的判断, 也就是只有两个分类, 不是0就是1. 而多分类模型(multi-class classification)的结果是大于2个分类的.
首先介绍一个基础概念Confusion Matrix. (借用同事的一句话, With confusion matrix you can never get confused). 其实就是一个将分类结果总结出来的一个矩阵. 看起来有点像game theory...
上图是一个二分类模型针对于其中一个分类的confusion matrix. 横向是模型的预测结果, 纵列是实际分类结果. P代表二分类结果为positive(判断属于该分类), N代表结果是Negative(判断不属于该分类). 而True(T)与False(F)分别代表了预测结果与实际结果是否一致. 因此矩阵对角线上都是预测正确的结果. 需要记住的信息:
*TP(True Positive): 将属于该分类的数据正确分类到此类.
*TN(True Negative): 将不属于该分类的数据,正确排除.
*FP(False Positive): 将不属于该分类的数据, 错误分类进此类.
*FN(False Negative): 将本该属于该分类的数据, 错误排除.
而对于多分类模型来说, confusion matrix变成这样.
对于多分类模型(分类数为N)来讲, 2*2的矩阵变成了N*N, 如上图.
当分析每个分类结果的时候, 这里的TP, TN, FP, FN的概念并没有发生变化. 但是值得注意的是, 除了TP之外每个概念的矩阵范围扩大了, 比如说对于A分类来说, TP依然是(A,A) =2 , 但是
FP=(B,A) + (C,A)=1+2=1
FN=(A,B) + (A,C)=2+0=2
TN=(B,B) +(C,C) =2+3=5
再借个图
而不管怎么样, 矩阵对角线依然代表了正确分类结果.
下面介绍模型评价指标
1. Accuracy
适用: binary, multi-class
Accuracy是在分类里最常用也是最重要的一个评价指标. 并且可以非常简单的理解成所有样本中预测正确的比例.
通过confusion matrix可以如此计算:
当然并列也可能得到一个错误率errorrate.
简单通过Accuracy可以来评估模型的大概精度,但是没办法从中得到更细节的信息. 所以要引入其他的指标啦
2. Recall 召回率
适用:二分类模型
这里就是我踩坑的地方了. 丢公式, 对于某一个分类来讲:
召回率其实就是,在分析某一类的分类结果的时候, 模型把属于该类的数据,正确分入该类的比例.
也就是
二分类模型中, 只要丢出confusion matrix, 整个模型的recall都很容易用这个公式计算得出.
而在多分类模型中, 是很容易与accuracy的计算混淆的. 在tensorflow的evaluation code里, 给出了两个指标, accuracy与recall_5. 两个都可以表示accuracy, top1和top5. 而这个recall的写法引起一些争议. 原因是在二分类模型中, 只有Positive和Negative两个分类, 因此定义是非常明确的.
而多分类模型中, TP则需要代表对于所有分类来讲预测值中正确分类的个数.
也就是说对于A分类来说是TP(正确被分类为A)的样本, 对于B分类来说是TN(正确不被分类为B).
因此在多分类模型中, 计算Recall的时候TP与FN的概念的定义是不够明确的. 但是tensorflow说他们硬要算Recall.
因此, 他们的计算方式是这样的(假设分类数为3):
这个公式仅仅是说tensorflow里自带的方法,并不是一个明确规范过的结果, 所以请看完就忘掉!!!
这也就是说, tensorflow的算法里, 在多分类模型中Acuuracy与Recall是一致的, 都是预测正确的样本占全部样本的比例.
是不是懵逼了, 要是还没有, 就继续看下面另一个更容易混淆的概念.
3. Precision
适用:二分类模型
对于二分类模型中的某一个分类来讲, 丢公式:
Precision代表了对于某一个分类来说, 预测为该分类的样本中, 预测正确的样本比例.
Precision和Recall的区别: Precision的分母是预测值, Recall的分母是真实值.
同时, Precision和Recall存在一定的制衡关系. 也就是模型对于该分类越敏感, 预测为该类的样本越多, 其Recall(真实值中被正确预测的比例)相对越高, 但是Precision(预测值中正确的比例)越低.
注意: 请不要在多分类模型里随便计算整个模型的Precision, 非要算也是跟Accuracy没有区别的
4. PR(Precision Recall) 曲线
适用:二分类模型
由于Precision与Recall之间的制衡关系, 可以利用PR曲线来寻找那个完美制衡点.也就是越靠右上越好.
举例: 在判断肿瘤是否为良性的诊断中, 我们可能会选择Recall高的模型, 即使会牺牲掉Precision. 宁愿100个里面判断20个为恶性(其中只有10个是正确的), 也不要判断为恶性有7个, 漏了两个.
所以面临如何选择的时候, 我们引入ROC曲线.
5. ROC 曲线(Receiver Operating Characteristic Curve)
适用: 二分类模型
ROC曲线是用TP率和FP率画出的曲线
TP率其实就是二分类模型中的Recall, 也可以用来衡量模型对该分类是否敏感.
而
理想中的ROC缺陷应该是平滑的, 因为通过提高敏感度, 错误率也应该是随之上升. 如果不够平滑, 有可能是发生了overfitting或者是样本不足.
当然我们的想法是TPrate越高越好,FPrate越低越好. 显然是不可能的, 因此在ROC的基础上又引入了AUC. (Area under curve) 来评价我们想要的模型.
5. AUC (Area Under Curve)
适用: 二分类模型
这个Curve当然是ROC curve. 也就是在ROC curve线下的面积, AUC越大, 代表模型越达到我们的预期. 在二分类模型中, AUC如果等于0.5, 相当于模型没有被训练, 答案是随机蒙的. 就像上面那张图是一个从原点像右上的直线. 我给他起名字叫瞎蒙直线.
但是, 怎么就要用AUC来衡量这个模型呢?
简单来想, 对于二分类模型中的其中一个分类来讲, ROC是TP率/FN率, 也就是正确分类该样本的比例以及没有被分类为该样本的比例. 在所有基础的评价指标中, Recall只能评价真实值中正确的比率, Precision只能评价预测值中正确的比率. 当样本的Positive和Negative的样本比例不均衡时, 非常难去根据Recall和Precision来衡量模型. 而在这个问题中ROC会表现的相对稳定很多.而我们想要知道被正确分类的样本大于错误被分类样本的概率,也就是我们要引入AUC的原因. AUC=0.5时相当于瞎蒙, 在roc曲线相对平滑的情况下, AUC越大, ROC曲线偏离瞎蒙直线的距离就越大, 模型学习的效果也就越好.不过如果我们只想关注Positive是否被正确预测时, 使用PR曲线是更好的选择.
6. Loss Function(损失函数)
适用: 二分类模型/多分类模型(单标签分类)
在单标签分类模型中我们一般使用交叉熵(Cross Entropy)来衡量预测结果与实际值的差别. 同时也会被用来做模型反推的标准.
for 二分类:
丢公式:
其中的N代表了分类数. 也就是最后求一下平均.
而后面的交叉熵, label的是真实值, 当样本真实属于该分类时label为1, 不属于该分类时为0. prediction则为该模型对于此分类的confidence值, 是一个0到1之间的小数.
所以当样本不属于该分类时, label为0, 前半部分忽略, 后半部分计算, 则prediction值越高, loss值越高.
当样本属于该分类时, label为1, 后半部分忽略, 前半部分的prediction越高, 则loss越低.
或者for 多分类/二分类:
所以当样本不属于该分类时, label为0, 不反推.
当样本属于该分类时, label为1, prediction越高, 则loss越低.