2016-06-24 35 views
10

Sto utilizzando linear_model.LinearRegression da scikit-learn come modello predittivo. Funziona ed è perfetto. Ho un problema per valutare i risultati previsti utilizzando la metrica accuracy_score. Questo è il mio vero dati:Precisione Punteggio: Valore Errore: impossibile gestire il mix di binario e continuo

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

E questo è il mio dati predittiva:

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

Il mio codice:

accuracy_score(y_true, y_pred, normalize=False) 

E questo è il messaggio di errore:

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

Aiuto? Grazie.

+1

Quali sono le dtypes? Puoi semplicemente lanciare 'y_true' in' numpy.int8'? Forse stai invece cercando la regressione logistica, per prevedere le variabili categoriali? – Benjamin

+0

Sta controllando 'type_of_target (y_true)' e 'type_of_target (y_pred)' (in 'utils.multiclass.py'). Se l'array ha solo 2 valori univoci, viene classificato come 'binary'. – hpaulj

risposta

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

se si preferisce avere un maggiore controllo sull'uso di soglia (y_pred>threshold).astype(int) invece di y_pred.round() dove threshold è il vostro valore per separare le due classi.

+1

È possibile impostare il punto di taglio su 0,5 o decidere per un'altra soglia, ad esempio secondo la curva del roc, e avere un diverso compromesso tra specificità e sensibilità, controllare https://stats.stackexchange.com/questions/29719/ how-to-determinare-best-cut-point-and-its-confidence-interval-using-roc-curve-i formano più dettagli sulle statistiche. – natbusa

+0

Una nota sull'array previsto. Vedo che hai valori negativi lì.Normalmente dovresti avere probabilità tra 0 e 1. Potresti convertire in probabilità usando la funzione softmax vedi http://stackoverflow.com/questions/34968722/softmax-function-python – natbusa

1

Il problema è che il vero y è binario (zero e uno), mentre le previsioni non lo sono. Probabilmente hai generato probabilità e non previsioni, quindi il risultato :) Prova invece a generare l'appartenenza alla classe, e dovrebbe funzionare!

1

Forse questo aiuta qualcuno che trova questa domanda:

Come JohnnyQ già sottolineato, il problema è che avete non binari (non 0 né 1) i valori nel vostro y_pred, i. e. quando si aggiunge

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

si vedrà True nell'output. (Il comando rileva se esiste un valore diverso da 0 o 1).

Puoi vedere i tuoi valori non binari utilizzando:

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 

un'istruzione print possibile l'uscita variabili di cui sopra Derivate.

Infine, questa funzione può pulire i dati di tutte le voci non binari:

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)