zoukankan      html  css  js  c++  java
  • 为什么要用f1-score而不是平均值

    做过机器学习项目的同学大多都用过f1-score, 这是一种均衡精度(precision)和召回率(recall)的综合评价指标,但为什么不用平均值呢?

    精度和召回率

    精度

    $$ pre  = frac{tp}{tp+fp}$$

    tp: true positive 真正例,即预测为正例真实也为正例的个数;

    fp: false positive 假正例,即预测为正例但实际是反例的个数;

    precision 评价的是查准率,即给出的预测为正例中多少是正确的。

    召回率

    $$ recall = frac{tp}{tp+fn}$$

    tn: false negative 假反例,即真实是正例,(tp+fn)表示总共的正例个数。

    recall 评价的是查全率,即模型正确召回了多少的正例。

    f1-score 和平均值

    $$ mean = frac{pre+recall}{2} $$

    $$ f1\_score = frac{1}{frac{1}{recall}+{frac{1}{pre}}} = frac{2*pre*recall}{pre+recall}$$

    f1-score的公式可以看出recall或者pre较小的那个将会决定f1-score结果,即具有短板效应,而均值的方法不具有这样的效果。例如$recall=1,pre approx 0$的情况下$f1\_score approx 0; mean approx 0.5$。

    总结一下,就是f1-score比均值的方法更能说明一个模型的好坏,因为很多时候都需要recall和pre的均衡,任意一个指标太差都是无法接受的。

    可视化结果

    下图是这两种指标的可视化结果,x轴和y轴分别代表recall和pre,z轴代表综合评价指标(evaluation metric),蓝色的平面为均值在不同的精度和召回率下(0-1)的结果,变色的曲面表示f1-score在不同精度和召回率下(0-1)的结果。

    可以看到在对角线部分两者是重合的,但是靠近两边时,f1-score下降很厉害,直至0,而均值并没有这样的效果。

    代码:

    # 载入模块
    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    # 创建 3D 图形对象
    fig = plt.figure()
    ax = Axes3D(fig)
    
    # 生成数据
    X = np.arange(0.0001, 1, 0.01)
    Y = np.arange(0.0001, 1, 0.01)
    X, Y = np.meshgrid(X, Y)
    mean = (X+Y)/2
    f1_score = 2*(X*Y)/(X+Y)
    
    ax.set_xlabel('recall')
    ax.set_ylabel('precision')
    ax.set_zlabel('evaluation metric')
    
    # 绘制曲面图,并使用 cmap 着色
    ax.plot_surface(X, Y, mean, cmap=plt.cm.winter)
    ax.plot_surface(X, Y, f1_score, cmap='rainbow')
    
    plt.show()
  • 相关阅读:
    Python_turtle绘图实例(持续更新)
    C++程序设计实验考试准备资料(2019级秋学期)
    利用next_permutation()实现全排列 完成 阮小二买彩票
    用埃氏算法来素数求和
    C++指针注意事项
    double与float的输入输出格式
    图片文件隐写术
    文件操作与隐写
    MFC 消息机制
    MFC应用中处理消息 创建窗口和会话框的顺序
  • 原文地址:https://www.cnblogs.com/walter-xh/p/11140715.html
Copyright © 2011-2022 走看看