使用precision_recall_curve计算最大f1分数?

时间:2019-07-16 15:37:26

标签: python scikit-learn statistics classification precision-recall

对于一个简单的二进制分类问题,我想找到哪种阈值设置可使f1得分最大化,这是精度和召回率的调和平均值。 scikit是否有内置的学习功能?现在,我只是打

precision, recall, thresholds = precision_recall_curve(y_test, y_test_predicted_probas)

然后,我可以使用数组三元组中每个索引处的信息来计算f1分数:

curr_f1 = compute_f1(precision[index], recall[index])

是否有更好的方法来执行此操作,或者这是打算如何使用该库?谢谢。

2 个答案:

答案 0 :(得分:2)

有时 precision_recall_curve 会选择一些对数据来说太高的阈值,因此您最终会得到 precisionrecall 都为零的点。在计算 F1 分数时,这可能会导致 nan。为确保输出正确,请使用 np.divide 仅在分母非零的地方进行除法:

precision, recall, thresholds = precision_recall_curve(y_test, y_test_predicted_probas)
numerator = 2 * recall * precision
denom = recall + precision
f1_scores = np.divide(numerator, denom, out=np.zeros_like(denom), where=(denom!=0))
max_f1 = np.max(f1_scores)
max_f1_thresh = thresholds[np.argmax(f1_scores)]

答案 1 :(得分:0)

计算精度,召回率和阈值得分后,您将获得NumPy数组。
只需使用NumPy函数来找到使F1-Score最大化的阈值:

f1_scores = 2*recall*precision/(recall+precision)
print('Best threshold: ', thresholds[np.argmax(f1_scores)])
print('Best F1-Score: ', np.max(f1_scores))