Clasificador con precisión ajustable vs recuperación

11

Estoy trabajando en un problema de clasificación binaria en el que es mucho más importante no tener falsos positivos; bastantes falsos negativos está bien. Por ejemplo, he usado un montón de clasificadores en sklearn, pero creo que ninguno de ellos tiene la capacidad de ajustar explícitamente la compensación de recuperación de precisión (producen resultados bastante buenos pero no ajustables).

¿Qué clasificadores tienen precisión ajustable / recuperación? ¿Hay alguna manera de influir en la compensación de precisión / recuperación en clasificadores estándar, por ejemplo, Random Forest o AdaBoost?

Alex I
fuente

Respuestas:

12

Casi todos los clasificadores de scikit-learn pueden dar valores de decisión (a través de decision_functiono predict_proba).

En función de los valores de decisión, es sencillo calcular las curvas de recuperación de precisión y / o ROC. scikit-learn proporciona esas funciones en su submódulo de métricas .

Un ejemplo mínimo, suponiendo que tenga datay labelscon el contenido apropiado:

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
fuente
¡Perfecto, gracias! No estoy seguro de cómo me perdí eso :)
Alex I
Parece que precision_recall_curvecalcula la F1 completa. ¿Cómo calcular solo los negativos?
Mithril
6

Acabo de resolver esto por mí mismo antes de toparme con esta Q, así que decidí compartir mi solución.

Utiliza el mismo enfoque que Marc Claesen ha propuesto, pero responde a la pregunta real sobre cómo ajustar el clasificador para moverse más arriba en el eje de precisión que se retira del retiro.

X_test son los datos y y_test son las etiquetas verdaderas. El clasificador ya debe estar instalado.

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

Y así es como usaría el umbral mínimo recién aprendido para ajustar su predicción (que de otro modo solo obtendría llamar a predic (X_test))

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

Sería genial escuchar sus comentarios sobre esta receta de ajuste.

Diego
fuente