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?
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])
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 .
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!