Classificateur avec précision réglable vs rappel

11

Je travaille sur un problème de classification binaire où il est beaucoup plus important de ne pas avoir de faux positifs; beaucoup de faux négatifs sont ok. J'ai utilisé un tas de classificateurs dans sklearn par exemple, mais je pense qu'aucun d'entre eux n'a la capacité d'ajuster explicitement le compromis précision-rappel (ils produisent de très bons résultats mais pas ajustables).

Quels classificateurs ont une précision / rappel réglable? Existe-t-il un moyen d'influencer le compromis précision / rappel sur les classificateurs standard, par exemple Random Forest ou AdaBoost?

Alex I
la source

Réponses:

12

Presque tous les classificateurs de scikit-learn peuvent donner des valeurs de décision (via decision_functionou predict_proba).

Sur la base des valeurs de décision, il est simple de calculer des courbes de rappel de précision et / ou ROC. scikit-learn fournit ces fonctions dans son sous-module de métriques .

Un exemple minimal, en supposant que vous avez dataet labelsavec un contenu approprié:

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
la source
Parfait, merci! Je ne sais pas comment j'ai raté ça :)
Alex I
On dirait precision_recall_curvecalculer la F1 entière. Comment calculer uniquement les négatifs?
Mithril
6

Je viens de résoudre ce problème pour moi-même avant de tomber sur ce Q, j'ai donc décidé de partager ma solution.

Il utilise la même approche que celle proposée par Marc Claesen mais répond à la question actuall sur la façon d'ajuster le classificateur pour se déplacer plus haut sur un axe de précision en échange du rappel.

X_test est les données et y_test sont les vraies étiquettes. Le classificateur doit déjà être installé.

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

Et c'est ainsi que vous utiliseriez le seuil minimal nouvellement appris pour ajuster votre prédiction (que vous obtiendriez autrement simplement appeler predire (X_test))

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

Ce serait formidable d'entendre vos commentaires sur cette recette d'ajustement.

Diego
la source