Klasyfikator z regulowaną precyzją vs przywołanie

11

Pracuję nad problemem klasyfikacji binarnej, w której znacznie ważniejsze jest, aby nie mieć fałszywych trafień; całkiem sporo fałszywych negatywów jest w porządku. Użyłem na przykład wielu klasyfikatorów w sklearn, ale myślę, że żaden z nich nie ma możliwości wyraźnego dostosowania kompromisu przywoływania precyzji (dają całkiem dobre wyniki, ale nie można ich regulować).

Jakie klasyfikatory mają regulowaną dokładność / przywołanie? Czy jest jakiś sposób, aby wpłynąć na kompromis precyzji / wycofania w przypadku standardowych klasyfikatorów, np. Random Forest lub AdaBoost?

Alex I.
źródło

Odpowiedzi:

12

Prawie wszystkie klasyfikatory scikit-learn mogą podawać wartości decyzyjne (przez decision_functionlub predict_proba).

Na podstawie wartości decyzji łatwo jest obliczyć krzywe przywołania dokładności i / lub ROC. scikit-learn udostępnia te funkcje w podmodule metryk .

Minimalny przykład, zakładając, że masz datai labelsz odpowiednią zawartością:

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()
Marc Claesen
źródło
Perfekcyjnie, dziękuję! Nie jestem pewien, jak mi tego brakowało :)
Alex I
Wygląda na to, żeby precision_recall_curveobliczyć całą F1. Jak obliczyć tylko te negatywne?
Mithril,
6

Właśnie rozwiązałem ten problem, zanim wpadłem na to pytanie, więc postanowiłem podzielić się moim rozwiązaniem.

Wykorzystuje to samo podejście, które zaproponował Marc Claesen, ale odpowiada na aktualne pytanie, w jaki sposób dostosować klasyfikator, aby przejść wyżej na osi precyzyjnej, wycofując się z wycofania.

X_test to dane, a y_test to prawdziwe etykiety. Klasyfikator powinien być już zamontowany.

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])

I w ten sposób użyjesz nowo nauczonego minimalnego progu, aby skorygować swoje przewidywania (w przeciwnym razie dostaniesz wywołanie przewidywania (X_test))

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

Byłoby miło usłyszeć Twoją opinię na temat tego przepisu na dostosowanie.

Diego
źródło