如何在 python 中使用多处理计算 f1 分数?

How to calculate f1 score using multiprocessing in python?

我有一组配对的二进制标签:y_truey_pred。 我的数组包含 ~5000 万 个元素,我希望最好使用 f1 score 或 AUC 来评估成功。

然而,使用 sklearn 计算 f1 需要相对较长的时间——大约是整个 epoch 所需时间的一半。计算 AUC 更快,但也太慢了。 类似的问题产生了 Faster AUC in sklearn or python ,但我不确定我可以试试这个。

有没有办法加快这些计算,或许可以使用多处理?

好吧,显然 Scikit-learn 实现 运行 在我的两个向量上太慢了,所以我修改了 this implementation,所以它适合 numpy 数组,现在快得多(0.25 秒与sk-learn 超过 50 秒)。使用 torch.Tensors.

的原始实现
def f1_loss(y_true, y_pred, beta=1) -> numpy.float32:
    '''Calculate F1 score.
    
    The original implmentation is written by Michal Haltuf on Kaggle.
    
    Reference
    ---------
    - https://www.kaggle.com/rejpalcz/best-loss-function-for-f1-score-metric
    - https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html#sklearn.metrics.f1_score
    - https://discuss.pytorch.org/t/calculating-precision-recall-and-f1-score-in-case-of-multi-label-classification/28265/6
    
    '''
    assert y_true.shape[1] == 1
    assert y_pred.shape[1] == 1
        
    
    tp = (y_true * y_pred).sum()
    tn = ((1 - y_true) * (1 - y_pred)).sum()
    fp = ((1 - y_true) * y_pred).sum()
    fn = (y_true * (1 - y_pred)).sum()
    
    epsilon = 1e-7
    
    precision = tp / (tp + fp + epsilon)
    recall = tp / (tp + fn + epsilon)
    
    f1 = (1 + beta**2)* (precision*recall) / (beta**2 * precision + recall + epsilon)

    return f1