注意:本文并非原创,转载自知乎(https://zhuanlan.zhihu.com/p/30953081),感谢知乎作者的慷慨分享!!!!
================================================================================================
分类是监督学习中的一个核心问题。为了评价一个分类器的分类性能优劣,需要引入一些评估指标,常用的一些指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F值等。接下来以二分类问题为例详细讲解分类问题中常用的性能评估指标。
通常以关注的类为正类,其他类为负类,依据分类器在测试数据集上的预测正确与否,四种情况出现的总数分别记作:
- TP --- 将正类预测为正类的样本数;
- FN --- 将正类预测为负类的样本数;
- FP --- 将负类预测为正类的样本数;
- TN --- 将负类预测为负类的样本数;
其中,True、False表示分类正确与错误,Positive、Negative表示正、负样本。
准确率与错误率
准确率(Accuracy)是指对于给定的测试数据集,分类器正确分类的样本数与总样本数的比值,反映了分类器对整个样本的判定能力,即能够将正的判定为正,负的判定为负。计算公式如下:
错误率(Error)则正好与准确率的含义相反,计算公式如下:
精确率与召回率
(1)精确率(Precision)是指被分类器判定为正类的样本中真正的正类样本的比重,即被分类器判为正类的所有样本中有多少是真正的正类样本。计算公式如下:
(2)召回率(Recall)是指被分类器正确判定的正类样本占总的正类样本的比重,即所有正类样本中有多少被分类器判为正类样本。计算公式如下:
精确率和召回率反映了分类器性能的两个方面,单一依靠某个指标并不能较为全面地评价一个分类器的性能。一般情况下,精确率越高,召回率越低;反之,召回率越高,精确率越低。为了平衡精确率和召回率的影响,较为全面地评价一个分类器,引入了F-score这个综合指标。
F-Score
F-score是精确率和召回率的调和均值,计算公式如下:
其中, ( )的取值反映了精确率和召回率在性能评估中的相对重要性具体,通常情况下,取值为1。描述如下:
- 当 时,就是常用的 值,表明精确率和召回率一样重要,计算公式如下:
值又称为平衡 分数(Balanced F-Score)。精确率和召回率都高时, 值也会高。
- 当 时, 表明召回率的权重比精确率高;
- 当 时, 表明精确率的权重比召回率高。
以上讨论的评估指标适用于二分类问题,但当我们的问题属于多分类问题时,考察在不同类别下综合考察分类器的优劣,这时候就需要引入宏平均(Macro-averaging)、微平均(Micro-averaging)。
Averaging
Macro-averaging
宏平均(Macro-averaging)是指所有类别的每一个统计指标值的算数平均值,也就是宏精确率(Macro-Precision),宏召回率(Macro-Recall),宏F值(Macro-F Score),其计算公式如下:
Micro-averaging
微平均(Micro-averaging)是对数据集中的每一个示例不分类别进行统计建立全局混淆矩阵,然后计算相应的指标。其计算公式如下:
Macro-averaging与Micro-averaging的不同之处在于:Macro-averaging赋予每个类相同的权重,然而Micro-averaging赋予每个样本决策相同的权重。因为从 值的计算公式可以看出,它忽略了那些被分类器正确判定为负类的那些样本,它的大小主要由被分类器正确判定为正类的那些样本决定的,在微平均评估指标中,样本数多的类别主导着样本数少的类。如下表所示:
如上表所示,微平均的精确率(0.83)比类别 的精确率(0.5)更接近于类别 的精确率(0.9),因为类别 的样本数比类别 大5倍。因而在测试数据集上,度量分类器对大类判别的有效性应该选择微平均,而度量分类器对小类判别的有效性则应该选择宏平均。
示例
假设有10个样本,它们属于A、B、C三个类别。假设这10个样本的真实类别和预测的类别分别是:
> 真实:A A A C B C A B B C
> 预测:A A C B A C A C B C
对于类别A来说:
正确预测为A类的样本个数 / 预测为A类的样本个数
正确预测为A类的样本个数 / 真实的A类样本数
对于类别B来说:
正确预测为B类的样本个数 / 预测为B类的样本个数
正确预测为B类的样本个数 / 真实的B类样本数
对于类别C来说:
正确预测为C类的样本个数 / 预测为C类的样本个数
正确预测为C类的样本个数 / 真实的C类样本数
代码示例:
from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.metrics import f1_score, fbeta_score
y_true = [0, 0, 0, 2, 1, 2, 0, 1, 1, 2]
y_pred = [0, 0, 2, 1, 0, 2, 0, 2, 1, 2]
accuracy_score(y_true, y_pred) # Return the number of correctly classified samples
accuracy_score(y_true, y_pred, normalize=False) # Return the fraction of correctly classified samples
# Calculate precision score
precision_score(y_true, y_pred, average='macro')
precision_score(y_true, y_pred, average='micro')
precision_score(y_true, y_pred, average=None)
# Calculate recall score
recall_score(y_true, y_pred, average='macro')
recall_score(y_true, y_pred, average='micro')
recall_score(y_true, y_pred, average=None)
# Calculate f1 score
f1_score(y_true, y_pred, average='macro')
f1_score(y_true, y_pred, average='micro')
f1_score(y_true, y_pred, average=None)
# Calculate f beta score
fbeta_score(y_true, y_pred, average='macro', beta=0.5)
fbeta_score(y_true, y_pred, average='micro', beta=0.5)
fbeta_score(y_true, y_pred, average=None, beta=0.5)
参考
- 李航. 统计学习方法概论. 清华大学出版社.
- 周志华. 机器学习. 清华大学出版社.
- 谈谈评价指标中的宏平均和微平均
- Wikepedia entry for f1-score
- Pillai, Ignazio, G. Fumera, and F. Roli. "F-measure optimisation in multi-label classifiers." *International Conference on Pattern Recognition* IEEE, 2012:2424-2427.
- Asch V V, Macro- and micro-averaged evaluation measures[[BASIC DRAFT]]. 2013.
- Sokolova, Marina, and G. Lapalme. "A systematic analysis of performance measures for classification tasks." *Information Processing & Management An International Journal* 45.4(2009):427-437.
- Özgür, Arzucan, Levent Özgür, and Tunga Güngör. "Text categorization with class-based and corpus-based keyword selection." *Computer and Information Sciences-ISCIS 2005*(2005): 606-615.