问题描述
我对三种不同的 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 的类别贡献。