各种metrics的指标回顾与汇总

各种metrics的指标回顾与汇总

基本的记号

  • tp: true positive, 即真正, gt为1, predict也为1
  • fp: false positive, 即假正(本来不是正), gt 为0, predict 为1
  • fn: false negative, 即假负(本来不是负), gt 为1, predict 为0
  • tn: true negative, 即真负, gt 为0, predict 为 0.

这四个量加起来就是测试总数据量.

指标

  • Precision

$P(Precision) = \frac{tp}{tp + fp}$, 分母为predict为1的数量

  • Recall

$R(Recall) = \frac{tp}{tp + fn}$, 分母为gt为1的数量.

这两个经常用的是看 precision0.9的时候recall的值,这时候recall的值如果比较低的话,说明fn较多, 还有recall0.9的时候precision的值,这时候precision比较低的话,说明fp较多.

  • TPR (True positive rate) 这个其实就是recall

  • FPR (False positive rate)

$FPR = \frac{fp}{fp+tn}$, 分母为gt为0 的数量

  • ROC (Receiver Operator characteristic Curve)曲线

以FPR为x轴, TPR为y轴,是个上升的曲线,曲线下面的面积越大,认为模型越好. [实际用的时候一般会找 $k=1$ 的切线来确定阈值.]

比如以垃圾邮件(gt为0)这个问题为例,希望是FPR低,TPR高 这意味着 在把是垃圾邮件判定为不是垃圾邮件较低的情况下,把尽量多的有用邮件召回.

  • FAR (False Aacceptance rate) 与FRR(False Rejection rate)

可以参考 https://zhuanlan.zhihu.com/p/33025359, 我试着写了一份计算代码,是对得上的.


import numpy as np

def main():
    p, k = 110, 8
    label = np.repeat(np.arange(p), k)
    label = label[np.newaxis, :] == label[:, np.newaxis]
    identity = np.eye(*label.shape)
    mask = label - identity
    total_mask = 1 - identity
    # 对应于score矩阵和thresh的话应该有一个predict 矩阵, 本应该matching失败却是判定为matching成功的是 predict==1, label==0 的那些数量, 即 fp的那些, 比如说是1000
    false_total_num = (1-label).sum()
    # 从这里可以看出 false_total_num,就是label矩阵中 gt 为0 的那些总数, 所以从这个角度来看 FAR实际上就是FPR。
    FAR = 1000 / false_total_num
    print(f"FAR: {FAR:8.4%}, false_total_num: {false_total_num}")
    # 对应于predict矩阵,把本来对的,而没有判定对的,假设这种次数有160次
    true_total_num = mask.sum()
    FRR = 160 / true_total_num
    print(f"FRR: {FRR:8.4%}, true_total_num: {true_total_num}")
    # 但是1000 与 160是如何算出来的,算不算对角阵上的那些呢?从分母来看的话,好像是不算那些的,所以有了下面的计算方法
    simi = np.random.random(label.shape)
    thresh = 0.5
    predict = simi > 0.5
    fp_num = ((label == 0) * (predict==1) * total_mask).sum()
    fn_num = ((label == 1) * (predict == 0) * total_mask).sum()
    FAR = fp_num / false_total_num
    FRR = fn_num / true_total_num
    print(f"FAR: {FAR:8.4%}, false_total_num: {false_total_num}")
    print(f"FRR: {FRR:8.4%}, true_total_num: {true_total_num}")


if __name__ == '__main__':
    main()

打赏,谢谢~~

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,多谢支持~

打开微信扫一扫,即可进行扫码打赏哦