为何要用f1-score而不是平均值

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

精度和召回率

精度

$$ pre  = \frac{tp}{tp+fp}$$机器学习

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

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

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

召回率

$$ recall = \frac{tp}{tp+fn}$$3d

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

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

 

f1-score 和平均值

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

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

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()
相关文章
相关标签/搜索