精确率和召回率的几何平均值

时间:2021-01-02 21:33:10

标签: python python-3.x machine-learning classification metrics

我正在尝试制定自定义指标来评估 ML 模型。我想对精确度和召回率进行加权几何平均,并以一种优先考虑召回率而不是精确度的方式对其进行加权。我知道几何平均值是 sqrt(精度 * 召回),但我不确定如何对其进行参数化以在 python 中更加重视召回。这个指标来自不平衡库,但我没有看到我可以提供的任何权重

imblearn.metrics.geometric_mean_score(y_true, y_pred, labels=None, pos_label=1, average='multiclass', sample_weight=None, correction=0.0)

知道如何在 python 中实现我想要的吗?

1 个答案:

答案 0 :(得分:0)

如果您面临 class-imbalance 问题,精确率和召回率之间的 multi-class geometric mean,由标签 supports(每个标签的位置样本数)加权是一个不错的选择(这是在您已链接的 imblearn API 中允许使用参数 average='weighted')。

但是,IIUC 不是您要找的。您正在尝试在 precisionrecall 之间使用 weighted geometric mean

我在流行的库中找不到加权几何平均值的任何实现,所以我为此编写了一个自定义函数。

您可以使用 precisionrecall 的 sklearn api 计算 y_truey_pred,然后使用该函数计算 weighted geometric mean

我已经根据以下 definition(第一种具有幂而不是指数的形式)编写了 weighted_geometric_mean 函数 -

enter image description here

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 精度和召回率。