目录
  1. 1. 准确率
  2. 2. 精确率
  3. 3. 召回率Recall
  4. 4. F1 score
sklearn 计算准确率、精确率、召回率

参考博客: https://blog.csdn.net/hfutdog/article/details/88085878

img

混淆矩阵中的P表示Positive,即正例或者阳性,N表示Negative,即负例或者阴性。

准确率

是正确分类样本占总样本个数的比例

1
2
3
4
5
6
7
8
9
10
import numpy as np
from sklearn.metrics import accuracy_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

精确率

精确率指模型预测为正的样本中实际也为正的样本占被预测为正的样本的比例。计算公式为:
$$
Precision=TP/(TP+FP)
$$

1
2
3
4
5
6
7
8
from sklearn.metrics import precision_score

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. ]

根据precision_score接口的解释,我们可以知道,当average参数为None时,得到的结果是每个类别的precision。上面的y_true有3个类别,分别为类0、类1、类2。我们将每个类别的TP、FP、FN列在下表中

类别 TP FP FN
类0 2 1 0
类1 0 2 2
类2 0 1 1

那么每个类别的precision也就得到了,如下所示:
P0=2/3=0.667 P1=0/2=0 P2=0/1=0

  • Macro Average
    宏平均是指在计算均值时使每个类别具有相同的权重,最后结果是每个类别的指标的算术平均值。
  • Micro Average
    微平均是指计算多分类指标时赋予所有类别的每个样本相同的权重,将所有样本合在一起计算各个指标。

从而Macro Precision也就知道了,就是(P0+P1+P2)/3=2/9≈0.22
Micro Precision的计算要从每个样本考虑,所有样本中预测正确的有两个,那么TP就是2,剩下的4个预测结果都可以看做FP,那么Micro Precision就是2/(2+4)=1/3≈0.333。
最后还有一个average=’weighted’的情况,因为这里每个类别的数量都恰好占比1/3,所以结果是
$P_w = {1\over3}P_0+{1\over3}P_1+{1\over3}*P_2\approx0.222$

虽然,我们是主要讲精确率的,但是宏平均和微平均的概念也很重要,这里顺便对比一下。

如果每个类别的样本数量差不多,那么宏平均和微平均没有太大差异
如果每个类别的样本数量差异很大,那么注重样本量多的类时使用微平均,注重样本量少的类时使用宏平均
如果微平均大大低于宏平均,那么检查样本量多的类来确定指标表现差的原因
如果宏平均大大低于微平均,那么检查样本量少的类来确定指标表现差的原因

召回率Recall

召回率是比率tp / (tp + fn),其中tp是真正性的数量,fn是假负性的数量. 召回率直观地说是分类器找到所有正样本的能力.
召回率最好的值是1,最差的值是0.

1
2
3
4
5
6
7
8
from sklearn.metrics import recall_score

y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
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.]

F1 score

F1 score是精确率和召回率的调和平均值
$$
F1 = \frac{2 * precision * recall}{precision + recall}
$$
Precision体现了模型对负样本的区分能力,Precision越高,模型对负样本的区分能力越强;Recall体现了模型对正样本的识别能力,Recall越高,模型对正样本的识别能力越强。F1 score是两者的综合,F1 score越高,说明模型越稳健。

1
2
3
4
5
6
7
8
from sklearn.metrics import f1_score

y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
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. ]
文章作者: HazardFY
文章链接: http://hazardfy.github.io/2019/11/16/sklearn-计算准确率、精确率、召回率/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 HazardFY's BLOG
打赏
  • 微信
  • 支付寶