2016-02-05 18 views
5

Pracuję na binarnym modelu klasyfikacji, klasyfikator jest naiwny bayes. Mam prawie zrównoważony zestaw danych jednak pojawia się następujący komunikat o błędzie, gdy przewidują:Scikit learn Komunikat o błędzie "Precyzja i F-score są źle zdefiniowane i są ustawione na 0.0 w etykietach"

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) 

Używam gridsearch z CV k-krotnie 10. zestawu testowego i przewidywania zawierać zarówno zajęcia, więc nie mam zrozumieć wiadomość. Pracuję nad tym samym zbiorem datasetów, pociągu/testu, cv i losowego materiału siewnego dla 6 innych modeli, a te działają idealnie. Dane są przetwarzane zewnętrznie w ramkę danych, losowo, a materiał siewny jest ustalony. Następnie model klasyfikacji naiwnych bayesów klasyfikuje plik na początku przed tym fragmentem kodu.

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

Byłem "zmuszony" przez Pythona do zmiany kształtu serii, może to jest winowajcą?

+0

Która wersja scikit-learn używasz @OAK – Farseer

+0

@Farseer wersji 0.17?. Czytałem, że był błąd w poprzedniej wersji, nie wiem, czy jest on również w tym. – OAK

+1

To ostrzeżenie oznacza, że ​​dokładność, aw konsekwencji wynik f1, są niezdefiniowane dla niektórych próbek, których tp + fp wynosi zero, co daje 0/0 podczas obliczania precyzji dla tej próbki. Ponieważ punktacja f1 jest funkcją precyzji, jest również niezdefiniowana i obie są ustawione na 0.0 przez bibliotekę. – aadel

Odpowiedz

1

jako aadel komentuje, gdy nie ma punktów danych są klasyfikowane jako pozytywne, precyzja dzieli przez zero, jak to jest zdefiniowane jako TP/(TP + FP) (to znaczy, prawdziwie dodatnich/prawdziwie i fałszywie dodatnich). Biblioteka ustawia precyzję na 0, ale wyświetla ostrzeżenie, ponieważ faktycznie wartość jest niezdefiniowana. F1 zależy od precyzji i dlatego też nie jest zdefiniowany.

Gdy jesteś świadomy tego, można wybrać, aby wyłączyć ostrzeżenia z:

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