Accuracy Score ValueError: Can ' t Handle of mix of binary and continuous target
Używam linear_model.LinearRegression
z scikit-learn jako modelu predykcyjnego. To działa i jest idealne. Mam problem, aby ocenić przewidywane wyniki za pomocą metryki accuracy_score
.
To są moje prawdziwe Dane:
array([1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0])
Moje przewidywane dane:
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])
Mój kod:
accuracy_score(y_true, y_pred, normalize=False)
Komunikat o błędzie:
Pomocy ? Dziękuję.ValueError: nie radzi sobie z mieszaniem binarnych i ciągłych celów
8 answers
EDIT (po komentarzu): poniżej rozwiążemy problem z kodowaniem, ale jest wysoce nie zaleca się stosowania tego podejścia, ponieważ model regresji liniowej jest bardzo słabym klasyfikatorem, który najprawdopodobniej nie oddziela klas poprawnie.
Przeczytaj dobrze napisaną odpowiedź poniżej autorstwa @desertnaut, wyjaśniając, dlaczego ten błąd jest wskazówką czegoś złego w podejściu do uczenia maszynowego, a nie czymś, co musisz "naprawić".
accuracy_score(y_true, y_pred.round(), normalize=False)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-02 19:18:40
Pomimo mnóstwa błędnych odpowiedzi, które próbują obejść błąd poprzez numeryczne manipulowanie prognozami, główną przyczyną twojego błędu jest problem teoretyczny , a nie obliczeniowy: próbujesz użyć klasyfikacji metryki (dokładności) w modelu regresji (tj. predykcji numerycznej) (LinearRegression
), która jestbez znaczenia .
Podobnie jak większość wskaźników wydajności, dokładność porównuje jabłka do jabłek (tj. prawdziwe etykiety 0/1 z jeśli więc poprosisz funkcję o porównanie binarnych etykiet true (jabłek) z przewidywaniami ciągłymi (pomarańczy), otrzymasz oczekiwany błąd, w którym wiadomość mówi dokładnie, na czym polega problem z z punktu widzenia :
Classification metrics can't handle a mix of binary and continuous target
Pomimo tego, że wiadomość nie mówi bezpośrednio, że próbujesz obliczyć metrykę, która jest nieprawidłowa dla Twojego problemu( i nie powinniśmy się spodziewać, że posunie się to tak daleko), z pewnością jest to dobra rzecz, że scikit-learn przynajmniej daje bezpośrednie i wyraźne ostrzeżenie, że próbujesz coś złego; niekoniecznie jest to w przypadku innych frameworków-zobacz na przykład zachowanie Keras w bardzo podobnej sytuacji, gdzie nie dostajesz żadnego ostrzeżenia, a jeden kończy się narzekaniem na niską "dokładność" w ustawieniu regresji...
Jestem bardzo zaskoczony wszystkimi innymi odpowiedziami tutaj (w tym zaakceptowaną i wysoko ocenioną) skutecznie sugerującymi manipulowanie przewidywania, aby po prostu pozbyć się błędu; to prawda, że gdy skończymy z zestawem liczb, możemy z pewnością zacząć mieszać się z nimi na różne sposoby (zaokrąglanie, próg itp.), aby nasz Kod się zachowywał, ale to oczywiście nie oznacza, że nasze manipulacje numeryczne są znaczące w konkretnym kontekście problemu ML, który staramy się rozwiązać.
Więc, podsumowując: problem polega na tym, że stosujesz metrykę (dokładność), która jest nieodpowiednie dla Twojego modelu (LinearRegression
): jeśli jesteś w ustawieniu klasyfikacji, powinieneś zmienić swój model (np. użyj LogisticRegression
); Jeśli jesteś w ustawieniu regresji (np. predykcji numerycznej), powinieneś zmienić metrykę. Sprawdź listę wskaźników dostępnych w scikit-learn, gdzie możesz potwierdzić, że dokładność jest używana tylko w klasyfikacji.
Porównaj również sytuację z ostatnim więc pytaniem, gdzie OP próbuje uzyskać dokładność lista modeli:
models = []
models.append(('SVM', svm.SVC()))
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
#models.append(('SGDRegressor', linear_model.SGDRegressor())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('BayesianRidge', linear_model.BayesianRidge())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('LassoLars', linear_model.LassoLars())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('ARDRegression', linear_model.ARDRegression())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('PassiveAggressiveRegressor', linear_model.PassiveAggressiveRegressor())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('TheilSenRegressor', linear_model.TheilSenRegressor())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
#models.append(('LinearRegression', linear_model.LinearRegression())) #ValueError: Classification metrics can't handle a mix of binary and continuous targets
Gdzie pierwsze 6 modeli Działa OK, podczas gdy wszystkie pozostałe (skomentowane) dają ten sam błąd. Do tej pory powinieneś być w stanie przekonać się, że wszystkie skomentowane modele są regresją (a nie klasyfikacją), stąd uzasadniony błąd.
Ostatnia ważna uwaga: może wydawać się uzasadnione, aby ktoś twierdził:
OK, ale chcę użyć regresji liniowej i wtedy po prostu okrągłe / progowe wyjścia, skutecznie traktując przewidywania jako "prawdopodobieństwa", a tym samym przekształcenie modelu w klasyfikator
W rzeczywistości zostało to już zasugerowane w kilku innych odpowiedziach tutaj, w sposób dorozumiany lub nie; ponownie, jest to podejście nieprawidłowe (a fakt, że masz negatywne przewidywania, powinien już ostrzec cię, że nie mogą być interpretowane jako prawdopodobieństwo). Andrew Ng, w swoim popularnym kursie Uczenia Maszynowego w Coursera, wyjaśnia, dlaczego jest to zły pomysł-zobacz jego [46]}Wykład 6.1 - Regresja logistyczna / Klasyfikacja na Youtube (Wyjaśnienie zaczyna się od ~ 3:00), a także sekcja 4.2 dlaczego nie regresja liniowa [klasyfikacja]? z (wysoce zalecanego i swobodnie dostępnego) podręcznika An Introduction to Statistical Learning autorstwa Hastie, Tibshirani i współpracowników...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-31 16:52:36
Accuracy_score jest metryką klasyfikacji, nie można jej użyć do problemu regresji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-12 19:53:21
Metoda sklearn.metrics.accuracy_score(y_true, y_pred)
definiuje y_pred as
:
Y_pred : 1D array-like, or label indicator array / sparse matrix. przewidywane etykiety, zwrócony przez klasyfikatora.
Co oznacza, że y_pred
musi być tablicą 1 lub 0 (etykiety predykowane). Nie powinny być prawdopodobieństwem.
Przewidywane etykiety (1 i 0) i/lub przewidywane probability mogą być generowane przy użyciu metod modelu LinearRegression()
predict()
i predict_proba()
odpowiednio.
1. Generuj przewidywane etykiety:
LR = linear_model.LinearRegression()
y_preds=LR.predict(X_test)
print(y_preds)
Wyjście:
[1 1 0 1]
y_preds
można teraz użyć metody accuracy_score()
: accuracy_score(y_true, y_pred)
2. Generowanie prawdopodobieństwa dla etykiet:
Niektóre metryki, takie jak 'precision_recall_curve(y_true, probas_pred)' wymagają prawdopodobieństw, które można wygenerować w następujący sposób:
LR = linear_model.LinearRegression()
y_preds=LR.predict_proba(X_test)
print(y_preds)
Wyjście:
[0.87812372 0.77490434 0.30319547 0.84999743]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-26 05:02:13
Problem polega na tym, że prawdziwe y jest binarne (zera i jedynki), podczas gdy twoje przewidywania nie są. Prawdopodobnie generowałeś Prawdopodobieństwo, a nie przewidywania, stąd wynik :) Spróbuj zamiast tego wygenerować członkostwo w klasie, a to powinno zadziałać!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-07 16:21:54
Miałem do czynienia z tym samym problemem.Dtypy y_test i y_pred były różne. Upewnij się, że dtypy są takie same dla obu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-22 06:15:33
Po prostu użyj
y_pred = (y_pred > 0.5)
accuracy_score(y_true, y_pred, normalize=False)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-08 13:06:56
Błąd wynika z różnicy typów danych y_pred i y_true. y_true może być dataframe, a y_pred to arraylist. Jeśli przekonwertujesz oba na tablice, problem zostanie rozwiązany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-27 18:06:07