True Positive(TP):原来是正样本,预测结果为正样本;目标识别中,把目标给框出来了
True Negative(TN):原来是负样本,预测结果为负样本;目标识别中,负样本就是背景之类
False Positive(FP):原来是负样本,预测结果为正样本→ 误报 (Type I error);目标识别中,把背景识别成某个目标了
False Negative( FN):原来是正样本,预测结果为负样本→漏报 (Type II error)。目标识别中,没有把目标识别出来,把他看成是背景了
- 精确率(Precision),又称为“查准率”。精确率是针对预测结果而言的,表示的是预测结果的正样本中真正的正样本占比。那么预测为正就有两种可能,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),
- 召回率(Recall),又称为“查全率”。召回率是针对待测试的验证样本而言的,它表示的是待测试样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN),
TP+FN,即是待测试样本中正样本的数目。
- 准确率(accuracy)
在正负样本不平衡的情况下,准确率评价指标存在很大的缺陷。比如互联网某些广告的点击的数量是很少的,一般只有千分之几,如果用acc,即使全部预测成负类(不点击)acc 也有 99% 以上,没有意义。
例子
假设待测试的验证集中有60个正样本,40个负样本,验证的目的是希望模型系统找出所有的正样本,模型系统查找出50个,其中只有40个是真正的正样本,计算上述各指标。
- TP: 将正类预测为正类数 40
- FN: 将正类预测为负类数 20
- FP: 将负类预测为正类数 10
- TN: 将负类预测为负类数 30
准确率(accuracy) = 预测对的正样本和负样本/所有 = (TP+TN)/(TP+FN+FP+TN) =(40+30)/(40+20+10+30)=70%
精确率(precision) = 预测对的正样本/预测出来的数目=TP/(TP+FP) = 80%
召回率(recall) = 预测对的正样本/原测试样本中正样本个数=TP/(TP+FN) = 2/3
另一个评估方法,即混淆矩阵(confusion_matrix)。
在讲混淆矩阵之前,我们先复习下之前在讲分类评估指标中定义的一些符号含义,如下:
TP(True Positive):将正类预测为正类数,真实为0,预测也为0FN(False Negative):将正类预测为负类数,真实为0,预测为1FP(False Positive):将负类预测为正类数, 真实为1,预测为0TN(True Negative):将负类预测为负类数,真实为1,预测也为1混淆矩阵定义及表示含义
混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值,矩阵的列表示预测值,下面我们先以二分类为例,看下矩阵表现形式,如下:
二分类混淆矩阵
现在我们举个列子,并画出混淆矩阵表,假如宠物店有10只动物,其中6只狗,4只猫,现在有一个分类器将这10只动物进行分类,分类结果为5只狗,5只猫,那么我们画出分类结果混淆矩阵,并进行分析,如下(我们把狗作为正类):
猫狗分类混淆矩阵
通过混淆矩阵我们可以轻松算的真实值狗的数量(行数量相加)为6=5+1,分类得到狗的数量(列数量相加)为5=5+0,真实猫的数量为4=0+4,分类得到猫的数量为5=1+4。同时,我们不难发现,对于二分类问题,矩阵中的4个元素刚好表示TP,TN,FP,TN这四个符号量,如下图:
那么对于二分类问题来说,精确率Precision=a/(a+c)=TP/(TP+FP),召回率recall=a/(a+b)=TP/(TP+FN),准确率accuracy=(a+d)/(a+b+c+d)=(TP+FN+FP+TN),可以看到准确率中的分子值就是矩阵对角线上的值。
刚才分析的是二分类问题,那么对于多分类问题,混淆矩阵表示的含义也基本相同,这里我们以三类问题为例,看看如何根据混淆矩阵计算各指标值。
多分类混淆矩阵
与二分类混淆矩阵一样,矩阵行数据相加是真实值类别数,列数据相加是分类后的类别数,那么相应的就有以下计算公式;
精确率_类别1=a/(a+d+g)召回率_类别1=a/(a+b+c)Python代码实现混淆矩阵
Python中的sklearn库提供了相应的方法来输出矩阵数据,非常方便,函数如下:
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)
其中,y_true:是样本真实分类结果,y_pred 是样本预测分类结果 ,labels是所给出的类别,通过这个可对类别进行选择 ,sample_weight 是样本权重。这里我们用代码演示三分类问题混淆矩阵(这里我们用confusion_matrix生成矩阵数据,然后用seaborn的热度图绘制出混淆矩阵数据),如下:
#导入依赖包import seaborn as sns;from sklearn.metrics import confusion_matriximportmatplotlib.pyplot as pltsns.set()y_true = ["cat", "dog", "cat", "cat", "dog", "rebit"]y_pred = ["dog", "dog", "rebit", "cat", "dog", "cat"]C2= confusion_matrix(y_true, y_pred, labels=["dog", "rebit", "cat"])sns.heatmap(C2,annot=True)