机器学习模型评价指标(分类)

前阵子因为指标踩了很多坑,花了很多时间, 我想还是有必要总结一下, 梳理一下知识点啥的...

从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

上图是一个二分类模型针对于其中一个分类的confusion matrix. 横向是模型的预测结果, 纵列是实际分类结果. P代表二分类结果为positive(判断属于该分类), N代表结果是Negative(判断不属于该分类). 而True(T)与False(F)分别代表了预测结果与实际结果是否一致. 因此矩阵对角线上都是预测正确的结果. 需要记住的信息:

*TP(True Positive): 将属于该分类的数据正确分类到此类.

*TN(True Negative): 将不属于该分类的数据,正确排除.

*FP(False Positive): 将不属于该分类的数据, 错误分类进此类.

*FN(False Negative): 将本该属于该分类的数据, 错误排除.

而对于多分类模型来说, confusion matrix变成这样.

multil-class(3*3) 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

再借个图

而不管怎么样, 矩阵对角线依然代表了正确分类结果.

confusion matrix(分类数>3)


下面介绍模型评价指标

1. Accuracy

适用: binary, multi-class

Accuracy是在分类里最常用也是最重要的一个评价指标. 并且可以非常简单的理解成所有样本中预测正确的比例. 

Accuracy=\frac{correct}{total}

通过confusion matrix可以如此计算: Accuracy=\frac{TP+TN}{TP+TN+FP+FN}

当然并列也可能得到一个错误率errorrate.

Errorrate=\frac{FP+FN}{TP+TN+FP+FN}

简单通过Accuracy可以来评估模型的大概精度,但是没办法从中得到更细节的信息. 所以要引入其他的指标啦

2. Recall 召回率

适用:二分类模型

这里就是我踩坑的地方了. 丢公式, 对于某一个分类来讲:

Recall=\frac{TP}{TP+FN}

召回率其实就是,在分析某一类的分类结果的时候, 模型把属于该类的数据,正确分入该类的比例. 

也就是Recall = \frac{预测为此类的样本}{实际为此类的样本}

二分类模型中, 只要丢出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):

Recall=\frac{TP_A+TP_B+TP_C}{TP_A+FN_A+TP_B+FN_B+TP_C+FN_C}

这个公式仅仅是说tensorflow里自带的方法,并不是一个明确规范过的结果, 所以请看完就忘掉!!!

这也就是说, tensorflow的算法里, 在多分类模型中Acuuracy与Recall是一致的, 都是预测正确的样本占全部样本的比例.

是不是懵逼了, 要是还没有, 就继续看下面另一个更容易混淆的概念.

3. Precision

适用:二分类模型

对于二分类模型中的某一个分类来讲, 丢公式:

Precision=\frac{TP}{TP+FP}

Precision代表了对于某一个分类来说, 预测为该分类的样本中, 预测正确的样本比例.

Precision和Recall的区别: Precision的分母是预测值, Recall的分母是真实值.

同时, Precision和Recall存在一定的制衡关系. 也就是模型对于该分类越敏感, 预测为该类的样本越多, 其Recall(真实值中被正确预测的比例)相对越高, 但是Precision(预测值中正确的比例)越低. 

注意: 请不要在多分类模型里随便计算整个模型的Precision, 非要算也是跟Accuracy没有区别的


4. PR(Precision Recall) 曲线

适用:二分类模型

由于Precision与Recall之间的制衡关系, 可以利用PR曲线来寻找那个完美制衡点.也就是越靠右上越好.

binary classification PR curve

举例: 在判断肿瘤是否为良性的诊断中, 我们可能会选择Recall高的模型, 即使会牺牲掉Precision. 宁愿100个里面判断20个为恶性(其中只有10个是正确的), 也不要判断为恶性有7个, 漏了两个.

所以面临如何选择的时候, 我们引入ROC曲线.

5. ROC 曲线(Receiver Operating Characteristic Curve)

适用: 二分类模型

ROC曲线是用TP率和FP率画出的曲线

TP率其实就是二分类模型中的Recall, 也可以用来衡量模型对该分类是否敏感. 

FNrate=\frac{FP}{FP+TN}


ROC curve


理想中的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 二分类:

丢公式: Loss(Cross Entropy)=-\frac{1}{N} \sum_{i=1}^N label_i\times log(prediction_i) + (1- label_i)\times log(1-prediction_i)

其中的N代表了分类数. 也就是最后求一下平均.

而后面的交叉熵, label的是真实值, 当样本真实属于该分类时label为1, 不属于该分类时为0. prediction则为该模型对于此分类的confidence值, 是一个0到1之间的小数.

所以当样本不属于该分类时, label为0, 前半部分忽略, 后半部分计算, 则prediction值越高, loss值越高.

当样本属于该分类时, label为1, 后半部分忽略, 前半部分的prediction越高, 则loss越低.

或者for 多分类/二分类:

Loss(Cross Entropy)=-\frac{1}{N} \sum_{i=1}^N label_i\times log(prediction_i)

所以当样本不属于该分类时, label为0, 不反推.

当样本属于该分类时, label为1, prediction越高, 则loss越低. 


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,135评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,317评论 3 397
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,596评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,481评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,492评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,153评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,737评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,657评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,193评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,276评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,420评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,093评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,783评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,262评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,787评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,427评论 2 359

推荐阅读更多精彩内容