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