如何在 python 中使用多处理计算 f1 分数?
How to calculate f1 score using multiprocessing in python?
我有一组配对的二进制标签:y_true
、y_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
我有一组配对的二进制标签:y_true
、y_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