web-dev-qa-db-fra.com

Score de précision ValueError: impossible de gérer 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évus à l'aide de la métrique accuracy_score . C'est ma vraie donnée:

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

Mes données prédictives:

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: Impossible de gérer le mélange de cibles binaires et continues

Aidez-moi ? Je vous remercie.

30
DataAddicted

EDIT (après commentaire): le paragraphe ci-dessous résoudra le problème de codage, mais il est fortement pas recommandé d’utiliser cette approche car un modèle de régression linéaire est un très mauvais classifieur, qui ne séparera probablement pas les classes correctement. 

Lisez la réponse bien écrite ci-dessous de @desertnaut, expliquant pourquoi cette erreur est un indice de quelque chose qui ne va pas dans la méthode d’apprentissage automatique plutôt que de quelque chose que vous devez «réparer».

accuracy_score(y_true, y_pred.round(), normalize=False)
23
natbusa

La méthode sklearn.metrics. precision_score (y_true, y_pred) définit y_pred comme suit: 

y_pred : 1d semblable à un tableau, ou un indicateur de tableau/matrice fragmentéeÉtiquettes prédites, telles qu'elles sont renvoyées par un classificateur.

Ce qui signifie que y_pred doit être un tableau de 1 ou de 0 (étiquettes prédiquées). Ils ne devraient pas être des probabilités.

Les libellés prédits (1 et 0) et/ou les probabilités prédites peuvent être générés à l'aide des méthodes du modèle LinearRegression () 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 la méthode precision_score (): accuracy_score(y_true, y_pred)

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

Certaines métriques 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]

4
MLKing

precision_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

2
Amey Yadav

Peut-être que cela aide quelqu'un qui trouve cette question:

Comme JohnnyQ l’a déjà souligné, le problème est que vous avez des valeurs non binaires (et non 0 ni 1) dans votre y_pred, i. e. lors de l'ajout

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

vous verrez True dans la sortie. (La commande recherche s'il existe une valeur autre que 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 générer 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)
1
Manu CJ

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 suivant:) Essayez plutôt de générer une appartenance à une classe, et cela devrait fonctionner!

0
JohnnyQ