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?

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

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.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.