5

Próbuję przewidzieć zestaw etykiet przy użyciu Logistic Regression from SciKit. Moje dane są naprawdę niezrównoważone (jest o wiele więcej etykiet "0" niż "1"), więc muszę użyć F1 score metric podczas krzyżowania. krok weryfikacji do "zrównoważenia" wyniku.Scikit F-score błąd metryczny

[Input] 
X_training, y_training, X_test, y_test = generate_datasets(df_X, df_y, 0.6) 
logistic = LogisticRegressionCV(
    Cs=50, 
    cv=4, 
    penalty='l2', 
    fit_intercept=True, 
    scoring='f1' 
) 
logistic.fit(X_training, y_training) 
print('Predicted: %s' % str(logistic.predict(X_test))) 
print('F1-score: %f'% f1_score(y_test, logistic.predict(X_test))) 
print('Accuracy score: %f'% logistic.score(X_test, y_test)) 

[Output] 
>> Predicted: [0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0] 
>> Actual: [0 0 0 1 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 0 1 1] 
>> F1-score: 0.285714 
>> Accuracy score: 0.782609 
>> C:\Anaconda3\lib\site-packages\sklearn\metrics\classification.py:958: 
    UndefinedMetricWarning: 
    F-score is ill-defined and being set to 0.0 due to no predicted samples. 

Na pewno wiem, że problem jest związany z moim zbiorem danych: jest za mały (jest tylko próbką prawdziwego). Czy ktokolwiek może wyjaśnić znaczenie ostrzeżenia "UndefinedMetricWarning", które widzę? Co się właściwie dzieje za zasłonami?

+6

Na marginesie, jeśli twój zestaw danych jest NAPRAWDĘ niezbalansowany (powiedzmy 100000 "0" i tylko 20 "1"), możesz odejść od zadania klasyfikacji do podejścia do wykrywania anomalii. Dla skrajnie wypaczonych przypadków będzie działać znacznie lepiej. Szczegóły: http://scikit-learn.org/stable/modules/outlier_detection.html –

+1

Brak równowagi wynosi około 70-30%, więc myślę, że nadal nadaje się do stosowania klasycznych klasyfikatorów. Jednak twój komentarz może być niezwykle cenny dla osób borykających się z naprawdę wypaczonymi zestawami danych, więc dziękuję za podpowiedź i tak :) – David

Odpowiedz

4

Wygląda na to, że jest to znany błąd here, który został naprawiony, prawdopodobnie powinieneś wypróbować update sklearn.

+3

Mam ten komunikat o błędzie z scikit-learn 0.17. Wszelkie aktualizacje w tej sprawie? Moje zajęcia są prawie zrównoważone. – OAK

0

Czy ktokolwiek może wyjaśnić znaczenie ostrzeżenia "Nieokreślone Ostrzeżenie", które widzę? Co się właściwie dzieje za zasłonami?

ta jest dobrze opisana w https://stackoverflow.com/a/34758800/1587329:

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/classification.py

F1 = 2 * (dokładność * przywołanie)/(dokładność + przywołanie)

dokładność = TP/(TP + FP), jak właśnie powiedziałeś, jeśli predykator nie przewiduje w ogóle klasy pozytywnej - precyzja jest 0.

Przypomnijmy = TP/(TP + FN), w przypadku, gdy predyktorem nie przewiduje pozytywny klasę - TP jest 0 - wycofanie 0.

Więc teraz jesteś podzielenie 0/0.

Aby rozwiązać ten problem, wagi (jest to łatwe do klasyfikatora do (prawie) zawsze przewidzieć częstsze klasy), można użyć class_weight="balanced":

logistic = LogisticRegressionCV(
    Cs=50, 
    cv=4, 
    penalty='l2', 
    fit_intercept=True, 
    scoring='f1', 
    class_weight="balanced" 
) 

LogisticRegressionCV mówi:

Tryb "zrównoważony" wykorzystuje wartości y, aby automatycznie dopasować wagi odwrotnie proporcjonalne do częstotliwości klasy w danych wejściowych jako n_samples/(n_classes * np.bincount(y)).