Genauigkeit Punktzahl ValueError: nicht Verarbeiten Kann mischen von binären und kontinuierlichen soll
Ich bin mit linear_model.LinearRegression
von scikit-learn als ein prädiktives Modell aus. Es funktioniert und es ist perfekt. Ich habe ein problem, zu bewerten, die prognostizierten Ergebnisse mit der accuracy_score
Metrik.
Dies ist meine wahre Daten :
array([1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0])
Meine vorhergesagten Daten:
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: nicht verarbeiten Kann mischen von binären und kontinuierlichen soll
Helfen ? Danke.
- Was sind die dtypes? Kann Sie nur gegossen
y_true
zunumpy.int8
? Vielleicht suchen Sie Logistische regression statt, um vorherzusagen, kategoriale Variablen? - Es ist die überprüfung der
type_of_target(y_true)
undtype_of_target(y_pred)
(inutils.multiclass.py
). Wenn das array nur 2 eindeutige Werte es ist klassifiziert alsbinary
. - Freundlicherweise darüber informiert werden, dass die Antwort, die Sie angenommen haben, ist falsch; die Ursache des Fehlers ist, dass Sie versuchen, Sie auf anwenden, um die Genauigkeit der Metrik, die in einer linearen regression (d.h. numerische Vorhersage) Einstellung, die bedeutungslos. Siehe Antwort unten für details...
- Kurz gesagt: ich denke, das problem ist, dass Sie binäre Ziel, und Sie haben gebaut, ein regressor, wo stattdessen sollten Sie mit einem Klassifizierer. Verwenden
LogisticRegression
statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
BEARBEITEN (nach dem Kommentar): die unten zu lösen, wird die Codierung Problem, aber ist sehr nicht empfohlen verwenden diesen Ansatz, da ein lineares Regressionsmodell ist ein sehr schlechter Klassifizierer, die sehr wahrscheinlich nicht trennen Sie die Klassen richtig.
Lesen der gut geschriebenen Antwort unten von @desertnaut, zu erklären, warum dieses Fehlers ist ein Hinweis für etwas falsch in das machine-learning-Ansatz eher als etwas, das Sie haben, zu "reparieren".
LinearRegression
, nichtLogisticRegression
), das ist sinnlos...Trotz der Vielzahl von falschen Antworten hier, die versuchen, Sie zu umgehen Sie den Fehler, indem numerisch Manipulation der Prognosen, die Ursache Ihrer Fehler ist ein theoretische und nicht rechnerische Problem: Sie versuchen, eine Klassifizierung Metrik (Genauigkeit) in eine regression (d.h. numerische Vorhersage) Modell (
LinearRegression
), die bedeutungslos.Ebenso wie die Mehrheit der performance-Metriken, Genauigkeit vergleicht äpfel mit äpfel (ich.e wahre Etiketten 0/1 mit Vorhersagen wieder 0/1); also, wenn Sie Sie bitten, die Funktion zum vergleichen von binären wahr Etiketten (äpfel) mit der kontinuierlichen Vorhersagen (Orangen), Sie bekommen einen erwarteten Fehler, wo die Nachricht sagt Ihnen genau, was das problem ist von einem computational Sicht:
Trotz, dass die Nachricht nicht, sagen Sie direkt, dass Sie versuchen, zu berechnen, eine Metrik, die ungültig für dein problem (und sollten wir nicht eigentlich erwarten, dass es, so weit zu gehen), ist es sicherlich eine gute Sache, scikit-learn zumindest gibt Sie eine direkte und explizite Warnung, dass Sie versuchen etwas falsch; ist dies nicht unbedingt der Fall mit anderen frameworks, siehe zum Beispiel die Verhalten von Keras in einer sehr ähnlichen situation, wo Sie erhalten keine Warnung an alle, und man endet nur bis beschweren für niedriger "Genauigkeit" in einer regression Einstellung...
Ich bin super-überrascht, mit all den anderen Antworten hier (einschließlich der akzeptiert & hoch von Ihnen positiv bewertet werden eine) effektiv darauf hindeutet, zu manipulieren, die Vorhersagen, um Sie einfach loszuwerden, die Fehler; es ist wahr, dass, einmal landen wir mit einer Reihe von zahlen, können wir sicherlich beginnen, sich mit Ihnen auf verschiedene Weise (Rundung, Binarisierung usw.), um unseren code zu Verhalten, aber das bedeutet natürlich nicht, dass unsere numerischen Manipulationen sind sinnvolle in den spezifischen Kontext des ML-Problems, das wir zu lösen versuchen.
So, zum Abschluss: das problem ist, dass Sie der Anwendung einer Metrik (Genauigkeit), die unangemessen für Ihr Modell (
LinearRegression
): wenn Sie eine Einstufung festlegen, sollten Sie Ihr Modell (z.B. EinsatzLogisticRegression
statt); wenn Sie in eine regression (d.h. numerische Vorhersage) festlegen, sollten Sie die Metrik. Überprüfen Sie die Liste der Metriken verfügbar in scikit-learn, wo Sie bestätigen können, dass die Genauigkeit ist nur verwendet in der Klassifizierung.Vergleichen Sie auch die situation mit einem letzten Frage ALSO, wo die OP ist zu versuchen, um die Genauigkeit einer Liste von Modellen:
wo die ersten 6 Modelle arbeiten OK, der rest (auskommentierte) diejenigen, die den gleichen Fehler. Von nun an solltest du in der Lage sein, sich selbst davon zu überzeugen, dass alle die auskommentierte Modelle regression (und nicht die Klassifizierung) diejenigen, daher der Fehler gerechtfertigt.
Eine Letzte wichtige Anmerkung: es mag legitim für jemanden zu behaupten:
Eigentlich hat das bereits vorgeschlagen worden, in mehreren anderen Antworten hier, implizit oder nicht; dies ist wiederum eine ungültig Ansatz (und die Tatsache, dass Sie negative Vorhersagen haben, sollten bereits alarmiert, dass Sie nicht interpretiert werden als Wahrscheinlichkeiten). Andrew Ng, in seinem populären Maschine-Learning-Kurs bei Coursera, erklärt, warum dies eine schlechte Idee ist - siehe seine Vortrag 6.1 - Logistische Regression | Klassifikation auf Youtube (Erklärung beginnt bei ~ 3:00), sowie im Abschnitt 4.2 Warum Nicht Lineare Regression [für die Einstufung]? der (sehr Empfehlenswerte und frei verfügbar) lehrbuch Eine Einführung in die Statistischen Lernens von Hastie, Tibshirani und Mitarbeiter...
accuracy_score ist eine Klassifikation, die Metrik, die Sie verwenden können es für eine regression-problem.
Sehen Sie die verfügbaren regression Metriken hier
Den sklearn.Metriken.accuracy_score(y_true, y_pred) - Methode definiert y_pred als:
y_pred : 1d-array-like, oder label indicator array /sparse-matrix. Vorhergesagten Etiketten, zurückgegeben durch einen Klassifizierer.
Was bedeutet y_pred hat, um ein array von 1 s oder 0 s (ausgesagt Etiketten). Sollten Sie nicht Wahrscheinlichkeiten.
Die ausgesagt Etiketten (1 und 0) und/oder vorhergesagten Wahrscheinlichkeiten erzeugt werden kann, mit Hilfe der LinearRegression () - Modell die Methoden predict() und predict_proba() bzw..
1. Generieren vorhergesagten labels:
Ausgabe:
'y_preds' kann jetzt verwendet werden, für die accuracy_score () - Methode:
accuracy_score(y_true, y_pred)
2. Generieren Wahrscheinlichkeiten für Etiketten:
Einige Metriken wie 'precision_recall_curve(y_true, probas_pred)" erfordern Wahrscheinlichkeiten, die erzeugt werden kann, wie folgt:
Ausgabe:
LinearRegression
gibt numerische Vorhersagen, und sicherlich nicht Wahrscheinlichkeiten; der letztere kehrte von Logistik regression-Modelle.LinearRegression
hat nicht sind einepredict_proba
Methode (docs), und es wäre in der Tat seltsam, wenn Sie es Tat. Hast du eigentlich führen Sie den code-Schnipsel, die Sie hier zeigen?Das problem ist, dass der wahre y Binär (Nullen und Einsen), während Ihre Vorhersagen nicht. Sie wahrscheinlich generiert Wahrscheinlichkeiten und keine Vorhersagen, daher ist das Ergebnis 🙂
Versuchen Sie stattdessen zu generieren-Klasse-Mitgliedschaft, und es sollte funktionieren!
LinearRegression
produziert numerische Vorhersagen, und nicht Wahrscheinlichkeiten; die Frage ist durch den Versuch, mit Präzision, die in eine regression Einstellung ist bedeutungslos, daher der Fehler...Vielleicht hilft dies ja jemand, der findet diese Frage:
Als JohnnyQ bereits darauf hingewiesen, das problem ist, dass Sie nicht-Binär (nicht 0 noch 1) die Werte in Ihrem
y_pred
ich. e. beim hinzufügensehen Sie
True
in der Ausgabe. (Der Befehl findet heraus, ob es irgendeinen Wert, der nicht 0 oder 1).Können Sie Ihre nicht-binäre Werte mit:
Einer print-Anweisung ausgegeben werden können, die oben abgeleitete Variablen.
Schließlich, diese Funktion reinigen können Sie Ihre Daten von allen nicht-binäre Einträge:
Im Fall erhalten Sie diese Fehlermeldung, wenn mit Orange Bibliothek (verwendet sklearn unter der Haube).
Ich hatte numpy==1.14.5 installiert einige andere python-Paket. Die Lösung war, manuell aktualisieren, numpy, um 1.16.4:
pip install -U numpy=1.16.4