这个问题其实并不难,但是最近遇到了一个比较新奇的F1算法,因此记录下来。

首先我们定义几个变量:

  • TP:预测为1,实际为1.
  • TN:预测为0,实际为0.
  • FP:预测为1,实际为0.
  • FN:预测为0,实际为1.

准确率(accuracy): (TP+TN)/(TP+TN+FP+FN) [预测对的/总样本]

精确率(precision): TP/(TP+FP) [预测为1且正确所占的样本数/所有预测为1的样本]

召回率(recall): TP/(TP+FN) [预测为1且正确的个数/所有真实为1的标签]

注:中文名字叫法多样,但是英文比较统一。

而F1则为 2*(Precision*Recall)/(Precision+Recall) 。

那么我说的“新奇”在哪呢?也可能是我见识少吧,遇到了一个f1算法为:

total = ((y_pred + y_true).sum()
right = ((y_pred * y_true).sum()
f1 = 2.0 * right / total

刚开始没有反应过来,过了一会也没反应过来。

后来经过推导发现:

我们将 (Precision*Recall)/(Precision+Recall) 这个公式代入TP这些,最终会化简为:

TP/(2TP+FP+FN)

而right的算法,就是TP(只有真实为1并且预测为1的样本,y_pred * y_true 才为1),而total就比较奇怪了,我们假设一系列样本为:

1  1  0  0   预测值
0  1  1  0   真实值

我们可以看到,按照(y_pred + y_true) 来计算为4,恰好是(2TP+FP+FN)的值,因此对于某个0 1标签的F1计算就变简单了。


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注