分类模型的评价指标:Precision,Recall和Accuracy

分类模型的性能(Performance)

分类问题是当前机器学习、深度学习领域最为常见的问题,各式各样的模型种类繁多。

如何评价这些模型的优劣呢?自然要做测试:

  • 首先,准备好一些已知其真实分类的样本;
  • 然后,用分类模型对它们进行分类;
  • 最后,将分类模型预测(predict)或者推断(inference)的结果与实际情况相比较,以预测/推断结果与真实的符合程度为依据来评价分类模型的性能(performance)。

既然要判断程度,就必然会用到能够描述“多少”的数值型指标。今天我们就要介绍几种分类模型最常用的评价指标。

二分类模型的指标

我们先从最基础的二分类模型说起。

所有的二分类模型做预测/推断的结果都只能两个:阳性(Positive,即正例)和阴性(Negative,即负例)。

二分类模型最常用的指标是:精准率(Precision)召回率(Recall)。

对于一个测试样本,它本身有一个真实分类(阳性或者阴性)。将其输入给二分类模型后,模型会给它打一个标签——要么阳性,要么阴性。

样本的真实分类和预测分类可能一致也可能不一致,总之会形成一个两两正交的情况,如下:

预测结果为阳性 (Positive)

预测结果为阴性 (Negative)

预测结果是真实的 (True)

TP:实际为Positive,也被预测为Positive的样本数

TN:实际为Negative,也被预测为Negative的样本数

预测结果是虚假的 (False)

FP:实际为Negative,但被预测为Positive的样本数

FN:实际为Positive,但被预测为Negative的样本数

精准率:Precision=TP / (TP+FP),即在所有被预测为阳性的测试数据中,真正是阳性的比率。

召回率:Recall=TP / (TP+FN),即在所有实际为阳性的测试数据中,真正是阳性的比率。

为了综合这两个指标并得出量化结果,又发明了F1Score

F1Score = 2*(Precision * Recall) / (Precision + Recall)

显然上面三个值都是越大越好,但往往在实际当中P和R是矛盾的,很难保证双高。

除了精准率和召回率,还有一个准确率(Accuracy),可以用来评估分类模型。

准确率指分类模型预测正确的结果在整体中的占比例。

Accuracy = 预测正确的样本数 / 所有样本数

二分类模型的Accuracy = (TP+TN) / (TP+TN+FP+FN) = (TP+TN) / Count(Samples)

多分类模型的指标

多分类模型的预测结果有多种类型,而不只是正例(阳性)和负例(阴性)两种。

虽然如此,前面说的Precision,Recall和Accuracy同样适用于多分类问题。

假设一个分类模型能预测N个分类:{Class1, Class2, ..., ClassN}.

每一个特定的测试样本都有一个真实的分类,经过模型预测后,又会有一个预测分类。

假设样本x1的真实分类是Class1,它的预测结果有N种可能({Class1, Class2, ..., ClassN}中的任何一个)。

但是不管预测结果如何,从预测与真实的符合程度来看,只有两种可能:预测正确(被预测为Class1),和预测错误(被预测为Class1之外的任何一类)。

当一个测试集全部被预测完之后,会有一些实际是Class1的样本被预测为其他类,也会有一些其实不是Class1的样本,被预测成Class1,这样的话就导致了下面这个结果:

预测结果为Class1(Positive)

预测结果为非Class1(Negtive)

预测结果是真实的(True)

Class1_TP:实际为Class1,也被预测为Class1的样本数

Class1_TN:实际不是Class1,也被测试为其他类(非Class1)的样本数

预测结果是虚假的(False)

Class1_FP:实际不是Class1,但被预测为Class1的样本数

Class1_FN:实际为Class1,但被预测为其他类(非Class1)的样本数

根据上表,我们就可以计算:

Class1的精准率:Class1_Precision = Class1_TP/(Class1_TP+Class1_FP),即在所有被预测为Class1的测试数据中,预测正确的比率。

Class1的召回率:Class1_Recall = Class1_TP/(Class1_TP+Class1_FN),即在所有实际为Class1的测试数据中,预测正确的比率。

Class1的F1Score: Class1_F1Score = 2 * (Class1_Precision * Class1_Recall) / (Class1_Precision + Class1_Recall)

同理,Class1的准确率:Class1_Accuracy = (Class1_TP + Class1_TN) / count(Samples)

一个多分类模型指标计算的例子

下面我们用一个例子来说明一下多分类模型的几种指标的计算。具体数据如下表:

Actual_Class1

Actual_Class2

Actual_Class3

Total_Precdicted

Predicted_Class1

30

20

10

60

Predicted_Class2

50

60

10

120

Predicted_Class3

20

20

80

120

Total_Actual

100

100

100

可以看出,分类器一共可分出三个类:Class1,Class2和Class3;测试样本一共有300个;测试样本中三个类是平均分布的。

然后,针对这三个类,我们用下面四种颜色分别标注出它们各自对应的TP,TN,FP和FN:

TP

TN

FP

FN

Class1

Actual_Class1

Actual_Class2

Actual_Class3

Predicted_Class1

30

20

10

Predicted_Class2

50

60

10

Predicted_Class3

20

20

80

Class1_TP = 30

Class1_TN = 60 + 10 + 20 + 80 = 170

Class1_FP = 20 + 10 = 30

Class1_FN = 50 + 30 = 70

Class1_Precision = 30 / 60 = 0.5

Class1_Recall = 30 / 100 = 0.3

Class1_Accurancy = (30 + 170) / 300 = 0.67

Class2

Actual_Class1

Actual_Class2

Actual_Class3

Predicted_Class1

30

20

10

Predicted_Class2

50

60

10

Predicted_Class3

20

20

80

Class2_TP = 60

Class2_TN = 30 + 10 + 20 + 80 = 140

Class2_FP = 50 + 10 = 60

Class2_FN = 20 + 20 = 40

Class2_Precision = 60 / 120 = 0.5

Class2_Recall = 60 / 100 = 0.6

Class2_Accurancy = (60 + 140 ) / 300 = 0.67

Class3

Actual_Class1

Actual_Class2

Actual_Class3

Predicted_Class1

30

20

10

Predicted_Class2

50

60

10

Predicted_Class3

20

20

80

Class3_TP = 80

Class3_TN = 30 + 20 + 50 + 60 = 160

Class3_FP = 20 + 20 = 40

Class3_FN = 10 + 10 = 20

Class3_Precision = 80 / 120 = 0.67

Class3_Recall = 80 / 100 = 0.8

Class3_Accurancy = (80 + 160) / 300 = 0.8

多分类模型的整体性能

当我们评估一个多分类模型的时候,一般不会用具体某一个类的Precision,Recall或者Accuracy去对其进行评价,而是会用一个数值来代表整体性能。

通常会用到的指标是整体准确率。我们可能会想,整体正确率就是对所有类的Accuracy求均值或者加权求均值。

但是实际上,有一个更直接更方面的方法:

Overall Accuracy = 各类被预测对了的样本数量的累加 / 样本总数 = sum (class_i_TP) / count(Samples)

比如上面的例子里,Overall Accuracy = (30 + 60 + 80) / 300 = 0.57

指标和数据绑定

需要注意的是,所有的性能指标:Precision,Recall,Accuracy等,都和具体的测试数据有关。

同样的模型,换一套测试数据后,很可能某一类,甚至所有类的P,R,A会有所变化。

有变化是一正常的,但如果这种变化超过了一定幅度,就要考虑是否存在bias或者overfitting的情况。

原文发布于微信公众号 - 悦思悦读(yuesiyuedu)

原文发表时间:2018-09-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习自然语言处理

基于attention的seq2seq机器翻译实践详解

理理思路 文本处理,这里我是以eng_fra的文本为例,每行是english[tab]french,以tab键分割。获取文本,清洗。 分别建立字典,一个engl...

5306
来自专栏PPV课数据科学社区

【工具】SAS 常用函数汇总

? 一、数学函数 ABS(x) 求x的绝对值。 MAX(x1,x2,…,xn) 求所有自变量中的最大一个。 MIN(x1,x2,…,xn) 求所有自变量...

2673
来自专栏ATYUN订阅号

如何在Python和numpy中生成随机数

随机性的使用是机器学习算法配置和评估的重要部分。从神经网络中的权重的随机初始化,到将数据分成随机的训练和测试集,再到随机梯度下降中的训练数据集的随机混洗(ran...

2773
来自专栏大数据挖掘DT机器学习

CART算法学习及代码实现

1.算法介绍 分类回归树算法:CART(Classification And Regression Tree)算法采用一种二分递归分割的技术,将当前的样...

4724
来自专栏CDA数据分析师

R语言预处理之异常值问题

>>>> 一、问题 什么是异常值?如何检测异常值?请伙伴们思考或者留言讨论。 >>>> 二、解决方法 1. 单变量异常值检测 2. 使用局部异常因子进行异常值...

30010
来自专栏张俊红

Sklearn参数详解—SVM

2.3K4
来自专栏计算机视觉life

SLIC超像素分割详解(二):关键代码分析

SLIC超像素分割详解(二) 网站http://ivrl.epfl.ch/research/superpixels给出了SLIC的代码。对于其中C++代码的几个...

2557
来自专栏CreateAMind

keras doc 6 卷积层Convolutional

本文摘自 http://keras-cn.readthedocs.io/en/latest/layers/convolutional_layer/

3142
来自专栏数据小魔方

左手用R右手Python系列——因子变量与分类重编码

今天这篇介绍数据类型中因子变量的运用在R语言和Python中的实现。 因子变量是数据结构中用于描述分类事物的一类重要变量。其在现实生活中对应着大量具有实际意义的...

3995
来自专栏灯塔大数据

每周学点大数据 | No.7大数据规模的算法分析

No.7期 大数据规模的算法分析 Mr. 王:这样的时间界限记为O(1),我们称之为常数时间算法,这样的算法一般来说是最快的,因为它与输入规模完全无关,不论输...

2024

扫码关注云+社区

领取腾讯云代金券