这个问题其实并不难,但是最近遇到了一个比较新奇的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 条评论