TP、FP、FN是评价分类模型性能的常用指标。
之前很多次都会遇到这三个值,每次遇到都要重新查资料,看这三个值是怎么计算的,具体是指什么的?今天终于理解透彻了,所以赶紧来记录一下~~~
TP(True Positive,真正例):表示模型正确地将正例预测为正例的数量;
FP(False Positive,假正例):表示模型错误地将负例预测为正例的数量;
FN(False Negative,假负例):表示模型错误地将正例预测为负例的数量。
这样地概念给大家一看,是不是有很多疑惑?下面我们来用大白话来说明一下这三个指标。
首先,我们要关注“正确地”和“错误地”这两个形容词,分别表示看gold和pred二者一致的值或者不一致的值
接着,我们来说明一下,什么是正例?什么是负例?嗯,我相信一个例子可用帮助大家更好地理解这个问题,如下所示,gold是真实结果,而pred是预测结果。
gold = ['我', '爱', '中', '国']
pred = ['我', '爱', '中国']
其中,正例有“我”、“爱”、“中”、“国”;负例有“中国”。
这个时候,我们是不是脑子清晰了一点?其实,正例是真实结果中包含的所有情况,预测结果中也有部分正例,而负例只能出现在预测结果中,但并不是所有的预测结果都是负例。
通俗来说,就是正例既可以出现在真实结果中,也可以出现在预测结果中,但是负例只会出现在预测结果中。当我们理解了这一点,那么TP、FP、FN三者的值就很好计算了。
当我们看到正例,就从真实结果到预测结果来看;当我们看到负例,就从预测结果到真实结果来看。
TP—正确地将正例预测为正例的数量,正确地,是让我们看gold和pred一致的情况,正例预测为正例,是让我们将gold与pred进行对比,也就是统计gold与pred一致的数量。
FP—错误地将负例预测为正例的数量,错误地,是让我们看gold和pred不一致的情况,负例预测为正例,是让我们将pred与gold进行对比,也就是统计pred与gold不一致的数量。
FN—错误地将正例预测为负例的数量,错误地,是让我们看gold和pred不一致的情况,正例预测为负例,是让我们将gold与pred进行对比,也就是统计gold与pred不一致的数量。
在上边的例子中,TP=2,FP=1,FN=2。
哈哈哈 看到这,是不是脑子清醒多了呢?那我们一鼓作气,再来看一下准确率(Precision,P)、召回率(Recall,R)、F1值(F1-score,F1)!!
准确率P和召回率R分别衡量了结果的正确性和完整性,F1-Score则综合了两者的评价。
代码示例:
# 定义评价函数
def evaluate(gold, pred):
# 计算准确率
tp = 0
fp = 0
for i in range(len(pred)):
if i < len(gold) and pred[i] == gold[i]:
tp += 1
else:
fp += 1
precision = tp / (tp + fp)
print("tp: ", tp)
print("fp: ", fp)
# 计算召回率
tp = 0
fn = 0
for i in range(len(gold)):
if i < len(pred) and gold[i] == pred[i]:
tp += 1
else:
fn += 1
recall = tp / (tp + fn)
print("tp: ", tp)
print("fn: ", fn)
# 计算F1-Score
f1 = 2 * precision * recall / (precision + recall)
return precision, recall, f1
# 测试评价函数
gold = ['0', '1', '2', '1', '0', '1', '3', '4', '6', '1']
pred = ['0', '2', '2', '1', '1', '1', '3', '4', '6', '1', '1']
precision, recall, f1 = evaluate(gold, pred)
print('P:', precision)
print('R:', recall)
print('F1-Score:', f1)
运行结果: