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?
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 –
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