我们常用的精确率和召回率通常都用于二分类的问题上,那么在多分类上应该怎样去使用这些评价指标呢?
既然精确率和召回率的概念以及计算公式都指向二分类问题,那么我们不妨将多分类问题转换为二分类问题来做。
先来看一下精确率和召回率的概念:
根据概念我们知道,在转换为二分类的过程中,我们重点在意的就是怎样去做正样本,其实我们可以把每个类别单独视为“正”,所有的其他类型视为“负”。
在进行例子之前,我们先来了解一个概念叫做——混淆矩阵。
对于上面这个表格,我们就可以把它叫做是一个混淆矩阵,在混淆矩阵中,每一行之和表示该类别的真实样本数量,每一列之和表示被预测为该类别的样本数量。
那么对于这个混淆矩阵我们就可以计算它每一个类别的精确率和召回率:
分类正确的正样本=43
分类器判定为正样本=50
P=43/50
分类正确的正样本=43
真实正样本=45
R=43/45
分类正确的正样本=45
分类器判定为正样本=50
P=45/50
分类正确的正样本=45
真实正样本=51
R=45/51
分类正确的正样本=49
分类器判定为正样本=50
P=4950
分类正确的正样本=49
真实正样本=54
R=49/54
得到了每个分类对应的P和R值他们的F1 score就可以用下面的式子算得:
用代码实现一下该计算方式:
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)