85 votes

Score de précision ValueError : Impossible de traiter le mélange de cibles binaires et continues.

J'utilise linear_model.LinearRegression de scikit-learn comme modèle prédictif. Cela fonctionne et c'est parfait. J'ai un problème pour évaluer les résultats prédits à l'aide de la fonction accuracy_score métrique.

C'est ma vraie Data :

array([1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0])

Mes prévisions pour Data :

array([ 0.07094605,  0.1994941 ,  0.19270157,  0.13379635,  0.04654469,
    0.09212494,  0.19952108,  0.12884365,  0.15685076, -0.01274453,
    0.32167554,  0.32167554, -0.10023553,  0.09819648, -0.06755516,
    0.25390082,  0.17248324])

Mon code :

accuracy_score(y_true, y_pred, normalize=False)

Message d'erreur :

ValueError: Can't handle mix of binary and continuous target

0 votes

Vous voulez bien accepter la réponse ?

23voto

natalinobusa Points 136
accuracy_score(y_true, y_pred.round(), normalize=False)

si vous préférez avoir plus de contrôle sur le seuil utiliser (y_pred>threshold).astype(int) au lieu de y_pred.round()threshold est votre valeur pour séparer les deux classes.

10voto

Amey Yadav Points 467

Accuracy_score est une métrique de classification, vous ne pouvez pas l'utiliser pour un problème de régression.

Vous pouvez voir les métriques de régression disponibles ici

6voto

JohnnyQ Points 143

Le problème est que le vrai y est binaire (zéros et uns), alors que vos prédictions ne le sont pas. Vous avez probablement généré des probabilités et non des prédictions, d'où le résultat :) Essayez plutôt de générer l'appartenance à une classe, et cela devrait fonctionner !

0 votes

LinearRegression produit des prédictions numériques, et non des probabilités ; le problème est dû à la tentative d'utiliser la précision dans un contexte de régression, ce qui n'a aucun sens, d'où l'erreur...

3voto

MLKing Points 111

Le site sklearn.metrics.accuracy_score(y_true, y_pred) La méthode définit y_pred as :

y_pred : 1d array-like, ou label indicator array / sparse matrix. Étiquettes prédites tel que retourné par un classificateur.

Ce qui signifie y_pred doit être un tableau de 1 ou 0 (étiquettes prédites). Il ne doit pas s'agir de probabilités.

Les étiquettes prédites (1 et 0) et/ou les probabilités prédites peuvent être générées à l'aide de l'algorithme de prédiction de probabilité. LinearRegression() méthodes du modèle predict() et predict_proba() respectivement.

1. Générer des étiquettes prédites :

LR = linear_model.LinearRegression()
y_preds=LR.predict(X_test)
print(y_preds)

sortie :

[1 1 0 1]

y_preds peut maintenant être utilisé pour le accuracy_score() méthode : accuracy_score(y_true, y_pred)

2. Générer des probabilités pour les étiquettes :

Certaines mesures telles que 'precision_recall_curve(y_true, probas_pred)' nécessitent des probabilités, qui peuvent être générées comme suit :

LR = linear_model.LinearRegression()
y_preds=LR.predict_proba(X_test)
print(y_preds)

sortie :

[0.87812372 0.77490434 0.30319547 0.84999743]

1 votes

LinearRegression renvoie des prédictions numériques, et certainement pas les probabilités ; ces dernières sont renvoyées par logistique modèles de régression.

2 votes

De scikit-learn LinearRegression fait pas inclure un predict_proba méthode ( docs ), et il serait en effet étrange que ce soit le cas. Avez-vous réellement exécuté les extraits de code que vous montrez ici ?

0 votes

Un conseil d'ami : garder des réponses erronées et invalides juste parce qu'elles ont obtenu des votes positifs n'est ni une bonne idée ni la façon dont le SO fonctionne. Je vous suggère gentiment de supprimer celle-ci (à long terme, ce sera aussi mieux pour votre réputation).

2voto

Manu CJ Points 606

Peut-être cela aidera-t-il quelqu'un qui se pose cette question :

Comme JohnnyQ l'a déjà souligné, le problème est que vous avez des valeurs non binaires (ni 0, ni 1) dans votre fichier y_pred c'est-à-dire qu'en ajoutant

print(((y_pred != 0.) & (y_pred != 1.)).any())

vous verrez True dans la sortie. (La commande cherche à savoir s'il existe une valeur qui n'est pas 0 ou 1).

Vous pouvez voir vos valeurs non binaires en utilisant :

non_binary_values = y_pred[(y_pred['score'] != 1) & (y_pred['score'] != 0)]
non_binary_idxs = y_pred[(y_pred['score'] != 1) & (y_pred['score'] != 0)].index

Une instruction print peut afficher les variables dérivées ci-dessus.

Enfin, cette fonction peut nettoyer vos données de toutes les entrées non binaires :

def remove_unlabelled_data(X, y):
    drop_indexes = X[(y['score'] != 1) & (y['score'] != 0)].index
    return X.drop(drop_indexes), y.drop(drop_indexes)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X