Skip to content Skip to sidebar Skip to footer

Alueerror Classification Metrics Can t Handle a Mix of Continuous and Binary Targets

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:

ValueError: nie radzi sobie z mieszaniem binarnych i ciągłych celów

Pomocy ? Dziękuję.

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)                          

 46

Author: natbusa, 2019-02-02 20: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...

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]                          

 5

Author: MLKing, 2020-03-26 06: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ć!

 3

Author: JohnnyQ, 2017-03-07 17: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. Dtypy y_test i y_pred były różne

Po prostu użyj

            y_pred = (y_pred > 0.5) accuracy_score(y_true, y_pred, normalize=False)                      

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.

cambronevelve.blogspot.com

Source: https://doraprojects.net/questions/38015181/accuracy-score-valueerror-cant-handle-mix-of-binary-and-continuous-target

Post a Comment for "Alueerror Classification Metrics Can t Handle a Mix of Continuous and Binary Targets"