【火炉炼AI】机器学习011-分类模型的评估:准确率,精确率,召回率,F1值
(本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )
在前面的(【火炉炼AI】机器学习004-岭回归器的构建和模型评估)中,讲解了回归模型的评估方法,主要有均方误差MSE, 解释方差分,R方得分等指标。
同样的,对于分类模型,也有很多评估指标来判断该分类模型是否达到我们的要求,这几个评估指标主要是指:准确率(accuracy),精确率(precision),召回率(recall),F1值(F1 measure)。
1. 指标的基本概念和计算方法
1.1 准确率(Accuracy)
准确率的定义是:对于给定的测试集,分类模型正确分类的样本数与总样本数之比。举个例子来讲,有一个简单的二分类模型(暂时叫做Classifier_A),专门用于分类苹果和梨,在某个测试集中,有30个苹果+70个梨,这个二分类模型在对这个测试集进行分类的时候,得出该数据集有40个苹果(包括正确分类的25个苹果和错误分类的15个梨)和60个梨(包括正确分类的55个梨和错误分类的5个苹果)。画成矩阵图为:
从图中可以看出,行表示该测试集中实际的类别,比如苹果类一共有25+5=30个,梨类有15+55=70个。其中被分类模型正确分类的是该表格的对角线所在的数字。在sklearn中,这样一个表格被命名为混淆矩阵(Confusion Matrix),所以,按照准确率的定义,可以计算出该分类模型在测试集上的准确率为:
即,该分类模型在测试集上的准确率为80%。
但是,准确率指标并不总是能够评估一个模型的好坏,比如对于下面的情况,假如有一个数据集,含有98个苹果,2个梨,而分类器(暂时叫做Classifier_B)是一个很差劲的分类器,它把数据集的所有样本都划分为苹果,也就是不管输入什么样的样本,该模型都认为该样本是苹果。那么这个表格会是什么样的了?
则该模型的准确率为98%,因为它正确地识别出来了测试集中的98个苹果,只是错误的把2个梨也当做苹果,所以按照准确率的计算公式,该模型有高达98%的准确率。
可是,这样的模型有意义吗?一个把所有样本都预测为苹果的模型,反而得到了非常高的准确率,那么问题出在哪儿了?只能说准确率不可信。特别是对于这种样品数量偏差比较大的问题,准确率的“准确度”会极大的下降。所以,这时就需要引入其他评估指标评价模型的好坏了。
1.2 精确率(Precision)
精确率的定义是:对于给定测试集的某一个类别,分类模型预测正确的比例,或者说:分类模型预测的正样本中有多少是真正的正样本,其计算公式是:
所以,根据定义,精确率要区分不同的类别,比如上面我们讨论有两个类别,所以要分类来计算各自的精确率。对于上面提到的Classifier_A和Classifier_B分类模型,我们可