2016-06-24 8 views
10

nicht handhaben Ich verwende linear_model.LinearRegression von scikit-lernen als ein Vorhersagemodell. Es funktioniert und es ist perfekt. Ich habe ein Problem, die vorhergesagten Ergebnisse mit der Genauigkeitsmetrik zu bewerten. Dies ist meine wahren Daten:Accuracy Score: ValueError: Kann Mix von binären und kontinuierlichen

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

Und das ist meine prädiktive 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) 

Und dies ist die Fehlermeldung:

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

Hilfe? Vielen Dank.

+1

Was sind die dtypes? Kannst du 'y_true' einfach auf' numpy.int8' übertragen? Vielleicht suchen Sie stattdessen nach einer logistischen Regression, um kategoriale Variablen vorherzusagen? – Benjamin

+0

Es prüft die 'type_of_target (y_true)' und 'type_of_target (y_pred)' (in 'utils.multiclass.py'). Wenn das Array nur 2 eindeutige Werte hat, wird es als "binär" klassifiziert. – hpaulj

Antwort

8
accuracy_score(y_true, y_pred.round(), normalize=False) 

, wenn Sie es vorziehen, mehr Kontrolle über die Schwelle Verwendung haben (y_pred>threshold).astype(int) statt y_pred.round() wo threshold Ihr Wert ist, die zwei Klassen zu trennen.

+1

Sie können den Schnittpunkt auf 0,5 setzen oder sich für einen anderen Schwellenwert entscheiden, z. B. entsprechend der Roc-Kurve, und einen anderen Kompromiss zwischen Spezifität und Sensitivität wählen. Https://stats.stackexchange.com/questions/29719/ how-to-determine-best-cutoff-point-and-its-confidence-interval-using-roc-curve-i formulieren mehr Details zu den Statistiken. – natbusa

+0

Eine Anmerkung zu Ihrem vorhergesagten Array. Ich sehe, dass Sie dort negative Werte haben.Normalerweise sollten Sie Wahrscheinlichkeiten zwischen 0 und 1 haben. Sie könnten mit der Funktion softmax in Wahrscheinlichkeiten umwandeln, siehe http://stackoverflow.com/questions/34968722/softmax-function-python – natbusa

1

Das Problem ist, dass das wahre y ist binär (Nullen und Einsen), während Ihre Vorhersagen nicht sind. Sie haben wahrscheinlich Wahrscheinlichkeiten und keine Vorhersagen erzeugt, daher das Ergebnis :) Versuchen Sie stattdessen, Klassenzugehörigkeit zu generieren, und es sollte funktionieren!

1

Vielleicht hilft das jemand, der diese Frage findet:

Wie JohnnyQ bereits erwähnt, das Problem ist, dass Sie nicht binäre (nicht 0 noch 1) Werte in Ihrem y_pred, i. e. wenn

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

Zugabe werden Sie True in der Ausgabe sehen. (Der Befehl findet heraus, ob es einen Wert gibt, der nicht 0 oder 1 ist).

Sie können Ihre nicht-binären Werten sehen 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 print-Anweisung ausgeben kann die oben derivated Variablen.

Schließlich kann diese Funktion Ihre Daten aller nichtbinäres Einträge reinigen:

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) 
Verwandte Themen