sklearn.metrics 中的f1-score介绍

1 f1_score,average='binary', 'macro', 'micro', 'weighted'

        F1得分可以解释为精确度和召回率的调和平均值,其中F1得分达到其最佳值为1,最差得分为0。精确度和召回率对F1得分的相对贡献相等。F1得分的公式为:

F1 = 2 * (precision * recall) / (precision + recall)

        在多类别和多标签的情况下,这是每个类别的F1得分的平均值,其权重取决于平均参数。

sklearn.metrics.f1_score(y_true, y_pred, *, labels=None, pos_label=1, average='binary', sample_weight=None, zero_division='warn')

参数介绍:

        y_true:1d array,或label array/sparse matrix,Ground truth (correct) target values

        y_pred: 分类器返回的估计目标。

        pos_label:str or int, default=1,要报告 average = ‘ binary’且数据为二分类。如果数据是多类或多标签的,这将被忽略; 设置labels = [ pos _ label ]和average!= “binary”将只报告该标签的分数。

        average: 该参数是多类/多标签目标所必需的。如果没有,则返回每个类的分数。否则,这将确定对数据执行的平均类型:

'binary': 仅报告pos_label指定的类的结果。这仅适用于目标 (y_{true,pred}) 是二分类的。

'micro': 通过计算总真阳性、假阴性和假阳性来全局计算指标。

        权重倾向:每一个样本的权重都相同;
        适用环境多分类不平衡,若数据极度不平衡会影响结果;

 'macro': 计算每个标签的指标,并找到它们的未加权平均值。

取值范围:每一类别的权重都相同;
适用环境多分类问题,不受数据不平衡影响,容易受到识别性高(高recall、高precision)的类别影响;

'weighted': 计算每个标签的指标,并找到它们的平均加权支持 (每个标签的真实实例数)。这会改变 “macro” 以解决标签不平衡; 它可能导致F分数不在精度和召回率之间。

'samples': 计算每个实例的指标,并找到它们的平均值 (仅对于与accuracy_score不同的多标签分类有意义)。

代码展示:

二分类情况:

>>> from sklearn.metrics import precision_score, recall_score, f1_score
>>> y_true = [0, 1, 0, 0, 1, 0, 1]
>>> y_pred = [0, 1, 0, 0, 0, 1, 0]
# 计算二分类情况下的average = 'macro' 'micro' 'binary'
# 二分类情况下,也能用macro和micro,但一般用binary
>>> f1_score(y_true, y_pred,average='macro')
0.5333333333333332
>>> precision_score(y_true, y_pred, average='macro')
0.55
>>> recall_score(y_true, y_pred, average='macro')
0.5416666666666666

>>> precision_score(y_true, y_pred, average='micro')
0.5714285714285714
>>> recall_score(y_true, y_pred, average='micro')
0.5714285714285714
>>> f1_score(y_true, y_pred,average='micro')
0.5714285714285714

>>> f1_score(y_true, y_pred,average='binary')
0.4
>>> recall_score(y_true, y_pred, average='binary')
0.3333333333333333
>>> precision_score(y_true, y_pred, average='binary')
0.5
>>> f1_score(y_true, y_pred) # 二分类情况下,默认使用binary
0.4

多分类情况:

>>> from sklearn.metrics import precision_score, recall_score, f1_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> f1_score(y_true, y_pred, average='macro')
0.26666666666666666
>>> f1_score(y_true, y_pred, average='micro')
0.3333333333333333
>>> f1_score(y_true, y_pred, average=None) # 相当于binary,为每个类别计算binary的f1分数,但是不能输入binary,要输入None
array([0.8, 0. , 0. ])
>>> 0.8/3
0.26666666666666666

猜你喜欢

转载自blog.csdn.net/qq_40671063/article/details/130447922