Classificador com precisão ajustável vs recall

11

Estou trabalhando em um problema de classificação binária em que é muito mais importante não ter falsos positivos; muitos falsos negativos estão ok. Eu usei vários classificadores no sklearn, por exemplo, mas acho que nenhum deles tem a capacidade de ajustar explicitamente o tradeoff de recall de precisão (eles produzem resultados muito bons, mas não ajustáveis).

Quais classificadores têm precisão / recall ajustável? Existe alguma maneira de influenciar a troca de precisão / recall em classificadores padrão, por exemplo, Random Forest ou AdaBoost?

Alex I
fonte

Respostas:

12

Quase todos os classificadores do scikit-learn podem fornecer valores de decisão (via decision_functionou predict_proba).

Com base nos valores de decisão, é fácil calcular curvas de precisão e / ou ROC. O scikit-learn fornece essas funções em seu submódulo de métricas .

Um exemplo mínimo, supondo que você tenha datae labelscom conteúdo apropriado:

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
fonte
Perfeito, obrigado! Não sei como eu perdi isso :)
Alex I
Parece precision_recall_curvecalcular todo o F1. Como calcular apenas os negativos?
Mithril
6

Acabei de resolver isso sozinho antes de me deparar com este Q, por isso decidi compartilhar minha solução.

Ele usa a mesma abordagem que Marc Claesen propôs, mas responde à pergunta atual sobre como ajustar o classificador para aumentar o deslocamento no recall de precisão no eixo de precisão.

X_test são os dados e y_test são os rótulos verdadeiros. O classificador já deve 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])

E é assim que você usaria o limite mínimo recém-aprendido para ajustar sua previsão (que, de outra forma, seria chamada de previsão (X_test))

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

Seria ótimo ouvir seus comentários sobre esta receita de ajuste.

Diego
fonte