对高度不平衡的数据进行适当的 f1 评分

问题描述

我对三种不同的 f1 计算感到困惑。对于严重不平衡的数据,我应该使用哪个 f1 评分?我正在研究严重不平衡的二元分类

‘f1’
‘f1_micro’
‘f1_macro’
‘f1_weighted’

另外,我想在 balanced_accuracy_score(y_true,y_pred,adjusted=True) 评分参数中添加 balanced_accuracy。如何将其合并到我的代码中?

from sklearn.model_selection import cross_validate
from sklearn.metrics import make_scorer
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from imblearn.metrics import geometric_mean_score
X,y = load_breast_cancer(return_X_y=True)

gm_scorer = make_scorer(geometric_mean_score,greater_is_better=True)
scores = cross_validate(LogisticRegression(max_iter=100000),X,y,cv=5,scoring={'gm_scorer': gm_scorer,'F1': 'f1','Balanced Accuracy': 'balanced_accuracy'}
)
scores

解决方法

f1_micro 用于全局 f1,而 f1_macro 取单个类的 f1,然后取平均值。

它类似于 precision 及其在 sklearn 中的微观、宏观、权重参数。请检查 SO 帖子 Type of precision,其中我解释了差异。 f1 score 基本上是一种同时考虑precision和recall的方法。

另外,根据documentation

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

'macro':计算每个标签的指标,并找到它们的未加权平均值。这没有考虑标签不平衡。

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

对于您的具体情况,您可能希望使用 f1_macro(类 f1 的未加权平均值)或 f1_weighted(类 f1 的权重平均值),因为 f1_micro高对 f1 的类别贡献。