Jak obliczyć precyzję / przywołanie dla klasyfikacji wieloklasowej-wielowarstwowej?

72

Zastanawiam się, jak obliczyć dokładność i przywołać miary dla wieloklasowej klasyfikacji wielopłaszczyznowej, tj. Klasyfikacji, w której występują więcej niż dwie etykiety i gdzie każde wystąpienie może mieć wiele etykiet?

Vam
źródło
1
część z wieloma etykietami sprawia, że ​​jest znacznie trudniej i ja też jestem tym zainteresowany. Myślę, że nie dotyczy to problemów związanych z wieloma etykietami, ale wcale mi nie ufasz.
user798719,
1
W rzeczywistości wszystkie problemy związane z wieloma etykietami są wieloklasowe, więc możesz na przykład użyć pakietu utiml w języku R lub Mulan w Javie.
Adriano Rivolli,

Odpowiedzi:

19

Innym popularnym narzędziem do pomiaru wydajności klasyfikatora jest ROC / AUC ; ten również ma rozszerzenie dla wielu klas / wielu etykiet: patrz [Hand 2001]

[Hand 2001]: Proste uogólnienie obszaru pod krzywą ROC do problemów klasyfikacji wielu klas

oDDsKooL
źródło
Jest popularny, ale może być wadliwy. Nie do końca temu ufam. stats.stackexchange.com/questions/93901/…
EngrStudent
3
Nigdy nie zmieniaj przepełnienia stosu! Facet zadaje problem, większość głosujących odpowiedzi w rzeczywistości nie odpowiada na jego pytanie, ale wskazuje inne narzędzie / bibliotekę, które byłoby lepsze
ragvri
Tak, w jaki sposób ta odpowiedź może mieć +20? Nie zawiera nawet słów precyzja i przypomnienie.
Simon Dirmeier
jeśli dobrze się zastanowicie, zdacie sobie sprawę, że precyzja i przywołanie są w rzeczywistości uchwycone przez AUC.
oDDsKooL
16

Oto kilka dyskusji na temat wątku forum Oczywiście na temat macierzy pomyłek i wieloklasowego pomiaru precyzji / wycofania.

Podstawową ideą jest obliczenie całej precyzji i przywołanie wszystkich klas, a następnie uśrednienie ich w celu uzyskania pojedynczego pomiaru liczby rzeczywistej.

Macierz nieporozumień ułatwia obliczenie precyzji i przywołanie klasy.

Poniżej znajduje się podstawowe wyjaśnienie dotyczące macierzy pomyłek, skopiowane z tego wątku:

Macierz dezorientacji jest sposobem klasyfikowania prawdziwych pozytywów, prawdziwych negatywów, fałszywych alarmów i fałszywych negatywów, gdy istnieją więcej niż 2 klasy. Służy do obliczania precyzji i przywoływania, a tym samym f1-score dla problemów wielu klas.

Rzeczywiste wartości są reprezentowane przez kolumny. Przewidywane wartości są reprezentowane przez rzędy.

Przykłady:

10 przykładów szkolenia, które w rzeczywistości są 8, są niepoprawnie sklasyfikowane (przewidywane) jako 5
13 przykładów szkolenia, które są właściwie 4, są niepoprawnie sklasyfikowane jako 9

Macierz pomieszania

cm =
     0 1 2 3 4 5 6 7 8 9 10
     1 298 2 1 0 1 1 3 1 1 0
     2 0 293 7 4 1 0 5 2 0 0
     3 1 3 263 0 8 0 0 3 0 2
     4 1 5 0 261 4 0 3 2 0 1
     5 0 0 10 0 254 3 0 10 2 1
     6 0 4 1 1 4 300 0 1 0 0
     7 1 3 2 0 0 0 264 0 7 1
     8 3 5 3 1 7 1 0 289 1 0
     9 0 1 3 13 1 0 11 1 289 0
    10 0 6 0 1 6 1 2 1 4 304

Dla klasy x:

  • Prawdziwie dodatni: pozycja ukośna, cm (x, x).

  • Fałszywie dodatni: suma kolumny x (bez głównej przekątnej), suma (cm (:, x)) - cm (x, x).

  • Fałszywy ujemny: suma rzędu x (bez głównej przekątnej), suma (cm (x, :), 2) -cm (x, x).

Możesz obliczyć precyzję, wycofanie i wynik F1 według formuły kursu.

Uśrednianie dla wszystkich klas (z wagą lub bez) daje wartości dla całego modelu.

Bob Yang
źródło
2
Masz odwrócone topory. Na podstawie tego, co napisałeś, twoje CM powinno zostać transponowane.
Spacey
@Tarantula Dlaczego tak uważasz? Myślę, że ma rację.
shahensha
@shahensha Wypróbuj jedną kolumnę, to źle.
Spacey
1
Link do wątku Coursera jest zerwany
shark8me 26.04.17
8
nie wierzę, że ta odpowiedź rozwiązuje problem wielopłaszczyznowego. dotyczy problemów z wieloma klasami. Jakie jest pojęcie fałszywie dodatniego lub fałszywie ujemnego w problemach z wieloma etykietami?
user798719,
13

W przypadku klasyfikacji obejmującej wiele marek masz dwie możliwości. Najpierw rozważ poniższe.

  • n
  • Yiith
  • xiith
  • h(xi)ith

Na podstawie przykładu

Metryki obliczane są w sposób dla poszczególnych punktów danych. Dla każdej przewidywanej etykiety obliczany jest tylko jej wynik, a następnie wyniki te są agregowane we wszystkich punktach danych.

  • 1ni=1n|Yih(xi)||h(xi)|
  • 1ni=1n|Yih(xi)||Yi|

Istnieją również inne wskaźniki.

Na podstawie etykiet

Tutaj rzeczy są zrobione pod względem etykiet. Dla każdej etykiety obliczane są dane (np. Precyzja, przywołanie), a następnie te agregowane w oparciu o etykiety. Dlatego w tym przypadku obliczasz dokładność / przywołanie dla każdej etykiety w całym zestawie danych, podobnie jak w przypadku klasyfikacji binarnej (ponieważ każda etykieta ma przypisanie binarne), a następnie agregujesz ją.

Najprostszym sposobem jest przedstawienie ogólnej formy.

To tylko rozszerzenie standardowego ekwiwalentu wielu klas.

  • 1qj=1qB(TPj,FPj,TNj,FNj)

  • B(j=1qTPj,j=1qFPj,j=1qTNj,j=1qFNj)

TPj,FPj,TNj,FNjjth

B

Możesz być zainteresowany, aby zajrzeć do kodu dla metryk mult-label tutaj , który jest częścią pakietu mldr w R . Być może zainteresuje Cię także biblioteka wielu etykiet Java MULAN .

Jest to fajny artykuł na temat różnych wskaźników: Przegląd algorytmów uczenia się wielu marek

phoxis
źródło
Byłoby dobrze, gdybyś mógł podać referencje dotyczące autentyczności metryk, które napisałeś, jak niektóre odniesienia z Wikipedii. Wspomniane przez Ciebie odniesienia to część kodująca metryki lub artykuł badawczy.
hacker315
2
Artykuł przeglądowy jest już powiązany na końcu odpowiedzi (A Review on Multi-Label Learning Algorytms) ieeexplore.ieee.org/document/6471714 . Są to dobrze znane wskaźniki w literaturze, na podstawie których wykonywane są wdrożenia. Nie jestem pewien, jak mogę wykazać autentyczność.
phoxis
8

Nie wiem o części z wieloma etykietami, ale w klasyfikacji mutli-class te linki pomogą ci

Ten link wyjaśnia, jak zbudować macierz nieporozumień, której można użyć do obliczenia dokładności i przywołania dla każdej kategorii

Link ten wyjaśnia, jak obliczyć miary mikro-f1 i makro-f1 w celu oceny klasyfikatora jako całości.

mam nadzieję, że okaże się to przydatne.

Ahmed Kotb
źródło
4
Kluczową kwestią jest: istnieje wiele możliwych prawidłowych sposobów obliczania tych wskaźników (np. Micro-F1 vs. makro-F1), ponieważ istnieje wiele sposobów na określenie, co jest poprawne. To zależy od twojego wniosku i kryteriów ważności.
Jack Tanner
Ahmed: Dzięki za linki! @JackTanner Czy może miałbyś do tego odniesienie (w przypadku klasyfikacji wielu marek i wielu marek)?
Vam
1
@MaVe, przepraszam, brak linków. To tylko z osobistego doświadczenia. Dostaniesz się tam po prostu myśląc o tym, co stanowi, powiedzmy, prawdziwy pozytyw i fałszywy pozytyw dla twoich celów.
Jack Tanner
4
Pierwszy link umarł
Nikana Reklawyks
1

ten link pomógł mi .. https://www.youtube.com/watch?v=HBi-P5j0Kec Mam nadzieję, że to również pomoże

powiedz rozkład jak poniżej

    A   B   C   D
A   100 80  10  10
B   0    9   0   1
C   0    1   8   1
D   0    1   0   9

precyzja dla A byłaby

P (A) = 100/100 + 0 + 0 + 0 = 100

P (B) = 9/9 + 80 + 1 + 1 = 9/91 psst ... zasadniczo bierze prawdziwy wynik dodatni klasy i dzieli przez dane kolumny między wierszami

przypominam, że byłoby

R (A) = 100 / 100+ 80 + 10 + 10 = 0,5

R (B) = 9 / 9+ 0 + 0 + 1 = 0,9

psst ... zasadniczo bierze prawdziwy pozytyw klasy i dzieli przez dane wiersza między kolumnami

po uzyskaniu wszystkich wartości weź średnią makro

śr. (P) = P (A) + P (B) + P (C) + P (D) / 4

avg (R) = R (A) + R (B) + R (C) + R (D) / 4

F1 = 2 * średnia (P) * średnia (R) / średnia (P) + średnia (R)

użytkownik1906450
źródło
0

Sprawdź te slajdy z cs205.org na Harvard . Po przejściu do sekcji Miary błędów omawia się precyzję i przywołanie w ustawieniach wielu klas (np. Jeden na wszystkich lub jeden na jednym) i macierze pomieszania. Macierze zamieszania są tym, czego naprawdę chcesz.

Do Twojej wiadomości, w pakiecie oprogramowania Python scikits.learn istnieją wbudowane metody automatycznego obliczania takich rzeczy, jak macierz nieporozumień na podstawie klasyfikatorów przeszkolonych w zakresie danych wieloklasowych. Prawdopodobnie może również bezpośrednio obliczyć dla ciebie wykresy dokładnego przywołania. Warte zobaczenia.

Ely
źródło
4
Niestety link do slajdów jest martwy i mogłem znaleźć slajdy gdzie indziej.
f3lix,
Uzupełnią się, gdy dotrą do tego wykładu w tegorocznym kursie. Gdybym mógł skopiować plik PDF do stałej lokalizacji linku, zrobiłbym to, ale nie mogę, więc okresowe łamanie jest nieuniknione i nie będzie innego miejsca na znalezienie notatek, są one specyficzne dla tego kursu.
ely
sklearn nie obsługuje wielu etykiet dla macierzy pomieszania github.com/scikit-learn/scikit-learn/issues/3452
Franck Dernoncourt
0

Dokładnie tak samo, jak zrobiłbyś to w przypadku ogólnym, z zestawami:

http://en.wikipedia.org/wiki/F1_score

http://en.wikipedia.org/wiki/Precision_and_recall

Oto proste funkcje Pythona, które dokładnie to robią:

def precision(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    len1 = len(y_pred)
    if len1 == 0:
        return 0
    else:
        return len(i) / len1


def recall(y_true, y_pred):
    i = set(y_true).intersection(y_pred)
    return len(i) / len(y_true)


def f1(y_true, y_pred):
    p = precision(y_true, y_pred)
    r = recall(y_true, y_pred)
    if p + r == 0:
        return 0
    else:
        return 2 * (p * r) / (p + r)


if __name__ == '__main__':
    print(f1(['A', 'B', 'C'], ['A', 'B']))
Adel Nizamutdinov
źródło