web-dev-qa-db-fra.com

Contrôle du seuil dans la régression logistique dans Scikit Learn

J'utilise la méthode LogisticRegression() dans scikit-learn Sur un ensemble de données très déséquilibré. J'ai même transformé la fonction class_weight En auto.

Je sais que dans la régression logistique, il devrait être possible de savoir quelle est la valeur seuil pour une paire particulière de classes.

Est-il possible de connaître la valeur seuil dans chacune des classes One-vs-All conçues par la méthode LogisticRegression()?

Je n'ai rien trouvé dans la page de documentation.

Applique-t-il par défaut la valeur 0.5 Comme seuil pour toutes les classes quelles que soient les valeurs des paramètres?

20
London guy

Oui, Sci-Kit learn utilise un seuil de P> 0,5 pour les classifications binaires. Je vais m'appuyer sur certaines des réponses déjà publiées avec deux options pour vérifier cela:

Une option simple consiste à extraire les probabilités de chaque classification en utilisant la sortie du segment model.predict_proba (test_x) du code ci-dessous ainsi que les prédictions de classe (sortie du segment model.predict (test_x) du code ci-dessous). Ensuite, ajoutez les prédictions de classe et leurs probabilités à votre trame de données de test à titre de vérification.

Comme autre option, on peut visualiser graphiquement la précision par rapport au rappel à différents seuils en utilisant le code suivant.

### Predict test_y values and probabilities based on fitted logistic 
regression model

pred_y=log.predict(test_x) 

probs_y=log.predict_proba(test_x) 
  # probs_y is a 2-D array of probability of being labeled as 0 (first 
  column of 
  array) vs 1 (2nd column in array)

from sklearn.metrics import precision_recall_curve
precision, recall, thresholds = precision_recall_curve(test_y, probs_y[:, 
1]) 
   #retrieve probability of being 1(in second column of probs_y)
pr_auc = metrics.auc(recall, precision)

plt.title("Precision-Recall vs Threshold Chart")
plt.plot(thresholds, precision[: -1], "b--", label="Precision")
plt.plot(thresholds, recall[: -1], "r--", label="Recall")
plt.ylabel("Precision, Recall")
plt.xlabel("Threshold")
plt.legend(loc="lower left")
plt.ylim([0,1])
7
sri bandhakavi

La régression logistique choisit la classe qui a la plus grande probabilité. Dans le cas de 2 classes, le seuil est de 0,5: si P (Y = 0)> 0,5 alors évidemment P (Y = 0)> P (Y = 1). Il en va de même pour le paramètre multiclasse: encore une fois, il choisit la classe avec la plus grande probabilité (voir par exemple conférences de Ng , les lignes de fond).

L'introduction de seuils spéciaux n'affecte que la proportion de faux positifs/faux négatifs (et donc de compromis précision/rappel), mais ce n'est pas le paramètre du modèle LR. Voir aussi la question similaire .

12
Nikita Astrakhantsev

Il y a une petite astuce que j'utilise, au lieu d'utiliser model.predict(test_data) use model.predict_proba(test_data). Utilisez ensuite une plage de valeurs pour les seuils pour analyser les effets sur la prédiction;

pred_proba_df = pd.DataFrame(model.predict_proba(x_test))
threshold_list = [0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,.7,.75,.8,.85,.9,.95,.99]
for i in threshold_list:
    print ('\n******** For i = {} ******'.format(i))
    Y_test_pred = pred_proba_df.applymap(lambda x: 1 if x>i else 0)
    test_accuracy = metrics.accuracy_score(Y_test.as_matrix().reshape(Y_test.as_matrix().size,1),
                                           Y_test_pred.iloc[:,1].as_matrix().reshape(Y_test_pred.iloc[:,1].as_matrix().size,1))
    print('Our testing accuracy is {}'.format(test_accuracy))

    print(confusion_matrix(Y_test.as_matrix().reshape(Y_test.as_matrix().size,1),
                           Y_test_pred.iloc[:,1].as_matrix().reshape(Y_test_pred.iloc[:,1].as_matrix().size,1)))

Meilleur!

8
jazib jamil