вычислить максимальный балл f1, используя precision_recall_curve?

Для простой задачи бинарной классификации я хотел бы найти, какое пороговое значение максимизирует показатель f1, который является гармоническим средним значением точности и полноты. Есть ли встроенный в scikit урок, который делает это? Прямо сейчас я просто звоню

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

И затем я могу вычислить счет f1, используя информацию по каждому индексу в триплете массивов:

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

Есть ли лучший способ сделать это, или это то, как предполагалось использовать библиотеку? Спасибо.


person information_interchange    schedule 16.07.2019    source источник
comment
Примечание. Я использую классификатор XGBoost с двоичным логистическим выводом, если это что-то меняет.   -  person information_interchange    schedule 16.07.2019


Ответы (2)


После вычисления точности, отзыва и пороговых значений вы получаете массивы 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))
person Mike Alexander Doepking    schedule 10.10.2019
comment
что, если мы заботимся о взвешенном счете f1? Для учета несбалансированных классов - person Luca Guarro; 07.04.2021

Иногда precision_recall_curve выбирает несколько пороговых значений, которые слишком высоки для данных, поэтому вы получаете точки, где и precision, и recall равны нулю. Это может привести к nans при подсчете очков F1. Чтобы обеспечить правильный вывод, используйте 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)]
person Craig Bidstrup    schedule 09.03.2021