Классификатор с регулируемой точностью и отзывом

11

Я работаю над проблемой бинарной классификации, где гораздо важнее не иметь ложных срабатываний; довольно много ложных негативов в порядке. Например, я использовал несколько классификаторов в sklearn, но я думаю, что ни один из них не имеет возможности явно регулировать компромисс между точностью и отзывом (они дают довольно хорошие результаты, но не могут быть изменены).

Какие классификаторы имеют регулируемую точность / отзыв? Есть ли способ повлиять на компромисс между точностью и отзывом на стандартные классификаторы, например, Random Forest или AdaBoost?

Алекс я
источник

Ответы:

12

Почти все классификаторы scikit-learn могут давать значения решений (через decision_functionили predict_proba).

Основываясь на значениях решения, легко вычислить кривые точности и / или ROC. scikit-learn предоставляет эти функции в своем подмодуле метрик .

Минимальный пример, при условии, что у вас есть dataи labelsс соответствующим содержанием:

import sklearn.svm
import sklearn.metrics
from matplotlib import pyplot as plt

clf = sklearn.svm.LinearSVC().fit(data, labels)
decision_values = clf.decision_function(data)

precision, recall, thresholds = sklearn.metrics.precision_recall_curve(labels, decision_values)

plt.plot(recall, precision)
plt.show()
Марк Клазен
источник
Отлично спасибо! Не уверен, как я это пропустил :)
Алекс I
Похоже, precision_recall_curveрассчитать весь F1. Как рассчитать только отрицательные?
Мифрил
6

Я только что решил это для себя, прежде чем наткнуться на этот вопрос, поэтому я решил поделиться своим решением.

Он использует тот же подход, который предложил Марк Клазен, но отвечает на актуальный вопрос о том, как настроить классификатор, чтобы подняться выше по оси точности, торгуя вне отзыва.

X_test - это данные, а y_test - истинные метки. Классификатор должен быть уже установлен.

y_score = clf.decision_function(X_test)

prcsn,rcl,thrshld=precision_recall_curve(y_test,y_score)

min_prcsn=0.25 # here is your precision lower bound e.g. 25%
min_thrshld=min([thrshld[i] for i in range(len(thrshld)) if prcsn[i]>min_prcsn])

И это то, как вы будете использовать недавно изученный минимальный порог для корректировки вашего прогноза (который в противном случае вы бы просто получили, вызывая предикат (X_test))

y_pred_adjusted=[1 if y_s>min_thrshld else 0 for y_s in y_score]

Было бы здорово услышать ваши отзывы на этот рецепт корректировки.

Диего
источник
1

Вот функция

http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier.predict_proba

который производит вероятности класса. Затем используйте различные метрики для настройки порога P, который вы используете при принятии решения, следуя псевдокоду

если p (y)> P, то y = 1, иначе y = 0 endif

Аналитик
источник