F1分数,也称为平衡F分数或F-measure,是一种衡量分类模型性能的指标。它综合了精确率和召回率,提供了一个单一的数值来评价模型的整体性能。F1分数的取值范围从0到1,其中1表示最佳性能,0表示最差性能。F1分数的计算公式如下:
F1 = 2 * TP / (2 * TP + FP + FN)
其中,TP代表真正例(True Positives),FP代表假正例(False Positives),FN代表假负例(False Negatives)。在没有真正例、假负例或假正例的情况下,默认F1分数计算为0.0。
对于二分类问题,如果设置average参数为'binary',将只返回指定正类的F1分数。如果average参数不是'binary',则忽略pos_label参数,计算两个类别的F1分数,然后进行平均或都返回(当average=None时)。对于多分类和多标签目标,F1分数可以为所有标签返回或平均,这取决于average参数的设置。
average参数用于多分类/多标签目标,其可能的取值包括'micro'、'macro'、'weighted'、'samples'和'binary'。如果设置为None,则返回每个类别的分数。否则,它决定了数据上执行的类型平均:
sample_weight参数允许为每个样本指定权重,而zero_division参数设置了当出现零除错误时返回的值。如果设置为'warn',则行为类似于0,但还会发出警告。如果设置为np.nan,则这样的值将从平均值中排除。
F1分数的计算结果可以是一个浮点数,也可以是一个浮点数数组,形状为[n_unique_labels],表示二分类中正类的F1分数,或者是多类任务中每个类的F1分数的加权平均值。
在实际应用中,F1分数是一个重要的性能指标,尤其是在类别不平衡的情况下。例如,当一个类别的样本数量远多于另一个类别时,精确率和召回率可能会受到较大影响,而F1分数则提供了一个平衡的视角。
下面是一个使用Python的scikit-learn库计算F1分数的示例代码:
import numpy as np
from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
print(f1_score(y_true, y_pred, average='macro')) # 输出: 0.26...
print(f1_score(y_true, y_pred, average='micro')) # 输出: 0.33...
print(f1_score(y_true, y_pred, average='weighted')) # 输出: 0.26...
print(f1_score(y_true, y_pred, average=None)) # 输出: [0.8, 0. , 0. ]
在上述代码中,首先导入了numpy和scikit-learn库中的f1_score函数。然后,定义了真实的标签y_true和预测的标签y_pred。接着,使用不同的average参数计算了F1分数,并打印了结果。
需要注意的是,当一个类别在y_true或y_pred中完全缺失时(即真阳性+假阳性+假阴性==0),F分数是未定义的。在这种情况下,默认F分数将被设置为0.0,并引发UndefinedMetricWarning。这种行为可以通过设置zero_division参数来修改。