Klassifikator mit einstellbarer Präzision gegen Rückruf

11

Ich arbeite an einem Problem der binären Klassifizierung, bei dem es viel wichtiger ist, keine falsch positiven Ergebnisse zu erzielen. ziemlich viele falsche Negative sind in Ordnung. Ich habe zum Beispiel eine Reihe von Klassifikatoren in sklearn verwendet, aber ich denke, keiner von ihnen hat die Möglichkeit, den Kompromiss zwischen Präzisionsrückruf explizit anzupassen (sie liefern ziemlich gute Ergebnisse, sind aber nicht einstellbar).

Welche Klassifikatoren haben eine einstellbare Präzision / Rückruf? Gibt es eine Möglichkeit, den Präzisions- / Rückruf-Kompromiss bei Standardklassifizierern wie Random Forest oder AdaBoost zu beeinflussen?

Alex ich
quelle

Antworten:

12

Fast alle Klassifikatoren von scikit-learn können Entscheidungswerte (über decision_functionoder predict_proba) angeben .

Basierend auf den Entscheidungswerten ist es einfach, Präzisionsrückruf- und / oder ROC-Kurven zu berechnen. scikit-learn bietet diese Funktionen in seinem Metrik- Submodul.

Ein minimales Beispiel, vorausgesetzt Sie haben dataund labelsmit entsprechendem Inhalt:

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
quelle
Perfekt, danke! Ich bin mir nicht sicher, wie ich das verpasst habe :)
Alex I
Sieht aus wie precision_recall_curvedie gesamte F1 berechnen. Wie berechnet man nur die negativen?
Mithril
6

Ich habe dies gerade für mich selbst gelöst, bevor ich auf dieses Q gestoßen bin, also habe ich beschlossen, meine Lösung zu teilen.

Es verwendet den gleichen Ansatz, den Marc Claesen vorgeschlagen hat, beantwortet jedoch die eigentliche Frage, wie der Klassifikator so angepasst werden kann, dass er sich auf der Präzisionsachse höher bewegt, wenn der Rückruf abgewickelt wird.

X_test sind die Daten und y_test sind die wahren Bezeichnungen. Der Klassifikator sollte bereits montiert sein.

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

Und auf diese Weise würden Sie den neu erlernten Mindestschwellenwert verwenden, um Ihre Vorhersage anzupassen (die Sie sonst nur als Vorhersage (X_test) bezeichnen würden).

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

Würde mich freuen, Ihr Feedback zu diesem Anpassungsrezept zu hören.

Diego
quelle