webentwicklung-frage-antwort-db.com.de

Accuracy Score ValueError: Mix aus binärem und kontinuierlichem Ziel kann nicht verarbeitet werden

Ich verwende linear_model.LinearRegression von scikit-learn als Vorhersagemodell. Es funktioniert und es ist perfekt. Ich habe ein Problem, die vorhergesagten Ergebnisse mit der accuracy_score-Metrik auszuwerten ..__ Dies sind meine wahren Daten:

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

Meine Vorhersagedaten:

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

Mein Code:

accuracy_score(y_true, y_pred, normalize=False)

Fehlermeldung:  

ValueError: Mix aus binärem und kontinuierlichem Ziel kann nicht verarbeitet werden

Hilfe ? Vielen Dank.

30
DataAddicted

BEARBEITEN (nach Kommentar): Das Folgende wird das Codierungsproblem lösen, ist aber hoch nicht empfohlen , um diesen Ansatz zu verwenden, da ein lineares Regressionsmodell ein sehr schlechter Klassifikator ist, der die Klassen wahrscheinlich nicht richtig voneinander trennen wird. 

Lesen Sie die gut geschriebene Antwort von @desertnaut und erläutern Sie, warum dieser Fehler ein Hinweis auf etwas Falsches beim maschinellen Lernen ist und nicht etwas, das Sie "beheben" müssen.

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

Trotz der Fülle falscher Antworten, die versuchen, den Fehler durch numerische Manipulation der Vorhersagen zu umgehen, ist die Ursache des Fehlers ein theoretisches und kein Rechenproblem: Sie versuchen, eine Klassifizierung -Metrik ( Genauigkeit) in einem Regressionsmodell (LinearRegression), dh bedeutungslos

Genau wie bei den meisten Leistungskennzahlen vergleicht die Genauigkeit Äpfel mit Äpfeln (d. H. Wahre Beschriftungen von 0/1 mit Vorhersagen von wiederum 0/1); Wenn Sie also die Funktion auffordern, binäre True-Labels (Äpfel) mit kontinuierlichen Vorhersagen (Orangen) zu vergleichen, wird ein erwarteter Fehler angezeigt, in dem die Nachricht Ihnen genau sagt, was das Problem aus Sicht von computational ist:

Classification metrics can't handle a mix of binary and continuous target

Obwohl die Nachricht Ihnen nicht direkt sagt, dass Sie versuchen, eine für Ihr Problem ungültige Metrik zu berechnen (und wir sollten nicht damit rechnen, dass es so weit geht), ist es sicherlich eine gute Sache, mit der scikit-learn ankommt Zumindest gibt es eine direkte und explizite Warnung, dass Sie etwas Falsches versuchen. Dies ist bei anderen Frameworks nicht unbedingt der Fall - siehe zum Beispiel Verhalten von Keras in einer sehr ähnlichen Situation , bei dem Sie überhaupt keine Warnung erhalten, und man beschwert sich nur für eine geringe "Genauigkeit" in a Regressionseinstellung ...

Ich bin mit all den anderen Antworten (einschließlich der akzeptierten und hoch aufgerufenen) sehr überrascht, die effektiv vorschlagen, die Vorhersagen zu manipulieren, um den Fehler einfach zu beseitigen. Es ist wahr, dass, wenn wir erst einmal eine Menge von Zahlen haben, wir uns auf verschiedene Weise (Rundung, Schwellenwertbildung usw.) damit vermischen können, damit sich unser Code verhält, aber dies bedeutet natürlich nicht, dass unsere numerischen Manipulationen dies sind aussagekräftig im spezifischen Kontext des ML-Problems, das wir zu lösen versuchen.

Zusammenfassend: das Problem ist, dass Sie eine Metrik (Genauigkeit) anwenden, die ungeeignet für Ihr Modell (LinearRegression) ist: Wenn Sie sich in einer Klassifizierung befinden, sollten Sie Ihr Modell ändern (verwenden Sie stattdessen LogisticRegression) ); Wenn Sie sich in einer Einstellung für die Regression (d. h. numerische Vorhersage) befinden, sollten Sie die Metrik ändern. Überprüfen Sie die Liste der in scikit-learn verfügbaren Metriken , in der Sie bestätigen können, dass Genauigkeit nur bei der Klassifizierung verwendet wird.

Vergleichen Sie auch die Situation mit einer letzten SO - Frage , bei der das OP versucht, die Genauigkeit einer Liste von Modellen zu ermitteln:

models = []
models.append(('SVM', svm.SVC()))
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
#models.append(('SGDRegressor', linear_model.SGDRegressor())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('BayesianRidge', linear_model.BayesianRidge())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('LassoLars', linear_model.LassoLars())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('ARDRegression', linear_model.ARDRegression())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('PassiveAggressiveRegressor', linear_model.PassiveAggressiveRegressor())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('TheilSenRegressor', linear_model.TheilSenRegressor())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('LinearRegression', linear_model.LinearRegression())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets

wo die ersten 6 Modelle funktionieren, während alle anderen (auskommentierten) den gleichen Fehler ergeben. Inzwischen sollten Sie sich selbst davon überzeugen können, dass alle auskommentierten Modelle eine Regression (und keine Klassifikation) sind, daher der begründete Fehler.

Ein letzter wichtiger Hinweis: Es mag legitim klingen, wenn jemand behauptet:

OK, aber ich möchte die lineare Regression verwenden und dann einfach runde/schwelle die Ergebnisse, wobei die Vorhersagen effektiv als .__ behandelt werden. "Wahrscheinlichkeiten" und damit Umwandlung des Modells in einen Klassifikator

Tatsächlich wurde dies bereits implizit oder nicht in mehreren anderen Antworten vorgeschlagen; Auch hier handelt es sich um einen invalid - Ansatz (und die Tatsache, dass Sie negative Vorhersagen haben, hätte Sie bereits darauf aufmerksam gemacht, dass sie nicht als Wahrscheinlichkeiten interpretiert werden können). Andrew Ng erklärt in seinem beliebten Machine Learning-Kurs bei Coursera, warum dies eine schlechte Idee ist - siehe seine Lecture 6.1 - Logistic Regression | Classification auf Youtube (Erklärung beginnt um ca. 3:00 Uhr) sowie Abschnitt 4.2 Warum keine lineare Regression [zur Klassifizierung]? des (hoch empfohlenen und frei verfügbaren) Lehrbuchs Eine Einführung in das statistische Lernen von Hastie, Tibshirani und Mitarbeitern ...

12
desertnaut

Die Methode sklearn.metrics. precision_score (y_true, y_pred) definiert y_pred als: 

y_pred : 1d Array-artige Matrix oder Label-Indikator-Array/Sparse-Matrix.Predicted Labels, wie von einem Klassifizierer zurückgegeben.

Was bedeutet, dass y_pred ein Array von 1en oder 0en (prädizierten Labels) sein muss. Sie sollten keine Wahrscheinlichkeiten sein.

Die vorhergesagten Markierungen (1 und 0) und/oder die vorhergesagten Wahrscheinlichkeiten können mit den Methoden predict () und predict_proba () des LinearRegression () - Modells generiert werden.

1. Generiere vorhergesagte Labels:

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

ausgabe: 

[1 1 0 1]

'y_preds' kann nun für die precision_score () - Methode verwendet werden: accuracy_score(y_true, y_pred)

2. Erzeuge Wahrscheinlichkeiten für Labels:

Einige Metriken wie 'precision_recall_curve (y_true, probas_pred)' erfordern Wahrscheinlichkeiten, die wie folgt generiert werden können:

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

ausgabe:

[0,87812372 0,77490434 0,30319547 0,84999743]

4
MLKing

precision_score ist eine Klassifizierungsmetrik. Sie können sie nicht für ein Regressionsproblem verwenden.

Hier können Sie die verfügbaren Regressionsmetriken sehen

2
Amey Yadav

Vielleicht hilft das jemandem, der diese Frage findet:

Wie JohnnyQ bereits angedeutet hat, besteht das Problem darin, dass Sie in Ihrem y_pred nicht binäre Werte (nicht 0 oder 1) haben. e. beim Hinzufügen

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

sie sehen True in der Ausgabe. (Der Befehl ermittelt, ob es einen Wert gibt, der nicht 0 oder 1 ist).

Sie können Ihre nicht-binären Werte anzeigen mit:

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

Eine Druckanweisung kann die oben abgeleiteten Variablen ausgeben.

Schließlich kann diese Funktion Ihre Daten von allen nicht-binären Einträgen bereinigen:

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

Das Problem ist, dass das wahre y binär ist (Nullen und Einsen), Ihre Vorhersagen jedoch nicht. Sie haben wahrscheinlich Wahrscheinlichkeiten und keine Vorhersagen generiert, daher das Ergebnis:).

0
JohnnyQ