在机器学习或深度学习中,评价指标是衡量一个模型效果好与坏的标准。
本文主要介绍一些常用的评价指标,包含:准确率(accuary)、精准率、召回率、F1值、PR曲线、ROC曲线、AUC等。
在介绍这些评价指标之前,我们先来看一个简单的例子。
对于舆情预警,判断一段舆情文本数据是否需要预警,其结果有两种:预警
、不预警
。
如果有100条舆情文本,模型A预测为预警
的样本数为25,其中这25个样本经过人工验证,发现有20个是真正需要预警的数据,另外的5条不需要预警;预测为不预警
的样本数为75,其中这75个样本经过人工验证,发现有10个是真正需要预警的数据,另外的65条不需要预警。
根据以上描述,我们可以建立如下的矩阵
其中,
模型预测为预警
,而且人工验证为预警
,我们称为真正例(True Positive, TP)
模型预测为预警
,但是人工验证为不预警
,我们称为伪正例(False Positive, FP)
模型预测为不预警
,但是人工验证为预警
,我们称为伪负例(False Negative, FN)
模型预测为不预警
,而且人工验证为不预警
,我们称为真负例(True Negative, TN)
根据以上定义,我们可知 TP=20,FP=5,FN=10,TN=65
1.准确率
准确率(Accuary)应该是一种最基础的评价指标,描述的是整体结果的预测正确与否。
Accuary = 预测正确样本量 / 总样本量
预测正确的样本量包含TP和TN,所以
通过scikit-learn中的accuracy_score
可直接计算出准确率
>>> from sklearn.metrics import accuracy_score
>>> y_pred = [0, 2, 1, 3]
>>> y_true = [0, 1, 2, 3]
# normalize:默认值为True,返回正确分类的比例;如果为False,返回正确分类的样本数
>>> accuracy_score(y_true, y_pred)
0.5
>>> accuracy_score(y_true, y_pred, normalize=False)
2
2.精准率、召回率、F1值
准确率评价指标有一个明显的弊端问题,即在数据类别不均衡的情况下,准确率指标不能客观得评价一个模型的效果,如:
现有另外100条舆情数据,其中99条是不需要预警的数据,只有1条是需要预警,如果我们训练一个模型B,该模型直接将全部输入的舆情数据预测为不预警
,那么根据准确率指标,则Accuary=99/100=0.99
如果单看准确率指标,则我们可以认为模型B效果很好,但是实际上模型B没什么意义,所以这时就需要其他评价指标了,如精准率(precision)、召回率(recall)、F1值等。
通常在评价我们训练的机器学习/深度学习模型中,精准率、召回率和F1值都是一起使用的,根据此三个指标可相对综合客观地评价一个模型效果的好坏。
精准率(precision) 跟准确率有点相似,但是两者是完全不同的概念。
精准率表示的是在所有被预测为正例的样本中实际为正的样本的概率,可以理解为当模型预测结果为正的时候,我们有多大的把握相信模型是对的,其公式如下:
>>> from sklearn.metrics import precision_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> precision_score(y_true, y_pred, average='macro')
0.2222222222222222
>>> precision_score(y_true, y_pred, average='micro')
0.3333333333333333
>>> precision_score(y_true, y_pred, average='weighted')
0.2222222222222222
>>> precision_score(y_true, y_pred, average=None)
array([0.66666667, 0. , 0. ])
召回率(recall) 表示的是在所有实际为正例的样本中被预测为正例的样本的概率,可以理解为模型将样本中所有正例样本预测正确的概率,其公式如下:
>>> from sklearn.metrics import recall_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> recall_score(y_true, y_pred, average='macro')
0.3333333333333333
>>> recall_score(y_true, y_pred, average='micro')
0.3333333333333333
>>> recall_score(y_true, y_pred, average='weighted')
0.3333333333333333
>>> recall_score(y_true, y_pred, average=None)
array([1., 0., 0.])
F1值是精准率和召回率的一个综合评价指标,其公式如下:
>>> from sklearn.metrics import f1_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> f1_score(y_true, y_pred, average='macro')
0.26666666666666666
>>> f1_score(y_true, y_pred, average='micro')
0.3333333333333333
>>> f1_score(y_true, y_pred, average='weighted')
0.26666666666666666
>>> f1_score(y_true, y_pred, average=None)
array([0.8, 0. , 0. ])
通常精准率跟召回率呈现一个此消彼长的过程,因此选择模型的时候需要依据具体的业务场景。
如果是"宁可错杀一千,不放过一个",则此时需要在保证一定的准确率基础上优先考虑召回率;
如果是"精准打击",则此时需要在保证一定召回率基础上优先考虑精确率。
metrics.classification_report
函数可以将精准率、召回率及F1一次性输出,关于该函数的具体介绍,可参考前一篇文章:https://www.jianshu.com/p/757dfef76e13
3.PR曲线
P-R曲线(Precision Recall Curve)描述的是精确率与召回率之间变化关系的曲线。
P-R曲线定义:
根据学习器的预测结果(一般为一个实值或概率)对测试样本进行排序,将最可能是“正例”的样本排在前面,最不可能是“正例”的排在后面,按此顺序逐个把样本作为“正例”进行预测,每次计算出当前的P值和R值。
PR曲线图如下所示:
从precision与Recall的指标上来看,precision与Recall越高说明模型效果越好,那么基于此,在PR曲线图中,越靠右上角的曲线所代表的分类器效果更好,图中模型A、B、C的效果从高到低依次是:Model A
>Model B
> Model C
。
PR曲线下方的面积叫AP分数,能在一定程度上反应模型的精确率和召回率都很高的比例。但这个值不方便计算,综合考虑精度与召回率一般使用F1函数或者AUC值(因为ROC曲线很容易画,ROC曲线下的面积也比较容易计算)。
4.ROC曲线
在分类任务中,大部分模型输出的都是各个类别的预测概率或得分,通常我们会设置一个阈值或选取概率/得分最大的那个类别输出。此时,如果选择精准率、召回率、F1值等指标来评估模型效果时,或多或少会受到一定的影响,而ROC曲线(Receiver Operating Characteristic, ROC)正好可以消除这种影响,其可以在不设置阈值的情况下对模型进行评估,得到的结果更能反应模型的真实效果。
ROC曲线还有另一个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类别不平衡现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化,ROC以及AUC可以很好的消除样本类别不平衡对指标结果产生的影响。
ROC曲线又称接受者操作特征曲线,其纵坐标是真正率(True Positive Rate, TPR),横坐标是假正率(False Positive Rate, FPR)。
ROC曲线如下图所示
ROC曲线越靠近左上角,此时模型效果越好,如果处于左上角,此时FPR=0,TPR=1,根据FPR和TPR公式,此时FN=0,FP=0,模型对所有样本分类正确。
绘制ROC曲线很简单,首先对所有样本按预测概率排序,以每条样本的预测概率为阈值,计算相应的FPR和TPR,然后线段连接。
当数据量少时,绘制的ROC曲线不平滑;当数据量大时,绘制的ROC曲线会趋于平滑。
一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting,这个时候调模型可以只看AUC,面积越大一般认为模型越好。
5.AUC
AUC(Area Under Curve)是处于ROC曲线下方的面积。ROC曲线下方面积越大,也即AUC越大表明模型效果越好。
物理意义
AUC对所有可能的分类阈值的效果进行综合衡量。首先AUC值是一个概率值,可以理解为随机挑选一个正样本以及一个负样本,分类器判定正样本分值高于负样本分值的概率就是AUC值。简言之,AUC值越大,当前的分类算法越有可能将正样本分值高于负样本分值,即能够更好的分类。
参考
一文读懂机器学习分类模型评价指标
【机器学习】一文读懂分类算法常用评价指标