如果您面临class-imbalance 问题,则在精确率和召回率之间的multi-class geometric mean,由标签supports(每个标签的位置样本数)加权是一个不错的选择(这在imblearn API 中是允许的,您已链接,参数average='weighted')。
但是,IIUC 并不是您想要的。您正在尝试在precision 和recall 之间使用weighted geometric mean。
我在流行的库中找不到任何加权几何平均值的实现,所以我为此编写了一个自定义函数。
您可以使用y_true 和y_pred 中的sklearn api 计算precision 和recall,然后使用该函数计算weighted geometric mean。
我已经根据以下definition(第一种使用幂而不是指数的形式)编写了weighted_geometric_mean 函数-
from sklearn.metrics import precision_score, recall_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
precision = precision_score(y_true, y_pred, average='micro')
recall = recall_score(y_true, y_pred, average='micro')
#parameter 'micro' calculates metrics globally by counting the total TP, FN and FP
scores = [precision, recall]
weights = [0.6,0.4] #60% precision, 40% recall
def weighted_geometric_mean(scores, weights):
wgm = np.product(np.power(scores, weights))
return wgm
weighted_geometric_mean(scores, weights)
0.3333333333333333
上面的实现使用了全局精度和召回参数micro。如果你想考虑分类权重来计算准确率和召回率(对于类不平衡的情况),请将其设置为weighted
编辑:附带说明,全局精度和召回率之间的加权几何平均值总和为 1(60:40 或 50:50 等)将始终产生相同的最终值!您可以通过在其 TP、FP 形式中写入精度来得出这一点,对于 Recall 也是如此。因此,我建议标签支持 weighted 精度和召回率。