🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/
先复习一下查准率、召回率和 F1 分数:
-
查准率是对预测结果而言,每个类别模型预测正确的比例。
-
召回率是对样本标签而言,每个类别中有多少被预测正确了。
-
F1 分数是查准率和召回率的调和平均值。
-
定义二分类结果的混淆矩阵,纵轴从上往下为预测结果的 1 和 0,横轴从左往右为真实标签的 1 和 0。左上到右下的对角线:TP、TN。左下到右上的对角线:FN、FP。
-
其实就是分母不同,查准率是每个类别预测结果的样本数,而召回率则是每个类别样本标签的样本数。
为什么要使用平衡准确率(Balance Accuracy)和加权 F1 值(Weighted F1)?
-
首先,我们需要理解这两个指标是用来评估分类模型的性能的。在机器学习中,我们经常需要处理不平衡的数据集,也就是说,某些类别的样本数量远多于其他类别。在这种情况下,传统的准确率可能会产生误导,因为模型可能会倾向于预测数量较多的类别,从而得到较高的准确率,但对于数量较少的类别,其预测性能可能很差。
-
这时候,平衡准确率就派上用场了。平衡准确率是对所有类别的准确率的平均,它对每个类别的重视程度是一样的,无论这个类别的样本数量多少。因此,它可以更好地反映模型在各个类别上的性能,特别是在处理不平衡数据集时。
-
然后,我们来看看加权 F1 值。F1 值是精确率(Precision)和召回率(Recall)的调和平均数,它同时考虑了模型的精确率和召回率。加权 F1 值则是对每个类别的 F1 值进行加权平均,权重通常是每个类别的样本数量。因此,加权 F1 值可以反映出模型在各个类别上的性能,并且对样本数量多的类别给予更高的权重。
总的来说,平衡准确率和加权 F1 值都是在评估分类模型性能时非常重要的指标,它们可以帮助我们更全面、更准确地了解模型的性能。
平衡准确率(Balance Accuracy)
平衡准确率用于处理二元分类问题中的标签不平衡数据集。它被定义为每个类别上获得的召回率的平均值。
balanced_accuracy_score
函数是 scikit-learn 库中的一个实现,它可以计算平衡准确率,从而避免在标签不平衡的数据集上过高估计性能。当参数 adjusted 设置为 False 时,平衡准确率的最佳值为 1,最差值为 0。下面是一个常用的计算示例:
from sklearn.metrics import balanced_accuracy_score
y_true = [0, 1, 0, 0, 1, 0]
y_pred = [0, 1, 1, 0, 0, 0]
balanced_accuracy_score(y_true, y_pred, adjusted=False)
有些研究文献提出了平衡准确率的替代定义。scikit-learn 对平衡准确率的定义是,它等同于具有类平衡样本权重的 accuracy_score,且与二进制案例具有相同的理想属性。对于二元分类问题,平衡准确率是灵敏度(真阳性率)和特异性(真阴性率)的算术平均值。具体的计算公式如下:
balanced-accuracy = 1 2 ( T P T P + F N + T N T N + F P ) \texttt{balanced-accuracy} = \frac{1}{2}\left( \frac{TP}{TP + FN} + \frac{TN}{TN + FP}\right ) balanced-accuracy=21(TP+FNTP+TN+FPTN)
如果这个分类器在两个类别上的表现一样好,那么这个术语就简化为传统的准确率(即正确预测数除以总预测数)。平衡准确率取值范围从 0 到 1。当设置了 adjusted=True 时,它会重新调整到范围 1 1 − n _ c l a s s e s \frac{1}{1 \ -\ n\_classes} 1 − n_classes1 到 1 之间,随机性能得分为 0。
加权 F1 值(Weighted F1)
F1 分数是评估模型在二分类任务中预测性能的常用指标,综合考虑了查准率和召回率。F1 分数是查准率和召回率的调和平均值,其取值范围为 0 到 1,其中,1 表示查准率和召回率均达到完美,而 0 则表示查准率和召回率均未达到完美。
F1-Score = 2 × P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l \texttt{F1-Score} = 2 \times \frac{Precision \times Recall}{Precision + Recall} F1-Score=2×Precision+RecallPrecision×Recall
F1 分数有多种变体,包括加权 F1 分数、宏观 F1 分数和微观 F1 分数,这些都适用于多元分类问题或需要对类别进行加权的场景。
-
宏观 F1 分数通过平均每个类别的 F1 分数进行计算(宏观让所有类别都有同等的权重,因此给予代表性不足的类别更高的权重),其中每个类别都被赋予相同的权重。这种方法假设所有类别都同等重要,尽管在实际应用中可能并非如此。
-
在每个测试案例都保证被准确分配到一个类别中的分类任务中,微观 F1 分数等同于准确率。
-
加权 F1 分数对每个类别的 F1 分数进行独立计算,但在求平均时,会根据每个类别的实例数量进行加权。这种方法考虑了类别不平衡的问题,因此是一个更现实的评估指标。如果在类别不平衡的情况下,你希望给予大类别更多的权重,那么加权 F1 分数是一个好的选择。
scikit-learn 库实现的 f1_score
函数计算 F1 分数,一个常用代码示例如下所示:
import numpy as np
from sklearn.metrics import f1_score
# Ground truth (true labels)
y_true = np.array([0, 1, 2, 0, 1, 2, 0, 1, 2])
# Predicted labels from your classifier
y_pred = np.array([0, 1, 2, 0, 1, 2, 0, 2, 2]) # The 8th label is misclassified
# Calculate Macro F1 Score
macro_f1 = f1_score(y_true, y_pred, average='macro')
print(f"Macro F1 Score: {macro_f1}")
# Calculate Micro F1 Score
micro_f1 = f1_score(y_true, y_pred, average='micro')
print(f"Micro F1 Score: {micro_f1}")
# Calculate Weighted F1 Score
weighted_f1 = f1_score(y_true, y_pred, average='weighted')
print(f"Weighted F1 Score: {weighted_f1}")
选择那种平均值,取决于具体情况,包括不同类别的重要性和样本分布的综合考虑。对于微观、宏观和加权平均 F1 分数的清晰解释,您可以参考这篇 Towards Data Science 的博客。通过简单的示例,帮助您理解多类别分类中微观平均、宏观平均和加权平均 F1 分数背后的概念。
📚️ 参考链接:
-
sklearn.metrics.balanced_accuracy_score
-
User Guide - 3.3.2.4. Balanced accuracy score
-
sklearn.metrics.f1_score
-
3.3.2.9. Precision, recall and F-measures