TP/FP/NP等的定义例子:
True positives : 飞机的图片被正确的识别成了飞机(正类)。
True negatives: 大雁的图片没有被识别出来,系统正确地认为它们是大雁。
False positives: 大雁的图片被错误地识别成了飞机。
False negatives: 飞机的图片没有被识别出来,系统错误地认为它们是大雁。
综上,TP正类预测为正,FN正类错误地预测为负类。
TN正类预测为负类,TP负类预测为负类。
相当于第一个T/R代表的是预测是否正确。
准确率
与下面的精确率相区别,准确率是所有预测对的总数除以总的数目,相当于求预测正确的比重。
精确率
针对我们预测结果而言的,它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),也就是
召回率
也就是求正类中分类正确的比重。
针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。
R = TP/(TP+FN)
注意此时没有涉及到负类预测为P的数目,相当于尽管召回率是100%,不代表分类都是对的。
F1 SCORE
F1分数可以看作是模型精确率和召回率的一种调和平均,它的最大值是1,最小值是0。
混淆矩阵
在机器学习中尤其是统计分类中,混淆矩阵(confusion matrix),也被称为错误矩阵(error matrix)。
矩阵的每一列表达了分类器对于样本的类别预测,矩阵的每一行则表达了版本所属的真实类别
之所以叫做’混淆矩阵‘,是因为能够很容易的看到机器学习有没有将样本的类别给混淆了。
下面举例:认为0为正类,1为负类。(参考https://blog.csdn.net/rocling/article/details/97139901)
sklearn中有这些对应的封装函数。
需要注意的就是average的对应:“macro”, “micro”,“weighted”,“None” 代码下解释
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.metrics import f1_score
y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
print(accuracy_score(y_true, y_pred)) # 0.5
print(accuracy_score(y_true, y_pred, normalize=False)) # 2
# 在具有二元标签指示符的多标签分类案例中
print(accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))) # 0.5
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(precision_score(y_true, y_pred, average='macro')) # 0.2222222222222222
print(precision_score(y_true, y_pred, average='micro')) # 0.3333333333333333
print(precision_score(y_true, y_pred, average='weighted')) # 0.2222222222222222
print(precision_score(y_true, y_pred, average=None)) # [0.66666667 0. 0. ]
print(recall_score(y_true, y_pred, average='macro')) # 0.3333333333333333
print(recall_score(y_true, y_pred, average='micro')) # 0.3333333333333333
print(recall_score(y_true, y_pred, average='weighted')) # 0.3333333333333333
print(recall_score(y_true, y_pred, average=None)) # [1. 0. 0.]
print(f1_score(y_true, y_pred, average='macro')) # 0.26666666666666666
print(f1_score(y_true, y_pred, average='micro')) # 0.3333333333333333
print(f1_score(y_true, y_pred, average='weighted')) # 0.26666666666666666
print(f1_score(y_true, y_pred, average=None)) # [0.8 0. 0. ]
None的话就直接输出各个类别的分数,不进行加权。
Macro Average 宏平均是指在计算均值时使每个类别具有相同的权重,最后结果是每个类别的指标的算术平均值。(类别平均)
Micro Average
微平均是指计算多分类指标时赋予所有类别的每个样本相同的权重,将所有样本合在一起计算各个指标。(样本平均)
weighted就直接根据权重来。
P-R曲线
评价一个模型的好坏,不能仅靠精确率或者召回率,最好构建多组精确率和召回率,绘制出模型的P-R曲线。
下面说一下P-R曲线的绘制方法。P-R曲线的横轴是召回率,纵轴是精确率。P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到低移动而生成的。原点附近代表当阈值最大时模型的精确率和召回率。(参考:https://blog.csdn.net/hfutdog/article/details/88085878)