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ę.
Author: desertnaut, 2016-06-24

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,
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...

 82
Author: desertnaut,
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.

Możesz zobaczyć dostępne metryki regresji tutaj

 7
Author: Amey Yadav,
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]
 5
Author: MLKing,
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ć!

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

 0
Author: Sohil Grandhi,
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)
 -1
Author: Het Thummar,
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.

 -2
Author: Sreenath Nukala,
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