我们常用的精确率和召回率通常都用于二分类的问题上,那么在多分类上应该怎样去使用这些评价指标呢?

多分类的精确率和召回率

既然精确率和召回率的概念以及计算公式都指向二分类问题,那么我们不妨将多分类问题转换为二分类问题来做。

先来看一下精确率和召回率的概念:

  • 精确率是指分类正确的正样本个数占分类器判定为正样本的个数的比例。
  • 召回率是指分类正确的正样本真实正样本的比例。

根据概念我们知道,在转换为二分类的过程中,我们重点在意的就是怎样去做正样本,其实我们可以把每个类别单独视为“正”,所有的其他类型视为“负”。

举个例子:

在进行例子之前,我们先来了解一个概念叫做——混淆矩阵。

对于上面这个表格,我们就可以把它叫做是一个混淆矩阵,在混淆矩阵中,每一行之和表示该类别的真实样本数量,每一列之和表示被预测为该类别的样本数量。

那么对于这个混淆矩阵我们就可以计算它每一个类别的精确率和召回率:

  • 分类1的精确率(此时把分类1当作正样本,其余为负样本):

分类正确的正样本=43

分类器判定为正样本=50

P=43/50

  • 分类1的召回率:

分类正确的正样本=43

真实正样本=45

R=43/45

  • 分类2的精确率(此时把分类2当作正样本,其余为负样本):

分类正确的正样本=45

分类器判定为正样本=50

P=45/50

  • 分类2的召回率:

分类正确的正样本=45

真实正样本=51

R=45/51

  • 分类3的精确率(此时把分类3当作正样本,其余为负样本):

分类正确的正样本=49

分类器判定为正样本=50

P=4950

  • 分类3的召回率:

分类正确的正样本=49

真实正样本=54

R=49/54

得到了每个分类对应的P和R值他们的F1 score就可以用下面的式子算得:

F1 score =\frac{2*precision*recall}{precision+recall}

 

用代码实现一下该计算方式:


M = [
    [14371, 6500, 9, 0, 0, 2, 316],
    [5700, 22205, 454, 20, 0, 11, 23],
    [0, 445, 3115, 71, 0, 11, 0],
    [0, 0, 160, 112, 0, 0, 0],
    [0, 888, 39, 2, 0, 0, 0],
    [0, 486, 1196, 30, 0, 74, 0],
    [1139, 35, 0, 0, 0, 0, 865]
]
n = len(M)
for i in range(n):
    rowsum, colsum = sum(M[i]), sum(M[r][i] for r in range(n))
    try:
        print ('precision: %s' % (M[i][i]/float(colsum)), 'recall: %s' % (M[i][i]/float(rowsum)))
    except ZeroDivisionError:
        print ('precision: %s' % 0, 'recall: %s' %0)

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐