2016-02-05 31 views
5

Nel lavoro su un modello di classificazione binario, il classificatore è naive bayes. Ho un insieme di dati quasi bilanciata però ricevo il seguente messaggio di errore quando prevedo:Scikit approva messaggio di errore "Precisione e F-score sono mal definiti e impostati su 0,0 nelle etichette"

UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. 
    'precision', 'predicted', average, warn_for) 

sto usando gridsearch con CV k-fold 10. Il set di prova e le previsioni contengono entrambe le classi, in modo da non lo faccio capisci il messaggio Sto lavorando sullo stesso set di dati, treno/test split, cv e random seed per altri 6 modelli e quelli funzionano perfettamente. I dati vengono importati esternamente in un dataframe, randomizzati e seed è stato risolto. Quindi il modello di classificazione naive bayes classifica il file all'inizio di questo snippet di codice.

X_train, X_test, y_train, y_test, len_train, len_test = \ 
    train_test_split(data['X'], data['y'], data['len'], test_size=0.4) 
pipeline = Pipeline([ 
    ('classifier', MultinomialNB()) 
]) 

cv=StratifiedKFold(len_train, n_folds=10) 

len_train = len_train.reshape(-1,1) 
len_test = len_test.reshape(-1,1) 

params = [ 
    {'classifier__alpha': [0, 0.0001, 0.001, 0.01]} 

] 

grid = GridSearchCV(
    pipeline, 
    param_grid=params, 
    refit=True, 
    n_jobs=-1, 
    scoring='accuracy', 
    cv=cv, 
) 

nb_fit = grid.fit(len_train, y_train) 

preds = nb_fit.predict(len_test) 

print(confusion_matrix(y_test, preds, labels=['1','0'])) 
print(classification_report(y_test, preds)) 

sono stato 'costretto' da python per alterare la forma della serie, forse è il colpevole?

+0

Quale versione di voi scikit-learn utilizzando @OAK – Farseer

+0

@Farseer versione 0,17?. Ho letto che c'era un bug in una versione precedente, non sono sicuro che ci sia anche in questo. – OAK

+1

Questo avviso indica che la precisione e, conseguentemente, il punteggio f1, non sono definiti per alcuni campioni il cui tp + fp è zero e risulta in 0/0 quando si calcola la precisione per quel campione. Poiché il punteggio f1 è una funzione di precisione, è anche indefinito ed entrambi sono impostati su 0.0 dalla libreria. – aadel

risposta

1

Come Aadel ha commentato, quando non punti dati sono classificati come positivi, precisione divide per zero come è definito come TP/(TP + FP) (cioè, veri positivi/veri e falsi positivi). La libreria imposta quindi la precisione su 0, ma emette un avviso poiché in realtà il valore non è definito. F1 dipende dalla precisione e quindi non è definito neanche.

Una volta che siete consapevoli di questo, è possibile scegliere di disattivare l'avviso con:

import warnings 
import sklearn.exceptions 
warnings.filterwarnings("ignore", category=sklearn.exceptions.UndefinedMetricWarning)